精华内容
下载资源
问答
  • 二维码是国内专业的二维码服务提供商,提供二维码生成,美化,印制,管理,统计等服务
  • 可以设置一段文字、一个电话、一个网址等等在线生成二维码的工具,可以通过这个源码在线生成各种各样的二维码。包括但不限于:网址二维码、地理位置二维码、邮箱二维码、文本信息二维码、电话短信二维码、wifi自动...
  • 二维码在线生成源码

    2014-04-11 21:25:38
    二维码在线生成系统源码 支持美化 缩放 等功能
  • 源码二维码生成及美化

    千次阅读 2019-06-26 16:02:32
    // logo大小为二维码整体大小的1/5 float scaleFactor = srcWidth * 1.0f / 5 / logoWidth; Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888); try { Canvas canvas = new ...

    activity.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        tools:context="com.showimage.start.showimage.MainActivity">
    
        <ImageView
            android:id="@+id/imageView"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:scaleType="fitXY"
            app:srcCompat="@android:color/background_light"
            app:layout_constraintTop_toTopOf="parent"
            android:layout_marginTop="8dp"
            android:layout_marginLeft="8dp"
            app:layout_constraintLeft_toLeftOf="parent"
            android:layout_marginRight="8dp"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            android:layout_marginBottom="8dp" />
    
    </android.support.constraint.ConstraintLayout>

    AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.showimage.start.showimage">
        <uses-permission android:name="android.permission.INTERNET" />
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>

    MainActivity.java

    package com.showimage.start.showimage;
    
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    import android.widget.ImageView;
    
    import java.io.BufferedInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
    
    public class MainActivity extends AppCompatActivity {
        private static final String TAG = "MainActivity";
    
        private static final int height = 240;
        private static final int width = 240;
        private ImageView imageView;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            imageView = (ImageView) findViewById(R.id.imageView);
            Bitmap mBitmap = null;
            //生成不带logo的二维码
            //mBitmap = MakeQRCodeUtil.generateQRCode("https://www.baidu.com", width, height);
            //生成带logo的二维码
            mBitmap = MakeQRCodeUtil.generateQRCode(MakeQRCodeUtil.gainBitmap(this, R.drawable.test2),"https://www.baidu.com", width, height);
            //添加背景
            mBitmap = MakeQRCodeUtil.addBackground(mBitmap, MakeQRCodeUtil.gainBitmap(this, R.drawable.test1));
            //添加水印
            mBitmap = MakeQRCodeUtil.composeWatermark(mBitmap, MakeQRCodeUtil.gainBitmap(this, R.drawable.test3));
            //添加文字
            mBitmap = MakeQRCodeUtil.addTextToBitmap(mBitmap, "愿岁月静好,现世安稳");
            imageView.setImageBitmap(mBitmap);
        }
    }
    

    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 {
        //转换位图
        private static Bitmap bitMatrix2Bitmap(BitMatrix matrix) {
            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 = Color.WHITE;
                    if (matrix.get(x, y)) {
                        color = 0xFF0094FF + y/2;// 蓝色
                        // 有内容的部分,颜色设置为黑色,当然这里可以自己修改成喜欢的颜色
    //                    if (x < WIDTH / 2 && y < HEIGHT / 2) {
    //                        color = 0xFF0094FF;// 蓝色
    //                        //Integer.toHexString(new Random().nextInt());
    //                    } else if (x < WIDTH / 2 && y > HEIGHT / 2) {
    //                        color = 0xFFFED545;// 黄色
    //                    } else if (x > WIDTH / 2 && y > HEIGHT / 2) {
    //                        color = 0xFF5ACF00;// 绿色
    //                    } else {
    //                        color = 0xFF000000;// 黑色
    //                    }
                    }
                    pixels[x + (y * WIDTH)] = color;
                }
            }
    
            Bitmap bitmap = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.RGB_565);
            bitmap.setPixels(pixels, 0, WIDTH, 0, 0, WIDTH, HEIGHT);
            return bitmap;
        }
    
        //添加logo
        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/5
            float 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);
            Canvas cv = new Canvas(newb);
            // 在 0,0坐标开始画入原图
            cv.drawBitmap(srcBMP, 0, 0, null);
            // 在原图的右下角画入水印
            cv.drawBitmap(markBMP, srcBMP.getWidth() - markBMP.getWidth() * 2 / 5,
                    srcBMP.getHeight() * 6 / 7, null);
            // 保存
            cv.save(Canvas.ALL_SAVE_FLAG);
            // 存储
            cv.restore();
            return newb;
        }
    
        /**
         * 给二维码图片加背景
         */
        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;
        }
    //-----------------------------------------------------------------------------------------------------------------------
        public static Bitmap generateQRCode(Bitmap logo, String content, int width, int height) {
            return  addLogo(generateQRCode(content, width, height), logo);
        }
    
        //生成二维码
        public static Bitmap generateQRCode(String content, int width, int height) {
            try {
                HashMap<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();
                // 设置编码方式utf-8
                hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
                //设置二维码的纠错级别为h
                hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
                BitMatrix matrix = new MultiFormatWriter().encode(content,BarcodeFormat.QR_CODE, width, height, hints);
                return bitMatrix2Bitmap(matrix);
            } catch (WriterException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public static Bitmap addTextToBitmap(Bitmap bmpSrc, String text) {
            int srcWidth = bmpSrc.getWidth();
            int srcHeight = bmpSrc.getHeight();
    
            // 先计算text所需要的height
            int 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;
        }
    }

    以上就是全部源码,如果有调试问题,欢迎留言告知,谢谢!!

    展开全文
  • 网址: QRBTF是一个简单的Web应用程序,可美化您的QR码。 特征 各种艺术QR码样式 参数设计 无需后端 支持SVG下载 中文介绍: QRBTF网站 安装 git clone https://github.com/ciaochaos/qrbtf.git cd qrbtf npm ...
  • 布局(activity.xml)、权限(AndroidManifest.xml)和 MainActivity.java(基本...飞机票:【源码二维码生成及美化 MakeQRCodeUtil.java package com.showimage.start.showimage; import android.content...

    布局(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—255
            return 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/5
            float 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-8
                hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
                //设置二维码的纠错级别为h
                hints.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所需要的height
            int 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和inputHeight
            outputWidth = 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后转换成BitMatrix
            for (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;
        }
    }
    
    

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

    展开全文
  • java生成推广二维码

    2016-01-14 11:47:09
    全网唯一全面美化二维码代码源码,自己纯手工制作。 具体功能:图片和图片组合,图片添加推广文字。 成品类似0元购推广二维码。可添加文字,可组合图片。
  • 常用的在线编码解码,代码压缩,美化,JSON格式化,正则表达式,时间转换工具,二维码生成与解码等工具,支持在线搜索和Chrome插件。 HTML开发工具链接:在线工具,支持搜索链接: : Chrome插件:Chrome插件,支持...
  • 二维码扫描(横屏、竖屏、解决竖屏后拉伸问题、美化扫描框) 2013-09-29 16:39:37 我来说两句 作者:梦想天涯 收藏 我要投稿 是根据zxing的源码进行简化的,不过只支持横屏。其实支持竖屏也挺简.....
    • 二维码扫描(横屏、竖屏、解决竖屏后拉伸问题、美化扫描框)

    • 是根据zxing的源码进行简化的,不过只支持横屏。

      其实支持竖屏也挺简单的:【http://stackoverflow.com/questions/16252791/zxing-camera-in-portrait-mode-on-android】

      Step 1: Add following lines to rotate data before buildLuminanceSource(..) in decode(byte[] data, int width, int height)

       

      DecodeHandler.java:

       

      byte[] rotatedData = new byte[data.length];

      for (int y = 0; y < height; y++) {

          for (int x = 0; x < width; x++)

              rotatedData[x * height + height - y - 1] = data[x + y * width];

      }

      int tmp = width;

      width = height;

      height = tmp;

       

      PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(rotatedData, width, height);

      Step 2: Modify getFramingRectInPreview().

       

      CameraManager.java

       

      rect.left = rect.left * cameraResolution.y / screenResolution.x;

      rect.right = rect.right * cameraResolution.y / screenResolution.x;

      rect.top = rect.top * cameraResolution.x / screenResolution.y;

      rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;

      Step 3: Disable the check for Landscape Mode in initFromCameraParameters(...)

       

      CameraConfigurationManager.java

       

      //remove the following

      if (width < height) {

        Log.i(TAG, "Display reports portrait orientation; assuming this is incorrect");

        int temp = width;

        width = height;

        height = temp;

      }

      Step 4: Add following line to rotate camera insetDesiredCameraParameters(...)

       

      CameraConfigurationManager.java

       

      camera.setDisplayOrientation(90);

      Step 5: Do not forget to set orientation of activity to portrait. I.e: manifest

       

      但是这样之后,会出现拉伸的问题,解决方法如下:

      更改CameraConfigurationManager.java文件

       

      在 Log.d(TAG, "Screen resolution: " + screenResolution);这句之后增加

      Point screenResolutionForCamera = new Point();

              screenResolutionForCamera.x = screenResolution.x;

              screenResolutionForCamera.y = screenResolution.y;

              // preview size is always something like 480*320, other 320*480

              if (screenResolution.x < screenResolution.y) {

              screenResolutionForCamera.x = screenResolution.y;

              screenResolutionForCamera.y = screenResolution.x;

              }

      再更改cameraResolution = getCameraResolution(parameters, screenResolution);为cameraResolution = getCameraResolution(parameters, screenResolutionForCamera);

      如果想美化一下取景框,可以参看代码:https://code.csdn.net/snippets/64838


    转载于:https://my.oschina.net/janson2013/blog/204580

    展开全文
  • 今天我们来看看二维码的生成以及美化二维码(添加logo、彩色、背景、文字、水印在这里都能找到)。 第三方库 现在在实际应用中使用的最为广泛的二维码生成工具就是Zxing库,本文以Zxing-2.0版本做的研究分析。...

    最近在做一个二维码的相关的应用,顺带整理下相关的知识。今天我们来看看二维码的生成以及美化二维码(添加logo、彩色、背景、文字、水印在这里都能找到)。

    第三方库

    现在在实际应用中使用的最为广泛的二维码生成工具就是Zxing库,本文以Zxing-2.0版本做的研究分析。

    下载方式:https://blog.csdn.net/twk121109281/article/details/93600672

    加载第三方库的方法:https://blog.csdn.net/twk121109281/article/details/93601300

    生成二维码

    加载Zxing库后,即可直接使用该库的直接生成二维码

    1、获取编码后的数据Bitmatrix

    BitMatrix是Zxing库定义的一个二维码的数据类。这个方法主要是生成二维码的BitMatrix,实际上就是一个矩阵,二维数组。然后还必须设置容错率:容错率有M,L,Q,H几个等级,容错率越高,二维码的有效像素点就越多。这里使用小写的utf-8编码。

        //生成二维码
        public static Bitmap generateQRCode(String content, int width, int height) {
            try {
                HashMap<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();
                // 设置编码方式utf-8
                hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
                //设置二维码的纠错级别为h
                hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
                BitMatrix matrix = new QRCodeWriter().encode(content,BarcodeFormat.QR_CODE, width, height, hints);
                //BitMatrix matrix = new MultiFormatWriter().encode(content,BarcodeFormat.QR_CODE, width, height, hints);
                return bitMatrix2Bitmap(matrix);
            } catch (WriterException e) {
                e.printStackTrace();
            }
            return null;
        }

    2、将数据Bitmatrix转换成Bitmap

    这个方法将Bitmatrix获转换成Bitmap后,就可以随意展示了。

        private static Bitmap bitMatrix2Bitmap(BitMatrix matrix) {
            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 = Color.WHITE;
                    if (matrix.get(x, y)) {
                        // 有内容的部分,颜色设置为渐变,当然这里可以自己修改成喜欢的颜色
                        color = 0xFF0094FF + y/2;// 蓝色
    //                    if (x < WIDTH / 2 && y < HEIGHT / 2) {
    //                        color = 0xFF0094FF;// 蓝色
    //                        //Integer.toHexString(new Random().nextInt());
    //                    } else if (x < WIDTH / 2 && y > HEIGHT / 2) {
    //                        color = 0xFFFED545;// 黄色
    //                    } else if (x > WIDTH / 2 && y > HEIGHT / 2) {
    //                        color = 0xFF5ACF00;// 绿色
    //                    } else {
    //                        color = 0xFF000000;// 黑色
    //                    }
                    }
                    pixels[x + (y * WIDTH)] = color;
                }
            }
    
            Bitmap bitmap = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.RGB_565);
            bitmap.setPixels(pixels, 0, WIDTH, 0, 0, WIDTH, HEIGHT);
            return bitmap;
        }

    这样就能生成彩色的二维码了。需要生成其他颜色的修改下面部分即可。(屏蔽部分是四种颜色)

    3、结果

    添加logo

    下面代码可以看出要给二维码图片中间加logo,但是图片只能占据整个二维码图片的小一部分,这里是1/5大小。

    1、上传图片

    将上面图片拷贝到android目录drawable中(test2就是上图图片)

    将android资源文件转换成Bitmap

        MakeQRCodeUtil.gainBitmap(this, R.drawable.test2);
    
        public static Bitmap gainBitmap(Context context, int drawableId) {
            Bitmap bmp = BitmapFactory.decodeResource(context.getResources(),
                    drawableId);
            return bmp;
        }

    2、添加logo

    传入生成二维码和logo的Bittmp

        //添加logo
        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/5
            float 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;
        }

    3、结果

    添加背景

    1、上传图片

    如上logo图片一样转换成Bittmp

    2、添加背景

    传入生成二维码和背景图的Bittmp(背景图不要小于二维码图)

        /**
         * 给二维码图片加背景
         */
        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;
        }

    3、结果

    位置就没有调整。可以自己在addBackground方法中调整下。

    添加文字

    直接添加文字即可

        public static Bitmap addTextToBitmap(Bitmap bmpSrc, String text) {
            int srcWidth = bmpSrc.getWidth();
            int srcHeight = bmpSrc.getHeight();
    
            // 先计算text所需要的height
            int 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;
        }

    结果

    添加水印

    水印图

    代码

        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);
            Canvas cv = new Canvas(newb);
            // 在 0,0坐标开始画入原图
            cv.drawBitmap(srcBMP, 0, 0, null);
            // 在原图的右下角画入水印
            cv.drawBitmap(markBMP, srcBMP.getWidth() - markBMP.getWidth() * 2 / 5,
                    srcBMP.getHeight() * 6 / 7, null);
            // 保存
            cv.save(Canvas.ALL_SAVE_FLAG);
            // 存储
            cv.restore();
            return newb;
        }

    结果

    只有一个头头,为了让你发现它我还特意弄了个箭头,当然正常的水印也不会有这么大。

    源码

    地址:【源码】二维码生成及美化

    结束语

    以上就是跟二维码生成以及美化相关接口的总结,希望对你有用。欢迎大家关注我们微信公众号,来交流程序员的技术。如果能留言或者点个赞,我也是很开心的,非常感谢!

    下一篇:【android应用】详解基于ZXing生成的二维码,文末附带源码---去除白边,以及透明底

    å¨è¿éæå¥å¾çæè¿°

    参考:

    https://blog.csdn.net/u013749540/article/details/65937320

    侵删,谢谢

    展开全文
  • 方法很简单,只需要下载源码,解压后修改index.html和替换收款二维码图片,放到服务器或者虚拟机上即可,一个单页面,无须后台 网盘下载地址: http://kekewangLuo.net/k57CvEY1qDz0 图片: ...
  • 1:美化。 2:生成模板专门搞了一个文件夹装了起来。 3:本地化,生成的文件在/data里面。 4:修复二维码失效增加两套生成模板 5:去授权,这个是无授权的整套系统
  • 可以把链接一键生成二维码,并且可以批量打包成图片压缩包下载,目前是完整的基础源码,只实现功能,需要有编程基础者才能使用,还需要自己添加全选和链接替换等,样式需要自己美化
  • 最新二开抢单系统淘宝自动抢单源码安装教程 【2次开发版】2020最新五代分佣抢单系统唯品会京东淘宝自动抢单区块...新增聚合收款 可以展示卡号 二维码 美化了订单详情页面 修复了多处图标 修复多处细节bug 优化了多个地
  • 复卡顿速度起飞,美化界面,修复红包错位,修复抢包名字错位,修复互转错误,增加抢包音效 这个版本是很完美了基本问题都搞定了 可对接充值 提现秒到账 怎么修改可以看文字教程 服务器4核4G可完美运行本源码 ...
  • 在线制作网页php源码

    2021-04-17 16:25:13
    1:美化了页面。 2:生成模板专门搞了一个文件夹装了起来。 3:本地化,生成的文件在/data里面。 4:修复二维码失效增加两套生成模板。 5:绿色,这个是无授权的整套系统。 安装说明: 直接上传源码到服务器就可以...
  • Freekan3.8.5影视站源码最新完美版 1.后台去除多余代码,优化响应速度。 2.美化前端代码,去掉一句话后门代码 3.增加播放页二维码功能,提高访问速度 4.增加了分类上下栏等广告位置,后台可设置(瓦片模板不可用)...
  • EDLM自助售卡平台源码

    2018-04-22 09:34:42
    源码简介 EDLM自助售卡平台源码是采用php+mysql进行开发的24小时自动售卡平台! 重要的是站长的收款账号无需签约,无需企业认证无需费率,直接入账!安全稳定。 网站全开源无加密,免费提供学习!!!二开请保留版权...
  • 源码特点 1、PHP+MYSQL架构 2、自动采集全网影视,VIP电影免费看 3、视频管理系统,可自主采集添加视频分类及视频 5、会员管理系统,可自定义分组,可设置会员级别价格,一键生成卡密,支持批量功能 6、广告管理系统...
  • =180px比例1:1,推荐二维码美化工具,对应页面在 src\main\resources\templates 中 alipay.html、wechat.html、qqpay.html。当然聪明的你还可以在 pay.html 和这些中自定义业务逻辑,修改JS代码即可。 ...
  • 二维码解码器(支持网页二维码右键解码) 简易Postman(Api接口测试,模拟HEAD/GET/POST方式) 网页滚动截屏(将当前整个网页转为图片并保存) Markdown转换(支持Markdown与HTML的互转) 页面取色工具(滑动鼠标...
  • 近日在网上找了个很不错的安卓二维码美化,由于下载的项目经常出问题,且不方便依赖使用,因此我想把它写个demo,并把源码发布到jcenter中,修改还是很顺利的,运行项目到手机也没问题,发布遇到了问题 1、 运行gradle ...
  • VSCode 美化不同的文件。 WakaTime 统计项目代码的时间。 BetterComments 代码注释 3. IDE IntelliJ idea + Go Plugin、Goland、LiteIDE 博客地址和 RSS 地址 本博客列表涉及的文章内容支持 定制化 Google...
  • 我们主要分享一下技术的难点,关于界面的布局及细节上的美化就留给各位开发者自己布局。先上代码和基本效果图 1. layout布局activity_main.xml <?xml version="1.0" encoding="utf-8"?> <android.support....
  • 保留网站页脚的二维码 访问 tk题库 ,充值下载题目 向同学同事推荐这个项目 每天扫一扫本页底部的支付宝红包 在您的论文参考文献中写出本项目的网址 Star us, please! 推荐云服务商 UCloud年度大促 快杰云主机推广...
  • rich:一个在终端中支持富文本和格式美化的 Python 库, 同时提供了RichHandler日志处理程序。 tqdm:一个可在循环和命令行中使用的快速、可扩展的进度条。 生产力工具 aws-cli:Amazon Web Services 的通用...

空空如也

空空如也

1 2
收藏数 37
精华内容 14
关键字:

二维码美化源码