二维码图片_二维码图片批量生成url - CSDN
精华内容
参与话题
  • 解析本地二维码图片

    2015-12-04 15:19:28
    String decodeResult = null; if (StringUtil.isNotEmpty(path)) { Bitmap bitmap = BitmapUtil.getBitmapFromDisk(path); if (bitmap != null) { int width = bitma
     String decodeResult = null;
    
            if (StringUtil.isNotEmpty(path)) {
                Bitmap bitmap = BitmapUtil.getBitmapFromDisk(path);
                if (bitmap != null) {
                    int width = bitmap.getWidth();
                    int height = bitmap.getHeight();
    
                    int[] pixels = new int[width * height];
                    bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
                    Image barcode = new Image(width,height, "RGB4");
                    barcode.setData(pixels);
                    ImageScanner imageScanner = new ImageScanner();
                    imageScanner.setConfig(Symbol.QRCODE, Config.ENABLE,1);
                    int result = imageScanner.scanImage(barcode.convert("Y800"));
                    if (result != 0){
                        SymbolSet symbols = imageScanner.getResults();
                        for (Symbol symbol : symbols){
                            decodeResult = symbol.getData();
                            break;
                        }
                    }
                }
            }
    
    展开全文
  • Android 解析二维码图片

    千次阅读 2016-12-01 15:52:24
    现新增需求是将用户存储到相册中的二维码图片识别并解析出来。网上也有很多这样解析的例子,我这篇博客也是在借鉴他们提供的方法之后写出来的,整个解析过程都差不多,不同的是,因为每个人集成的项目会有所不同,...

    我们项目之前已集成了一个zxing的扫描二维码开源库。现新增需求是将用户存储到相册中的二维码图片识别并解析出来。网上也有很多这样解析的例子,我这篇博客也是在借鉴他们提供的方法之后写出来的,整个解析过程都差不多,不同的是,因为每个人集成的项目会有所不同,中间会有所修改。而且在做这个项目的时候,中间出了几个异常,我提出来一是引以为鉴,二是里面有些错误,我也不是很明白,希望有人看到之后,能顺便帮我解解惑。

    1.项目需求:知道项目需求,才知道先从哪里入手,见图一。(点击相册,打开图库)

    这里写图片描述

    2.代码:

    1.打开图库代码:
    mBtnOpenPicture.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //打开相册
                    openGallery();
                }
            });
    
    
    
    /**打开相册*/
    private void openGallery() {
            Intent picture = new Intent(Intent.ACTION_PICK,   android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(picture, PICTURE);
        }
    2.获取图片路径和解析。

    (1). 获取图片路径:getPath(uri);由于Android版本不同,返回的uri会有所不同,需要做特殊处理。

    @SuppressLint("NewApi")
        private String getPath(Uri uri) {
            int sdkVersion = Build.VERSION.SDK_INT;
            if (sdkVersion >= 19) {
                //Log.e("hxy", "uri auth: " + uri.getAuthority());
                if (isExternalStorageDocument(uri)) {
                    String docId = DocumentsContract.getDocumentId(uri);
                    String[] split = docId.split(":");
                    String type = split[0];
                    if ("primary".equalsIgnoreCase(type)) {
                        return Environment.getExternalStorageDirectory() + "/" + split[1];
                    }
                } else if (isDownloadsDocument(uri)) {
                    final String id = DocumentsContract.getDocumentId(uri);
                    final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),
                            Long.valueOf(id));
                    return getDataColumn(this, contentUri, null, null);
                } else if (isMediaDocument(uri)) {
                    final String docId = DocumentsContract.getDocumentId(uri);
                    final String[] split = docId.split(":");
                    final String type = split[0];
                    Uri contentUri = null;
                    if ("image".equals(type)) {
                        contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                    } else if ("video".equals(type)) {
                        contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                    } else if ("audio".equals(type)) {
                        contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                    }
                    final String selection = "_id=?";
                    final String[] selectionArgs = new String[]{split[1]};
                    return getDataColumn(this, contentUri, selection, selectionArgs);
                } else if (isMedia(uri)) {
                    String[] proj = {MediaStore.Images.Media.DATA};
                    Cursor actualimagecursor = this.managedQuery(uri, proj, null, null, null);
                    int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                    actualimagecursor.moveToFirst();
                    return actualimagecursor.getString(actual_image_column_index);
                }
            } else if ("content".equalsIgnoreCase(uri.getScheme())) {
                if (isGooglePhotosUri(uri))
                    return uri.getLastPathSegment();
                return getDataColumn(this, uri, null, null);
            }
            // File
            else if ("file".equalsIgnoreCase(uri.getScheme())) {
                return uri.getPath();
            }
            return null;
        }
    
    public static String getDataColumn(Context context, Uri uri,
                                           String selection, String[] selectionArgs) {
    
            Cursor cursor = null;
            final String column = "_data";
            final String[] projection = { column };
    
            try {
                cursor = context.getContentResolver().query(uri, projection,
                        selection, selectionArgs, null);
                if (cursor != null && cursor.moveToFirst()) {
                    final int column_index = cursor.getColumnIndexOrThrow(column);
                    return cursor.getString(column_index);
                }
            } finally {
                if (cursor != null)
                    cursor.close();
            }
            return null;
        }
    
        private static boolean isExternalStorageDocument(Uri uri) {
            return "com.android.externalstorage.documents".equals(uri.getAuthority());
        }
    
        public static boolean isDownloadsDocument(Uri uri) {
            return "com.android.providers.downloads.documents".equals(uri.getAuthority());
        }
    
        public static boolean isMediaDocument(Uri uri) {
            return "com.android.providers.media.documents".equals(uri.getAuthority());
        }
    
        public static boolean isMedia(Uri uri) {
            return "media".equals(uri.getAuthority());
        }
    
        public static boolean isGooglePhotosUri(Uri uri) {
            return "com.google.android.apps.photos.content".equals(uri.getAuthority());
        }
    

    (2).开辟线程,解析图片,封装到Result中:我看了网上的demo,大致上有2种方法。如下是第一种,稍后会把第二种方法也贴出来。

    /**
         * 解析二维码图片
         * @param path
         * @return
         */
        protected Result scanningImage(String path) {
            if (TextUtils.isEmpty(path)) {
                return null;
    
            }
            Hashtable<DecodeHintType, String> hints = new Hashtable();
            hints.put(DecodeHintType.CHARACTER_SET, "UTF-8"); // 设置二维码内容的编码
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true; // 先获取原大小
            scanBitmap = BitmapFactory.decodeFile(path,options);
            options.inJustDecodeBounds = false;
            int sampleSize = (int) (options.outHeight / (float) 200);
            if (sampleSize <= 0)
                sampleSize = 1;
    
            options.inSampleSize = sampleSize;
    
            scanBitmap = BitmapFactory.decodeFile(path, options);
            int[] data = new int[scanBitmap.getWidth() * scanBitmap.getHeight()];
            scanBitmap.getPixels(data, 0, scanBitmap.getWidth(), 0, 0, scanBitmap.getWidth(), scanBitmap.getHeight());
            RGBLuminanceSource rgbLuminanceSource = new RGBLuminanceSource(scanBitmap.getWidth(),scanBitmap.getHeight(),data);
            BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(rgbLuminanceSource));
            QRCodeReader reader = new QRCodeReader();
            Result result = null;
            try {
                result = reader.decode(binaryBitmap, hints);
            } catch (NotFoundException e) {
                Log.e("hxy","NotFoundException");
            }catch (ChecksumException e){
                Log.e("hxy","ChecksumException");
            }catch(FormatException e){
                Log.e("hxy","FormatException");
            }
    
            return result;
    
    
        }

    注意:上面方法中有个关键的类,RGBLuminanceSource。 我把这个类的构造方法贴出来,因为我做的时候,发现网上demo 这个类中构造传递的都是Bitmap, 而我这个类却不是。分析传递的参数之后,我做了个转化:见如下,然后会发现报:NotFoundException. 这个异常是在QRCodeReader类:private static BitMatrix extractPureBits(BitMatrix image) throws NotFoundException 。(到这里我已经不是很懂了,然后又去网上搜索了下,最后自己探索出加scanBitmap.getPixels(data, 0, scanBitmap.getWidth(), 0, 0, scanBitmap.getWidth(), scanBitmap.getHeight());),运行正常,能解析出来。

    int[] data = new int[scanBitmap.getWidth() * scanBitmap.getHeight()];
    //一定要加以下这个代码:
    //scanBitmap.getPixels(data, 0, scanBitmap.getWidth(), 0, 0, scanBitmap.getWidth(), //scanBitmap.getHeight());
    RGBLuminanceSource rgbLuminanceSource = new RGBLuminanceSource(scanBitmap.getWidth(),scanBitmap.getHeight(),data);
    public RGBLuminanceSource(int width, int height, int[] pixels) {
            super(width, height);
            this.dataWidth = width;
            this.dataHeight = height;
            this.left = 0;
            this.top = 0;
            this.luminances = new byte[width * height];
    
            for(int y = 0; y < height; ++y) {
                int offset = y * width;
    
                for(int x = 0; x < width; ++x) {
                    int pixel = pixels[offset + x];
                    int r = pixel >> 16 & 255;
                    int g = pixel >> 8 & 255;
                    int b = pixel & 255;
                    if(r == g && g == b) {
                        this.luminances[offset + x] = (byte)r;
                    } else {
                        this.luminances[offset + x] = (byte)((r + 2 * g + b) / 4);
                    }
                }
            }
    
        }

    现在来看第二种解析方法:

    protected Result scanningImage(String path) {
            if (TextUtils.isEmpty(path)) {
                return null;
    
            }
    
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true; // 先获取原大小
            scanBitmap = BitmapFactory.decodeFile(path,options);
            options.inJustDecodeBounds = false;
            int sampleSize = (int) (options.outHeight / (float) 200);
            if (sampleSize <= 0)
                sampleSize = 1;
    
            options.inSampleSize = sampleSize;
            scanBitmap = BitmapFactory.decodeFile(path, options);
            byte[] data = getYUV420sp(scanBitmap.getWidth(), scanBitmap.getHeight(), scanBitmap);
    
            Hashtable<DecodeHintType, Object> hints = new Hashtable();
            hints.put(DecodeHintType.CHARACTER_SET, "UTF-8"); // 设置二维码内容的编码
            hints.put(DecodeHintType.TRY_HARDER,Boolean.TRUE);
            hints.put(DecodeHintType.POSSIBLE_FORMATS, BarcodeFormat.QR_CODE);
            PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(data,
                    scanBitmap.getWidth(),
                    scanBitmap.getHeight(),
                    0, 0,
                    scanBitmap.getWidth(),
                    scanBitmap.getHeight(),
                    false);
    
            BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));
            QRCodeReader reader2= new QRCodeReader();
            Result result = null;
            try {
                result = reader2.decode(bitmap1, hints);
                Log.e("hxy",result.getText());
            } catch (NotFoundException e) {
                Log.e("hxy","NotFoundException");
            }catch (ChecksumException e){
                Log.e("hxy","ChecksumException");
            }catch(FormatException e){
                Log.e("hxy","FormatException");
            }
    
            return result;
    
    
        }
    
    
    
    public  byte[] getYUV420sp(int inputWidth, int inputHeight,
                                         Bitmap scaled) {
            int[] argb = new int[inputWidth * inputHeight];
    
            scaled.getPixels(argb, 0, inputWidth, 0, 0, inputWidth, inputHeight);
    
            byte[] yuv = new byte[inputWidth * inputHeight * 3 / 2];
    
            encodeYUV420SP(yuv, argb, inputWidth, inputHeight);
    
            scaled.recycle();
    
            return yuv;
        }
    
    
        private void encodeYUV420SP(byte[] yuv420sp, int[] argb, int width,
                                           int height) {
            // 帧图片的像素大小
            final int frameSize = width * height;
            // ---YUV数据---
            int Y, U, V;
            // Y的index从0开始
            int yIndex = 0;
            // UV的index从frameSize开始
            int uvIndex = frameSize;
    
            // ---颜色数据---
    //      int a, R, G, B;
            int R, G, B;
            //
            int argbIndex = 0;
            //
    
            // ---循环所有像素点,RGB转YUV---
            for (int j = 0; j < height; j++) {
                for (int i = 0; i < width; i++) {
    
                    // a is not used obviously
    //              a = (argb[argbIndex] & 0xff000000) >> 24;
                    R = (argb[argbIndex] & 0xff0000) >> 16;
                    G = (argb[argbIndex] & 0xff00) >> 8;
                    B = (argb[argbIndex] & 0xff);
                    //
                    argbIndex++;
    
                    // well known RGB to YUV algorithm
                    Y = ((66 * R + 129 * G + 25 * B + 128) >> 8) + 16;
                    U = ((-38 * R - 74 * G + 112 * B + 128) >> 8) + 128;
                    V = ((112 * R - 94 * G - 18 * B + 128) >> 8) + 128;
    
                    //
                    Y = Math.max(0, Math.min(Y, 255));
                    U = Math.max(0, Math.min(U, 255));
                    V = Math.max(0, Math.min(V, 255));
    
                    // NV21 has a plane of Y and interleaved planes of VU each
                    // sampled by a factor of 2
                    // meaning for every 4 Y pixels there are 1 V and 1 U. Note the
                    // sampling is every other
                    // pixel AND every other scanline.
                    // ---Y---
                    yuv420sp[yIndex++] = (byte) Y;
    
                    // ---UV---
    //              if ((j % 2 == 0) && (i % 2 == 0)) {
    //                  
    //
    // 
    //                  yuv420sp[uvIndex++] = (byte) V;
    //                  
    //                  yuv420sp[uvIndex++] = (byte) U;
    //              }
                }
            }
        }

    最后2行代码在实际运行的时候,如果是拿一个二维码图片,能正常解析,但是如果不是二维码图片,数组越界。然后我将其注释掉之后,一切正常了。在这里的转化,我没有看懂,只是提供一种解析方案,期待对这方面了解之人能我和探讨。

    3.将解析结果回调给调用Activity.:
    @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if(resultCode==RESULT_OK&&data != null&&requestCode == PICTURE){
                Uri selectedImage = data.getData();
                final String pathResult = getPath(selectedImage);
                Log.e("hxy","pathResult:"+pathResult);
    
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        Result result = scanningImage(pathResult);
                        if(result==null){
                            Looper.prepare();
                            Toast.makeText(CaptureActivity.this, "未识别到二维码",Toast.LENGTH_LONG)
                                    .show();
                            Looper.loop();
                        }else{
    
                            handleDecode(result,new Bundle());
    //                      String recode = recode(result.toString());
    //                      Log.e("hxy","recode:"+recode);
    //                      Intent data = new Intent();
    //                      data.putExtra("result", recode);
    //                      setResult(300, data);
                            //finish();
                        }
    
                    }
                }).start();
            }
        }

    在这里调用handleDecode。是由于CaptureActivity中,将结果就是通过handleDecode回调的

    /**
         * A valid barcode has been found, so give an indication of success and show
         * the results.
         * 
         * @param rawResult
         *            The contents of the barcode.
         * 
         * @param bundle
         *            The extras
         */
        public void handleDecode(Result rawResult, Bundle bundle) {
            inactivityTimer.onActivity();
            beepManager.playBeepSoundAndVibrate();
    
            bundle.putInt("width", mCropRect.width());
            bundle.putInt("height", mCropRect.height());
            bundle.putString("result", rawResult.getText());
    
    //      startActivity(new Intent(CaptureActivity.this, ResultActivity.class).putExtras(bundle));
            setResult(RESULT_OK, new Intent().putExtras(bundle));
    //      Toast.makeText(this, rawResult.getText(), Toast.LENGTH_LONG);
    
    
            finish();
        }

    以上就是解析二维码图片的两种方法,借鉴的博客如下:

    http://blog.csdn.net/a102111/article/details/48377537
    http://blog.csdn.net/aaawqqq/article/details/24880209

    展开全文
  • 生成二维码图片

    2019-09-20 16:18:01
    package com.pifeng.util; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException...imp...
    package com.pifeng.util;
    
    import java.awt.Color;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    
    import javax.imageio.ImageIO;
    
    import com.swetake.util.Qrcode;
    
    /**
     * @function 生成二维码的工具类
     * @author 皮锋
     * @date 2016/8/26
     *
     */
    public class QRCodeUtil {
    
    	public static void main(String[] args) throws IOException {
    		File dir = new File(new File("F:/QRCode"), "QRCode.jpg");
    		String encoderContent = "姓名:天朝王子     "
    				+ "性别:男     "
    				+ "爱好:女     "
    				+ "段子:一次和女友逛街,她说要吃棒棒糖,我说,你呀,就像你的胸一样。她问为什么?我:“永远长不大。”她:“尼妹,站住别跑。。。”";
    		outputRQCodeImageFile(dir, encoderContent, "jpg", 12);
    	}
    
    	/**
    	 * @function 创建二维码图片
    	 * @author 皮锋
    	 * @date 2016/8/26
    	 * @param content
    	 * @param imgType
    	 * @param size
    	 * @param os
    	 */
    	private static void outputQRCodeImage(String content, String imgType,
    			int size, OutputStream os) {
    		BufferedImage bufImg = null;
    		try {
    			Qrcode qrcodeHandler = new Qrcode();
    			// 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小
    			qrcodeHandler.setQrcodeErrorCorrect('M');
    			qrcodeHandler.setQrcodeEncodeMode('B');
    			// 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大
    			qrcodeHandler.setQrcodeVersion(size);
    			// 获得内容的字节数组,设置编码格式
    			byte[] contentBytes = content.getBytes("utf-8");
    			// 图片尺寸
    			int imgSize = 67 + 12 * (size - 1);
    			bufImg = new BufferedImage(imgSize, imgSize,
    					BufferedImage.TYPE_INT_RGB);
    			Graphics2D gs = bufImg.createGraphics();
    			// 设置背景颜色
    			gs.setBackground(Color.WHITE);
    			gs.clearRect(0, 0, imgSize, imgSize);
    			// 设定图像颜色> BLACK
    			gs.setColor(Color.BLACK);
    			// 设置偏移量,不设置可能导致解析出错
    			int pixoff = 2;
    			// 输出内容> 二维码
    			if (contentBytes.length > 0 && contentBytes.length < 800) {
    				boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
    				for (int i = 0; i < codeOut.length; i++) {
    					for (int j = 0; j < codeOut.length; j++) {
    						if (codeOut[j][i]) {
    							gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
    						}
    					}
    				}
    			} else {
    				throw new Exception("QRCode content bytes length = "
    						+ contentBytes.length + " not in [0, 800].");
    			}
    			gs.dispose();
    			ImageIO.write(bufImg, imgType, os);
    			bufImg.flush();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    	/**
    	 * @function 生成指定的二维码图片文件
    	 * @author 皮锋
    	 * @date 2016/8/26
    	 * @param file
    	 * @param content
    	 * @param imgType
    	 * @param size
    	 * @throws IOException
    	 */
    	public static void outputRQCodeImageFile(File file, String content,
    			String imgType, int size) throws IOException {
    		if (file == null) {
    			return;
    		}
    		File dir = file.getParentFile();// 获得父目录
    		if (!dir.exists()) { // 如果父目录不存在,则创建一个
    			dir.mkdirs();
    		}
    		try {
    			file.createNewFile();
    			FileOutputStream fos = new FileOutputStream(file);
    			outputQRCodeImage(content, imgType, size, fos);
    			fos.close(); // 关闭流
    		} catch (IOException e) {
    			throw e;
    		}
    	}
    }
    

     

    运行结果:

    展开全文
  • **使用java+zxing 简单快速的生成二维码。** 效果图: 首先需要引入两个jar文件: dependency> groupId>commons-codecgroupId> artifactId>commons-codecartifactId> version>1.8version> dependency> ...
    **使用java+zxing 简单快速的生成二维码。**
    

    效果图:
    生成的二维码

    首先需要引入两个jar文件:

        <dependency>
          <groupId>commons-codec</groupId>
          <artifactId>commons-codec</artifactId>
          <version>1.8</version>
        </dependency>
        <dependency>
          <groupId>com.google.zxing</groupId>
          <artifactId>javase</artifactId>
          <version>3.0.0</version>
        </dependency>
    
    

    下面就是生成二维码的工具类:

        public class CreatrQrCode{
        // logo默认边框颜色
        public static final Color DEFAULT_BORDERCOLOR = Color.WHITE;
        // logo默认边框宽度
        public static final int DEFAULT_BORDER = 1;
        // logo大小默认为照片的1/6
        public static final int DEFAULT_LOGOPART = 6;
    
        private final int border = DEFAULT_BORDER;
        private final Color borderColor;
        private final int logoPart;
    
        /**
         * Creates a default config with on color {@link #BLACK} and off color
         * {@link #WHITE}, generating normal black-on-white barcodes.
         */
        public CreatrQrCode() {
            this(DEFAULT_BORDERCOLOR, DEFAULT_LOGOPART);
        }
    
        public demo02(Color borderColor, int logoPart) {
            this.borderColor = borderColor;
            this.logoPart = logoPart;
        }
    
        public Color getBorderColor() {
            return borderColor;
        }
    
        public int getBorder() {
            return border;
        }
    
        public int getLogoPart() {
            return logoPart;
        }
    
        /**
         * 给二维码图片添加Logo
         *
         * @param qrPic
         * @param logoPic
         */
        public static void addLogo_QRCode(File qrPic, File logoPic, CreatrQrCode logoConfig) {
            try {
                if (!qrPic.isFile() || !logoPic.isFile()) {
                    System.out.print("file not find !");
                    System.exit(0);
                }
    
                /**
                 * 读取二维码图片,并构建绘图对象
                 */
                BufferedImage image = ImageIO.read(qrPic);
                Graphics2D g = image.createGraphics();
    
                /**
                 * 读取Logo图片
                 */
                BufferedImage logo = ImageIO.read(logoPic);
    
                int widthLogo = image.getWidth() / logoConfig.getLogoPart();
                //    int    heightLogo = image.getHeight()/logoConfig.getLogoPart();
                int heightLogo = image.getWidth() / logoConfig.getLogoPart(); //保持二维码是正方形的
    
                // 计算图片放置位置
                int x = (image.getWidth() - widthLogo) / 2;
                int y = (image.getHeight() - heightLogo) / 2;
    
    
                //开始绘制图片
                g.drawImage(logo, x, y, widthLogo, heightLogo, null);
                g.drawRoundRect(x, y, widthLogo, heightLogo, 10, 10);
                g.setStroke(new BasicStroke(logoConfig.getBorder()));
                g.setColor(logoConfig.getBorderColor());
                g.drawRect(x, y, widthLogo, heightLogo);
    
                g.dispose();
    
                ImageIO.write(image, "jpeg", new File("D:/ceshi/789.png"));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * @param pressText 文字
         * @param newImg    带文字的图片
         * @param targetImg 需要添加文字的图片
         * @param fontStyle
         * @param color
         * @param fontSize
         * @param width
         * @param height
         * @为图片添加文字
         */
        public static void pressText(String pressText, String newImg, String targetImg, int fontStyle, Color color, int fontSize, int width, int height) {
    
            //计算文字开始的位置
            //x开始的位置:(图片宽度-字体大小*字的个数)/2
            int startX = (width - (fontSize * pressText.length())) / 2;
            //y开始的位置:图片高度-(图片高度-图片宽度)/2
            int startY = height - (height - width) / 2;
    
            try {
    public class CreatrQrCode {
        // logo默认边框颜色
        public static final Color DEFAULT_BORDERCOLOR = Color.WHITE;
        // logo默认边框宽度
        public static final int DEFAULT_BORDER = 1;
        // logo大小默认为照片的1/6
        public static final int DEFAULT_LOGOPART = 6;
    
        private final int border = DEFAULT_BORDER;
        private final Color borderColor;
        private final int logoPart;
    
        /**
         * Creates a default config with on color {@link #BLACK} and off color
         * {@link #WHITE}, generating normal black-on-white barcodes.
         * 在颜色{@ link #黑}和颜色上创建一个默认配置
         *  {@link # WHITE},生成正常的黑白条码。
         */
        public CreatrQrCode() {
            this(DEFAULT_BORDERCOLOR, DEFAULT_LOGOPART);
        }
    
        public CreatrQrCode(Color borderColor, int logoPart) {
            this.borderColor = borderColor;
            this.logoPart = logoPart;
        }
    
        public Color getBorderColor() {
            return borderColor;
        }
    
        public int getBorder() {
            return border;
        }
    
        public int getLogoPart() {
            return logoPart;
        }
    
        /**
         * 给二维码图片添加Logo
         *
         * @param qrPic
         * @param logoPic
         */
        public static void addLogo_QRCode(File qrPic, File logoPic, CreatrQrCode creatrQrCode) {
            try {
                if (!qrPic.isFile() || !logoPic.isFile()) {
                    System.out.print("file not find !");
                    System.exit(0);
                }
    
                /**
                 * 读取二维码图片,并构建绘图对象
                 */
                BufferedImage image = ImageIO.read(qrPic);
                Graphics2D g = image.createGraphics();
    
                /**
                 * 读取Logo图片
                 */
                BufferedImage logo = ImageIO.read(logoPic);
    
                int widthLogo = image.getWidth() / creatrQrCode.getLogoPart();
                //    int    heightLogo = image.getHeight()/logoConfig.getLogoPart();
                int heightLogo = image.getWidth() / creatrQrCode.getLogoPart(); //保持二维码是正方形的
    
                // 计算图片放置位置
                int x = (image.getWidth() - widthLogo) / 2;
                int y = (image.getHeight() - heightLogo) / 2;
    
    
                //开始绘制图片
                g.drawImage(logo, x, y, widthLogo, heightLogo, null);
                g.drawRoundRect(x, y, widthLogo, heightLogo, 10, 10);
                g.setStroke(new BasicStroke(creatrQrCode.getBorder()));
                g.setColor(creatrQrCode.getBorderColor());
                g.drawRect(x, y, widthLogo, heightLogo);
    
                g.dispose();
    
                ImageIO.write(image, "jpeg", new File("D:/ceshi/789.png"));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * @param pressText 文字
         * @param newImg    带文字的图片
         * @param targetImg 需要添加文字的图片
         * @param fontStyle
         * @param color
         * @param fontSize
         * @param width
         * @param height
         * @为图片添加文字
         */
        public static void pressText(String pressText, String newImg, String targetImg, int fontStyle, Color color, int fontSize, int width, int height) {
    
            //计算文字开始的位置
            //x开始的位置:(图片宽度-字体大小*字的个数)/2
            int startX = (width - (fontSize * pressText.length())) / 300;
            //y开始的位置:图片高度-(图片高度-图片宽度)/2
            int startY = height - (height - width) / 3;
    
            try {
                File file = new File(targetImg);
                Image src = ImageIO.read(file);
                int imageW = src.getWidth(null);
                int imageH = src.getHeight(null);
                BufferedImage image = new BufferedImage(imageW, imageH, BufferedImage.TYPE_INT_RGB);
                Graphics g = image.createGraphics();
                g.drawImage(src, 0, 0, imageW, imageH, null);
                g.setColor(color);
                g.setFont(new Font(null, fontStyle, fontSize));
                g.drawString(pressText, startX, startY);
                g.dispose();
    
                FileOutputStream out = new FileOutputStream(newImg);
                ImageIO.write(image, "JPEG", out);
                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
                encoder.encode(image);
                out.close();
                System.out.println("image press success");
            } catch (Exception e) {
                System.out.println(e);
            }
        }
     }

    在主函数中测试一下我们的的工具类有没有问题:

     public static void main(String args[]) {
            try {
                //二维码表示的内容
                String content = "http://www.baidu.com";
    
                //存放logo的文件夹
                String path = "D:/ceshi/";
    
                MultiFormatWriter
                        multiFormatWriter = new MultiFormatWriter();
    
                @SuppressWarnings("rawtypes")
                Map hints = new HashMap();
    
                //设置UTF-8, 防止中文乱码
                hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
                //设置二维码四周白色区域的大小
                hints.put(EncodeHintType.MARGIN,0);
                //设置二维码的容错性
                    hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
    
                //width:图片完整的宽;height:图片完整的高
                //因为要在二维码下方附上文字,所以把图片设置为长方形(高大于宽)
                int width = 400;
                int height = 460;
    
                //画二维码,记得调用multiFormatWriter.encode()时最后要带上hints参数,不然上面设置无效
                BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, width, height, hints);
    
                //qrcFile用来存放生成的二维码图片(无logo,无文字)
                File qrcFile = new File(path,"wutu.jpg");
    
                //logoFile准备放在二维码中的图片(path:图片路径,图片名称)
                File logoFile = new File(path,"shilinwei.jpg");
    
                //开始画二维码
                MatrixToImageWriter.writeToFile(bitMatrix, "jpg", qrcFile);
    
                //在二维码中加入图片
                CreatrQrCode creatrQrCode = new CreatrQrCode(); //LogoConfig中设置Logo的属性
                addLogo_QRCode(qrcFile, logoFile, creatrQrCode);
    
    
                int font = 20; //字体大小
                int fontStyle = 4; //字体风格
    
                //用来存放的带有logo+文字的二维码图片
                String newImageWithText = "D:/ceshi/456.jpg";
                //带有logo二维码图片
                String targetImage = "D:/ceshi/789.png";
                //附加在图片上的文字信息
                String text = "my name is Shi Linwei";
    
                //在二维码下方添加文字(文字居中)
                pressText(text, newImageWithText, targetImage, fontStyle, Color.red, font,  width,  height) ;
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    我运行后的所有图片文件:
    这里写图片描述

    完事了,路过的大神请多多指点,谢谢

    展开全文
  • vue生成二维码图片,这里使用的是qrcode.js 这个插件(亲测写法,兼容没有问题) 第一步,下载插件 需要注意,这里下载的是qrcodejs2 cnpm install --save qrcodejs2 第二步,在组件使用 <template> ...
  • Java生成二维码图片

    2020-07-29 14:20:20
    Java代码直接生成专属二维码图片二维码图片解析。Web前端二维码以图片显示。生成二维码可以用维修,QQ,支付宝等扫一扫可以直接访问。
  • 因为要用到二维码解析,所以就使用了zxing的图片进行识别,开始时图片大小随意传输,有手机拍照图片,有手机截图图片,还有电脑截图图片,各种大小不一致,就导致zxing的识别率特别低。 后续想到了图片处理,测试了...
  • 图片下载(二维码) 方法一: function getImageDataURL(downloadName,url){ const tag = document.createElement('a'); //图片下载时的名称,注意:名称中不能有半角点,否则下载时后缀名会错误 tag....
  • 代码识别图片二维码方法 大体分两种 1、查资料 理解二维码生成原理,自己搬砖解码 2、是有类库(第三方包) 二维码中包含的信息: 空白区(边界) 位置探测区 分隔符 定位图形 矫正图形 格式信息 版本信息 功能数据...
  • 微信长按图片无法弹出识别二维码选项解决方案

    万次阅读 多人点赞 2016-11-28 19:54:27
    1.首先页面中有两个二维码的兄弟别忙活了,一个页面中只可以识别其中一个二维码,两个的话需提示用户双击放大二维码进行二维码识别. 2.网页内有一张图片进行二维码识别时长按没有反应这个就是我所遇到的问题。需要调...
  • 提高二维码识别率

    万次阅读 2013-12-09 12:02:32
    一般情况下的二维码都是很容易识别的,这里指的是直接在电脑上或手机上生成的二维码图片,这类图片由于直接生成的,所以都很清晰,很容易识别出来。 我这里所说的二维码的识别率指的下类的二维码: 1.二维码打印...
  • 扫描二维码的url(个人码、收款码、支付码、群聊码都支持) 直接百度二维码在线扫描,把你的二维码上传扫描结果 我用的是草料二维码扫描器:https://cli.im/deqr 生成新的二维码 把你二维码扫描结果辅助粘贴到生成器...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • js生成带有图片logo的二维码

    千次阅读 2017-04-24 11:19:20
    1:链接:http://blog.csdn.net/xuanzhangran/article/details/63251587 自动生成二维码。 2:链接:http://blog.csdn.net/zbw18297786698/article/details/52819173 将图片加入二维码
  • 接入微信扫码支付会返回一个 code_url 的二维码链接,可以通过QRCode.js来生成一个二维码图片,十分简单,请参考如下链接 QRCode.js:使用 JavaScript 生成二维码...
  • 如何找出一张图片中的所有二维码并分别识别出他们的内容。毕业设计想选的没选到选了一个完全没方向的大哥们会这个的求指教啊
  • 发现一个生成二维码的小工具visual-qr-code,java的,很不错的小工具 不是我做的,码云地址:https://gitee.com/boat824109722/visual-qr-code 为这位大哥的开源精神点赞,已star 其实主要就是一个java类,工程中...
  • 像膜拜单车一样,二维码下方还有一行字符串, 这种格式在图片生成的时候,怎么添加进去?往大家给个实现逻辑
  • 转载自:在web页面上快速生成二维码的三种实用...这种方式简单快速,在服务端生成一个二维码的图片,兼容性比较好,你无需自己处理任何相关二维码的生成,只需要提供一端文字或者url即可,可以控制二维码图片大小,方法
  • 为了实现app扫描二维码,我想了很多办法,最后还是用原生的来挑战自己,下面是链接 http://www.html5plus.org/doc/zh_cn/barcode.html
1 2 3 4 5 ... 20
收藏数 65,001
精华内容 26,000
关键字:

二维码图片