【源码】二维码透明底和去除白边功能

2024-04-28 21:58

本文主要是介绍【源码】二维码透明底和去除白边功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

布局(activity.xml)、权限(AndroidManifest.xml)和 MainActivity.java(基本一致) 跟先前的源码一致这里就不重复了,需要可以参考先前的。

飞机票:【源码】二维码生成及美化

MakeQRCodeUtil.java

package com.showimage.start.showimage;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;import java.util.HashMap;/*** Created on 2016/2/24.* 生成二维码的工具类*/
public class MakeQRCodeUtil {/*** 转换位图** @param matrix  原图* @param alpha 透明度 0 透明 1半透明 2不透明* @return*/private static Bitmap bitMatrix2Bitmap(BitMatrix matrix, int alpha) {int WIDTH = matrix.getWidth();int HEIGHT = matrix.getHeight();int[] pixels = new int[WIDTH * HEIGHT];for (int y = 0; y < WIDTH; y++) {for (int x = 0; x < HEIGHT; x++) {int color;switch (alpha){case 0:color = 0x00FFFFFF;break;case 1:color = 0x80FFFFFF;break;default:color = 0xFFFFFFFF;break;}if (matrix.get(x, y)) {// 有内容的部分,颜色设置为黑色,当然这里可以自己修改成喜欢的颜色color = 0xFF000000;}pixels[x + (y * WIDTH)] = color;}}Bitmap bitmap = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_8888);bitmap.setPixels(pixels, 0, WIDTH, 0, 0, WIDTH, HEIGHT);return bitmap;}/*** 设置透明度** @param alpha    透明度* @return Paint    画笔*/private static Paint setAlpha(int alpha) {// 建立Paint 物件Paint vPaint = new Paint();vPaint .setStyle( Paint.Style.STROKE );   //空心vPaint .setAlpha(alpha);   //0—255return vPaint;}/*** 设置透明度** @param alpha    透明度  1 不透明 0 半透明* @return Paint    画笔*/private static Paint selectAlpha(int alpha) {if(alpha == 0){return setAlpha(75);}else{return setAlpha(255);}}/*** 添加logo** @param src 原图* @param logo logo图* @return 效果图*/private static Bitmap addLogo(Bitmap src, Bitmap logo) {if (logo == null) {return src;}// 获取图片的宽高int srcWidth = src.getWidth();int srcHeight = src.getHeight();int logoWidth = logo.getWidth();int logoHeight = logo.getHeight();if (logoWidth == 0 || logoHeight == 0) {return src;}// logo大小为二维码整体大小的1/5float scaleFactor = srcWidth * 1.0f / 5 / logoWidth;Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888);try {Canvas canvas = new Canvas(bitmap);canvas.drawBitmap(src, 0, 0, null);canvas.scale(scaleFactor, scaleFactor, srcWidth / 2, srcHeight / 2);canvas.drawBitmap(logo, (srcWidth - logoWidth) / 2, (srcHeight - logoHeight) / 2, null);canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();} catch (Exception e) {bitmap = null;e.getStackTrace();}return bitmap;}/*** 从资源文件中获取图片** @param context    上下文* @param drawableId 资源文件id* @return*/public static Bitmap gainBitmap(Context context, int drawableId) {Bitmap bmp = BitmapFactory.decodeResource(context.getResources(),drawableId);return bmp;}/*** 在图片右下角添加水印** @param srcBMP  原图* @param markBMP 水印图片* @return 合成水印后的图片*/public static Bitmap composeWatermark(Bitmap srcBMP, Bitmap markBMP) {if (srcBMP == null) {return null;}// 创建一个新的和SRC长度宽度一样的位图Bitmap newb = Bitmap.createBitmap(srcBMP.getWidth(),srcBMP.getHeight(), Bitmap.Config.ARGB_8888);//获取透明度Paint vPaint = selectAlpha(0);Canvas cv = new Canvas(newb);// 在 0,0坐标开始画入原图cv.drawBitmap(srcBMP, 0, 0, null);// 在原图的右下角画入水印cv.drawBitmap(markBMP, srcBMP.getWidth() - markBMP.getWidth() * 3 / 5,srcBMP.getHeight() * 3 / 7, vPaint);// 保存cv.save(Canvas.ALL_SAVE_FLAG);// 存储cv.restore();return newb;}/*** 给二维码图片加背景** @param foreground 原图* @param background 背景图* @return 效果图*/public static Bitmap addBackground(Bitmap foreground, Bitmap background) {int bgWidth = background.getWidth();int bgHeight = background.getHeight();int fgWidth = foreground.getWidth();int fgHeight = foreground.getHeight();Bitmap newmap = Bitmap.createBitmap(bgWidth, bgHeight, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(newmap);canvas.drawBitmap(background, 0, 0, null);canvas.drawBitmap(foreground, (bgWidth - fgWidth) / 2,(bgHeight - fgHeight) * 2 / 5 + 70, null);canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();return newmap;}/*** 生成带logo的二维码** @param logo logo图* @param content   内容* @param width 宽度* @param height 高度* @param alpha 透明度* @param isEdge 去白边    true 去除 false 保留* @return 二维码*/public static Bitmap generateQRCode(Bitmap logo, String content, int width, int height, int alpha, boolean isEdge) {return  addLogo(generateQRCode(content, width, height,alpha,isEdge), logo);}/*** 生成不带logo的二维码** @param content 内容* @param width 宽度* @param height 高度* @param alpha 透明度* @param isEdge 去白边    true 去除 false 保留* @return 二维码*/public static Bitmap generateQRCode(String content, int width, int height, int alpha, boolean isEdge) {try {HashMap<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();// 设置编码方式utf-8hints.put(EncodeHintType.CHARACTER_SET, "utf-8");//设置二维码的纠错级别为hhints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);BitMatrix matrix;if(isEdge){matrix = new QRCodeWriter().encode(content,BarcodeFormat.QR_CODE, width, height, hints);}else{matrix = new MultiFormatWriter().encode(content,BarcodeFormat.QR_CODE, width, height, hints);}return bitMatrix2Bitmap(matrix, alpha);} catch (WriterException e) {e.printStackTrace();}return null;}/*** 添加文字** @param bmpSrc 二维码图* @param text 文字* @return 效果图*/public static Bitmap addTextToBitmap(Bitmap bmpSrc, String text) {int srcWidth = bmpSrc.getWidth();int srcHeight = bmpSrc.getHeight();// 先计算text所需要的heightint textSize = 20;int padding = 3;int textLinePadding = 1;// 每行的文字int perLineWords = (srcWidth - 2 * padding) / textSize;int lineNum = text.length() / perLineWords;lineNum = text.length() % perLineWords == 0 ? lineNum : lineNum + 1;int textTotalHeight = lineNum * (textSize + textLinePadding) + 2 * padding;Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight + textTotalHeight,Bitmap.Config.ARGB_8888);try {Canvas canvas = new Canvas(bitmap);canvas.drawColor(Color.WHITE);canvas.drawBitmap(bmpSrc, 0, 0, null);Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);paint.setColor(Color.BLACK);paint.setTextSize(textSize);String lineText;for (int i = 0, startY = srcHeight + textSize, start, end; i < lineNum; i++) {start = i * perLineWords;end = start + perLineWords;lineText = text.substring(start, end > text.length() ? text.length() : end);canvas.drawText(lineText, padding, startY, paint);startY += textSize + textLinePadding;}canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();} catch (Exception e) {bitmap = null;e.getStackTrace();}return bitmap;}
}

QRCodeWriter.java

package com.showimage.start.showimage;/*** Created by twk on 2019/6/25.*/import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.Writer;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.google.zxing.qrcode.encoder.ByteMatrix;
import com.google.zxing.qrcode.encoder.Encoder;
import com.google.zxing.qrcode.encoder.QRCode;import java.util.Map;public final class QRCodeWriter implements Writer {private static final int QUIET_ZONE_SIZE = 4;public QRCodeWriter() {}public BitMatrix encode(String contents, BarcodeFormat format, int width, int height) throws WriterException {return this.encode(contents, format, width, height, (Map)null);}public BitMatrix encode(String contents, BarcodeFormat format, int width, int height, Map<EncodeHintType, ?> hints) throws WriterException {if(contents.length() == 0) {throw new IllegalArgumentException("Found empty contents");} else if(format != BarcodeFormat.QR_CODE) {throw new IllegalArgumentException("Can only encode QR_CODE, but got " + format);} else if(width >= 0 && height >= 0) {ErrorCorrectionLevel errorCorrectionLevel = ErrorCorrectionLevel.L;if(hints != null) {ErrorCorrectionLevel code = (ErrorCorrectionLevel)hints.get(EncodeHintType.ERROR_CORRECTION);if(code != null) {errorCorrectionLevel = code;}}QRCode code1 = new QRCode();Encoder.encode(contents, errorCorrectionLevel, hints, code1);return renderResult(code1, width, height);} else {throw new IllegalArgumentException("Requested dimensions are too small: " + width + 'x' + height);}}private static BitMatrix renderResult(QRCode code, int width, int height) {ByteMatrix input = code.getMatrix();if (input == null) {throw new IllegalStateException();}int inputWidth = input.getWidth();int inputHeight = input.getHeight();// 依据用户的输入宽高,计算最后的输出宽高int outputWidth = Math.max(width, inputWidth);int outputHeight = Math.max(height, inputHeight);//计算缩放比例int multiple = Math.min(outputWidth / inputWidth, outputHeight / inputHeight);//重新写一次outputWidth和inputHeightoutputWidth = multiple * inputWidth;outputHeight = multiple * inputHeight;
//        Log.d(TAG, "renderResult: outputWidth " +outputWidth +" outputHeight "+outputHeight);
//        Log.d(TAG, "renderResult: inputHeight " +inputWidth +" inputHeight "+inputHeight);
//        Log.d(TAG, "renderResult: multiple " + multiple);BitMatrix output = new BitMatrix(outputWidth, outputHeight);int inputY = 0;// 嵌套循环,将ByteMatrix的内容计算padding后转换成BitMatrixfor (int outputY = 0; inputY < inputHeight; outputY += multiple) {int inputX = 0;for (int outputX = 0; inputX < inputWidth; outputX += multiple) {if (input.get(inputX, inputY) == 1) {output.setRegion(outputX, outputY, multiple, multiple);}inputX++;}inputY++;}return output;}
}

以上就是全部源码,如果有调试问题,欢迎留言告知,如果对你有帮助,请给我个赞,谢谢!!

这篇关于【源码】二维码透明底和去除白边功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/944360

相关文章

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

CSS去除a标签的下划线的几种方法

《CSS去除a标签的下划线的几种方法》本文给大家分享在CSS中,去除a标签(超链接)的下划线的几种方法,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧... 在 css 中,去除a标签(超链接)的下划线主要有以下几种方法:使用text-decoration属性通用选择器设置:使用a标签选择器,将tex

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

基于SpringBoot实现文件秒传功能

《基于SpringBoot实现文件秒传功能》在开发Web应用时,文件上传是一个常见需求,然而,当用户需要上传大文件或相同文件多次时,会造成带宽浪费和服务器存储冗余,此时可以使用文件秒传技术通过识别重复... 目录前言文件秒传原理代码实现1. 创建项目基础结构2. 创建上传存储代码3. 创建Result类4.

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML