JAVA 生成一维码、讲多个图片合称为一个大图

来源:互联网 发布:windows 文件共享 编辑:程序博客网 时间:2024/06/05 10:24

近期做的一个项目,其中有一个批量生成一维码,然后将多个一维码放到一个图片输出的功能。自己做了一个小Demo,在这里记录一下。

生成一维码的功能使用的是barcode,一下是代码,代码很简单,就一下帖处理,不在每块做详细描述了:

import com.google.common.collect.Lists;import org.krysalis.barcode4j.HumanReadablePlacement;import org.krysalis.barcode4j.impl.code39.Code39Bean;import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;import org.krysalis.barcode4j.tools.UnitConv;import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;import java.io.*;import java.util.List;/** * 在这里编写类的功能描述 * * @author yangbin * @created 2017/6/20 */public class BarCodeTest {    static String FILE_PATH = "/tmp/barcode/";    static int clowns = 5;    /**     * 行间距     */    static int LineSpacing = 20;    public static void main(String[] args) {        int code = 1234567890;        List<String> barCodeFileNames = Lists.newArrayList();        //需要生成的一维码code        for(int i=0;i<10;i++) {            String barCode = (code + i) + "";            barCodeFileNames.add(generateImg(barCode));        }        System.out.println(barCodeFileNames);        //讲多个一维码合成到一个图片上        boolean result = mergeImg(barCodeFileNames, FILE_PATH+Thread.currentThread().getName() + System.currentTimeMillis() + ".png");        System.out.println(result);    }    /**     * 合并图片     * @param barCodeFileNames     * @param imgName     * @return     */    public static boolean mergeImg(List<String> barCodeFileNames,String imgName) {        int size = barCodeFileNames.size();        File[] barCodeFiles = new File[size];        BufferedImage[] bufferedImages = new BufferedImage[size];        for(int i = 0;i<size;i++) {            try {                barCodeFiles[i] = new File(barCodeFileNames.get(i));                bufferedImages[i] = ImageIO.read(barCodeFiles[i]);            } catch (IOException e) {                e.printStackTrace();                return false;            }        }        int singleImgWidth = bufferedImages[0].getWidth();        int singleImgHeight = bufferedImages[0].getHeight();        int rows = size % clowns == 0 ? size / clowns : (size / clowns + 1);        int combinImgWidth = singleImgWidth * clowns ;        int combinImgHeight = singleImgHeight * rows + LineSpacing * rows;        try {            //合成图            BufferedImage combinedImg = new BufferedImage(combinImgWidth, combinImgHeight, BufferedImage.TYPE_INT_RGB);            Graphics2D g2 = (Graphics2D) combinedImg.getGraphics();            //设置背景色为白色,默认为黑色            g2.setBackground(Color.WHITE);            g2.clearRect(0, 0, combinImgWidth, combinImgHeight);            for(int i = 0;i<size;i++) {                int startX = (i % clowns) * singleImgWidth;                int startY = (i / clowns) * (singleImgHeight + LineSpacing);                int[] imageRGB = new int[singleImgWidth * singleImgHeight];                imageRGB = bufferedImages[i].getRGB(0, 0, singleImgWidth, singleImgHeight,imageRGB, 0, singleImgWidth);                //讲单个图片的RGB值写入合成图中                combinedImg.setRGB(startX, startY, singleImgWidth, singleImgHeight, imageRGB, 0, singleImgWidth);            }            File outFile = new File(imgName);            ImageIO.write(combinedImg, "png", outFile);        } catch (IOException e) {            e.printStackTrace();            return false;        }        //清理单个图片        for(int i = 0;i<size;i++) {            barCodeFiles[i].delete();        }        return true;    }    /**     * 生成二维码     * @param barcode     * @return     */    public static String generateImg(String barcode) {        OutputStream out = null;        String fileName = null;        try {            Code39Bean bean = new Code39Bean();            final int dpi = 150;            bean.setModuleWidth(UnitConv.in2mm(1.0f / dpi));            // 宽度            bean.setWideFactor(4);            // 高度            bean.setHeight(10);            // 条形码左右两边是否留空白,默认为true            bean.doQuietZone(true);            // 设置条码号字体的大小            bean.setFontSize(3);            // 设置条码号显示的位置            bean.setMsgPosition(HumanReadablePlacement.HRP_BOTTOM);            // 获取文件的保存位置            fileName = FILE_PATH + barcode + ".png";            File outputFile = new File(fileName);            out = new FileOutputStream(outputFile);            BitmapCanvasProvider canvas = new BitmapCanvasProvider(out, "image/png", dpi,                    BufferedImage.TYPE_BYTE_BINARY, false, 0);            bean.generateBarcode(canvas, barcode);            canvas.finish();        } catch (FileNotFoundException e) {            e.printStackTrace();            return null;        } catch (IOException e) {            e.printStackTrace();            return null;        } finally {            try {                out.flush();                out.close();            } catch (IOException e) {                e.printStackTrace();                return null;            }        }        return fileName;    }}
阅读全文
1 0
原创粉丝点击