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

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

相关文章

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

基于Java和FFmpeg实现视频压缩和剪辑功能

《基于Java和FFmpeg实现视频压缩和剪辑功能》在视频处理开发中,压缩和剪辑是常见的需求,本文将介绍如何使用Java结合FFmpeg实现视频压缩和剪辑功能,同时去除数据库操作,仅专注于视频处理,需... 目录引言1. 环境准备1.1 项目依赖1.2 安装 FFmpeg2. 视频压缩功能实现2.1 主要功

使用Python实现无损放大图片功能

《使用Python实现无损放大图片功能》本文介绍了如何使用Python的Pillow库进行无损图片放大,区分了JPEG和PNG格式在放大过程中的特点,并给出了示例代码,JPEG格式可能受压缩影响,需先... 目录一、什么是无损放大?二、实现方法步骤1:读取图片步骤2:无损放大图片步骤3:保存图片三、示php

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

Python脚本轻松实现检测麦克风功能

《Python脚本轻松实现检测麦克风功能》在进行音频处理或开发需要使用麦克风的应用程序时,确保麦克风功能正常是非常重要的,本文将介绍一个简单的Python脚本,能够帮助我们检测本地麦克风的功能,需要的... 目录轻松检测麦克风功能脚本介绍一、python环境准备二、代码解析三、使用方法四、知识扩展轻松检测麦

Java实现TXT文件导入功能的详细步骤

《Java实现TXT文件导入功能的详细步骤》在实际开发中,很多应用场景需要将用户上传的TXT文件进行解析,并将文件中的数据导入到数据库或其他存储系统中,本文将演示如何用Java实现一个基本的TXT文件... 目录前言1. 项目需求分析2. 示例文件格式3. 实现步骤3.1. 准备数据库(假设使用 mysql

在ASP.NET项目中如何使用C#生成二维码

《在ASP.NET项目中如何使用C#生成二维码》二维码(QRCode)已广泛应用于网址分享,支付链接等场景,本文将以ASP.NET为示例,演示如何实现输入文本/URL,生成二维码,在线显示与下载的完整... 目录创建前端页面(Index.cshtml)后端二维码生成逻辑(Index.cshtml.cs)总结

Springboot项目登录校验功能实现

《Springboot项目登录校验功能实现》本文介绍了Web登录校验的重要性,对比了Cookie、Session和JWT三种会话技术,分析其优缺点,并讲解了过滤器与拦截器的统一拦截方案,推荐使用JWT... 目录引言一、登录校验的基本概念二、HTTP协议的无状态性三、会话跟android踪技术1. Cook

基于Spring Boot 的小区人脸识别与出入记录管理系统功能

《基于SpringBoot的小区人脸识别与出入记录管理系统功能》文章介绍基于SpringBoot框架与百度AI人脸识别API的小区出入管理系统,实现自动识别、记录及查询功能,涵盖技术选型、数据模型... 目录系统功能概述技术栈选择核心依赖配置数据模型设计出入记录实体类出入记录查询表单出入记录 VO 类(用于

Qt中实现多线程导出数据功能的四种方式小结

《Qt中实现多线程导出数据功能的四种方式小结》在以往的项目开发中,在很多地方用到了多线程,本文将记录下在Qt开发中用到的多线程技术实现方法,以导出指定范围的数字到txt文件为例,展示多线程不同的实现方... 目录前言导出文件的示例工具类QThreadQObject的moveToThread方法实现多线程QC