Android生成二维码图片及在图片上添加文字并保存

近期接到一个需求,将一串文字生成二维码,并在点击图片时将二维码图片保存到相册。话不多说,上代码

/**
 * Created by $ Ping.sir on 2018/8/14.
 * 二维码工具类
 */

public class QRCodeUtil {
    private static final String CHARSET = "UTF-8";
    private static final String FORMAT_NAME = "JPG";
    // 二维码尺寸
    private static final int QRCODE_SIZE = 314;
    // LOGO宽度
    private static final int WIDTH = 60;
    // LOGO高度
    private static final int HEIGHT = 60;

    /**
     * user: Rex
     * date: 2016年12月29日  上午12:31:29
     * @param content 二维码内容
     * @return 返回二维码图片
     * @throws WriterException
     * @throws IOException
     * BufferedImage
     */
    public static Bitmap createImage(String content) {
        Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
        hints.put(EncodeHintType.MARGIN, 2);
        BitMatrix bitMatrix = null;
        Bitmap image = null;
        try {
            bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints);
            int width = bitMatrix.getWidth();
            int height = bitMatrix.getHeight();
            int[] pixels = new int[width*height];
            for (int x = 0; x < width; x++) {
                for (int y = 0; y < height; y++) {
                    if (bitMatrix.get(y,x)){
                        pixels[y*width +x] = 0xff000000;
                    }else {
                        pixels[y*width + x] = 0xffffffff;
                    }
//                    image.setPixel(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
                }
            }
            image = Bitmap.createBitmap(pixels,width,height,Bitmap.Config.ARGB_8888);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 插入图片
//        QRCodeUtil.insertImage(image, logoImgPath, needCompress);
        return image;
    }

    /**
     * 生成图片  加上title的图片
     * @param content
     * @param title
     * @return
     */
    public static Bitmap createImage(String content,String title) {
        int picWidth = 720;//生成图片的宽度
        int picHeight = 765;//生成图片的高度
        int titleTextSize = 30;
        int contentTextSize = 22;
        int textColor = Color.BLACK;
        int qrWidth = 366;
        int qrHeight = 366;
        int paddingTop = 152;
        int paddingMiddle = 40;
        int paddingBottom = 24;

        //最终生成的图片
        Bitmap result = Bitmap.createBitmap(picWidth,picHeight,Bitmap.Config.ARGB_8888);

        Paint paint = new Paint();
        paint.setColor(Color.WHITE);
        Canvas canvas = new Canvas(result);

        //先画一整块白色矩形块
        canvas.drawRect(0,0,picWidth,picHeight,paint);

        //画title文字
        Rect bounds = new Rect();
        paint.setColor(textColor);
        paint.setTextSize(titleTextSize);
        //获取文字的字宽高,以便将文字与图片中心对齐
        paint.getTextBounds(title,0,title.length(),bounds);
        canvas.drawText(title,picWidth/2-bounds.width()/2,paddingTop+bounds.height()/2,paint);

        //画白色矩形块
        int qrTop = paddingTop+titleTextSize+paddingMiddle;//二维码的顶部高度

        //画二维码
        Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
        hints.put(EncodeHintType.MARGIN, 5);
        BitMatrix bitMatrix;
        Bitmap image = null;
        try {
            bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, qrWidth, qrHeight, hints);
            int width = bitMatrix.getWidth();
            int height = bitMatrix.getHeight();
            image = Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888);
            for (int x = 0; x < width; x++) {
                for (int y = 0; y < height; y++) {
                    image.setPixel(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        paint.setColor(Color.BLACK);
        canvas.drawBitmap(image,(picWidth-qrWidth)/2,qrTop,paint);

        //画文字
        paint.setColor(Color.BLACK);
        paint.setTextSize(contentTextSize);
        int lineTextCount = (int)((picWidth-50)/contentTextSize);
        int line = (int)(Math.ceil(Double.valueOf(content.length())/Double.valueOf(lineTextCount)));
        int textTop = qrTop+qrHeight+paddingBottom;//地址的顶部高度

        for (int i = 0 ; i < line ; i++){
            String s;
            if (i == line-1){
                s = content.substring(i*lineTextCount,content.length());
            }else {
                s = content.substring(i * lineTextCount,(i+1)*lineTextCount);
            }
            paint.getTextBounds(content,0,s.length(),bounds);

            canvas.drawText(s,picWidth/2-bounds.width()/2,textTop+i*contentTextSize+i*5+bounds.height()/2,paint);
        }

        canvas.save(Canvas.ALL_SAVE_FLAG);
        canvas.restore();

        return result;
    }

}

 

保存图片:

public void saveBitmapFromView(ImageView view) {
//        view.buildDrawingCache(true);
//        view.buildDrawingCache();
//        Bitmap bmp = Bitmap.createBitmap(view.getDrawingCache());
//        Bitmap bitmap = drawBitmap(bmp);
//        view.setDrawingCacheEnabled(false);
        Bitmap bmp = QRCodeUtil.createImage(coinCollectionAddress, ViewHelp.getInputString(mTitleTextView));
        DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA);
        saveBitmap(bmp, format.format(new Date()) + ".JPEG");
    }

其中:

coinCollectionAddress为二维码地址

效果图如下:

 

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在 Android生成二维码图片并打印,你可以使用以下步骤: 1. 添加依赖项:在 build.gradle 文件中添加以下依赖项: ``` implementation 'com.google.zxing:core:3.4.0' ``` 2. 生成二维码:使用以下代码生成二维码图片 ```java String content = "your_content_here"; int width = 500; int height = 500; QRCodeWriter writer = new QRCodeWriter(); try { BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height); int bitmapWidth = bitMatrix.getWidth(); int bitmapHeight = bitMatrix.getHeight(); Bitmap bmp = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.RGB_565); for (int x = 0; x < bitmapWidth; x++) { for (int y = 0; y < bitmapHeight; y++) { bmp.setPixel(x, y, bitMatrix.get(x, y) ? Color.BLACK : Color.WHITE); } } // bmp 即为生成的二维码图片 } catch (WriterException e) { e.printStackTrace(); } ``` 3. 打印二维码:将生成的二维码图片通过打印机打印出来。你可以使用 Android 的打印机 API 来实现打印功能,或者使用第三方打印库。 示例代码: ```java // 获取打印服务 PrintManager printManager = (PrintManager) getSystemService(Context.PRINT_SERVICE); // 创建打印任务 PrintDocumentAdapter adapter = new PrintDocumentAdapter() { @Override public void onWrite(PageRange[] pages, ParcelFileDescriptor destination, CancellationSignal cancellationSignal, WriteResultCallback callback) { try { OutputStream out = new FileOutputStream(destination.getFileDescriptor()); bmp.compress(Bitmap.CompressFormat.PNG, 100, out); callback.onWriteFinished(new PageRange[]{PageRange.ALL_PAGES}); out.close(); } catch (IOException e) { e.printStackTrace(); } } @Override public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, CancellationSignal cancellationSignal, LayoutResultCallback callback, Bundle extras) { callback.onLayoutFinished(new PrintDocumentInfo.Builder("print_output.pdf").setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT).build(), true); } }; // 执行打印任务 String jobName = "二维码打印任务"; printManager.print(jobName, adapter, null); ``` 注意:以上代码仅供参考,实际使用中需要根据具体需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值