美文网首页
使用ZXing生成二维码,可设置中间icon,边缘白色宽度为0

使用ZXing生成二维码,可设置中间icon,边缘白色宽度为0

作者: xiaolei123 | 来源:发表于2017-11-17 15:48 被阅读94次
    
    import android.graphics.Bitmap;
    import android.graphics.Matrix;
    
    import com.google.zxing.BarcodeFormat;
    import com.google.zxing.EncodeHintType;
    import com.google.zxing.WriterException;
    import com.google.zxing.common.BitMatrix;
    import com.google.zxing.qrcode.QRCodeWriter;
    
    import java.util.Hashtable;
    
    /**
     * Created by xiaolei on 2017/4/26.
     */
    
    public class QRCodeUtil
    {
        // 生成QR图
        public static Bitmap createImage(String text, int w, int h, Bitmap logo)
        {
            try
            {
                Bitmap scaleLogo = getScaleLogo(logo, w, h);
                int offsetX = (w - scaleLogo.getWidth()) / 2;
                int offsetY = (h - scaleLogo.getHeight()) / 2;
                Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
                hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
                hints.put(EncodeHintType.MARGIN, 0);
                BitMatrix bitMatrix = new QRCodeWriter().encode(text,
                        BarcodeFormat.QR_CODE, w, h, hints);
                int[] pixels = new int[w * h];
                for (int y = 0; y < h; y++)
                {
                    for (int x = 0; x < w; x++)
                    {
                        if (x >= offsetX && x < offsetX + scaleLogo.getWidth() && y >= offsetY && y < offsetY + scaleLogo.getHeight())
                        {
                            int pixel = scaleLogo.getPixel(x - offsetX, y - offsetY);
                            if (pixel == 0)
                            {
                                if (bitMatrix.get(x, y))
                                {
                                    pixel = 0xff000000;
                                } else
                                {
                                    pixel = 0xffffffff;
                                }
                            }
                            pixels[y * w + x] = pixel;
                        } else
                        {
                            if (bitMatrix.get(x, y))
                            {
                                pixels[y * w + x] = 0xff000000;
                            } else
                            {
                                pixels[y * w + x] = 0xffffffff;
                            }
                        }
                    }
                }
                Bitmap bitmap = Bitmap.createBitmap(w, h,
                        Bitmap.Config.ARGB_8888);
                bitmap.setPixels(pixels, 0, w, 0, 0, w, h);
                return bitmap;
            } catch (WriterException e)
            {
                e.printStackTrace();
            }
            return null;
        }
    
        private static Bitmap getScaleLogo(Bitmap logo, int w, int h)
        {
            if (logo == null) return null;
            Matrix matrix = new Matrix();
            float scaleFactor = Math.min(w * 1.0f / 5 / logo.getWidth(), h * 1.0f / 5 / logo.getHeight());
            matrix.postScale(scaleFactor, scaleFactor);
            Bitmap result = Bitmap.createBitmap(logo, 0, 0, logo.getWidth(), logo.getHeight(), matrix, true);
            return result;
        }
    }
    
    

    相关文章

      网友评论

          本文标题:使用ZXing生成二维码,可设置中间icon,边缘白色宽度为0

          本文链接:https://www.haomeiwen.com/subject/yxujvxtx.html