# Zxing二维码扫描图片预览变形的问题解决

本文介绍如何解决ZXing二维码扫描时预览图片的变形问题,通过修改CameraConfigurationManager类中的findBestPreviewSizeValue方法,确保预览图片尺寸比例与实际图片尺寸比例一致,从而避免变形。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

研究使用了ZXing来实现扫描二维码的功能,根据demo写的移植过来,扫描速度还行,因为zxing自带的声音不好听,然后又剽窃了微信的beep声音,基本差不多的时候,发现扫描二维码预览的时候,中间的预览图片和二维码有轻微变形。于是就从网上搜索并研究了一下,终于解决了,在此简单分享一下:

http://blog.youkuaiyun.com/xiaanming/article/details/10163203
[这是我参考的大神的博客,讲的很详细,也有demo可以下载]

然后,因为我嫌中间扫描的预览区域不是正方形,我就自己修改成正方形了,修改方法:

package com.mining.app.zxing.camera;

/**
 * This object wraps the Camera service object and expects to be the only one
 * talking to it. The implementation encapsulates the steps needed to take
 * preview-sized images, which are used for both preview and decoding.
 * 此对象包装相机服务对象,并希望是唯一一个与它交互的对象。 封装了实现需要预览步骤大小的图像,用于预览和解码。
 * 
 */
public final class CameraManager {

    private static final String TAG = CameraManager.class.getSimpleName();

    private static final int MIN_FRAME_WIDTH = 240;
    private static final int MIN_FRAME_HEIGHT = 240;
    private static final int MAX_FRAME_WIDTH = 480;
    private static final int MAX_FRAME_HEIGHT = 480;//修改使宽高相等即可

    private static CameraManager cameraManager;

然后,就是预览变形的问题了,首先,你应该知道一件很重要的事,就是为什么预览的照片会变形.

http://www.360doc.com/content/14/0825/15/16319846_404515413.shtml

每部手机中设置了好几组预览图片的尺寸、以及实际图片的尺寸。只有当预览图的尺寸比例和实际图片的比例相同的时候才不会出现变形的情况。

对于ZXing扫描来说,实际图片的大小就是屏幕的大小,所以我们要从好几组预览图片的尺寸中找到一组最合适的,这样预览的图片就不会变形了。这就需要我们修改CameraConfigurationManager类中findBestPreviewSizeValue方法:

com.mining.app.zxing.camera.CameraConfigurationManager.java

private static Point findBestPreviewSizeValue(CharSequence previewSizeValueString, Point screenResolution) {
    int bestX = 0;
    int bestY = 0;
    float diff = Float.MAX_VALUE;//此处修改类型
    Log.d(TAG, "screen point: "+screenResolution);
    for (String previewSize : COMMA_PATTERN.split(previewSizeValueString)) {
      previewSize = previewSize.trim();
      int dimPosition = previewSize.indexOf('x');
      if (dimPosition < 0) {
        Log.w(TAG, "Bad preview-size: " + previewSize);
        continue;
      }

      int newX;
      int newY;
      try {
        newX = Integer.parseInt(previewSize.substring(0, dimPosition));
        newY = Integer.parseInt(previewSize.substring(dimPosition + 1));
      } catch (NumberFormatException nfe) {
        Log.w(TAG, "Bad preview-size: " + previewSize);
        continue;
      }

    //caculate best solusion
    //int newDiff = Math.abs(newX - screenResolution.x) + Math.abs(newY - screenResolution.y);
    //获取x,y比例最相近的一个,此处重写方案
      float newDiff = Math.abs(screenResolution.x * 1.0f / newY - screenResolution.y * 1.0f / newX);
      if (newDiff == 0) {
        bestX = newX;
        bestY = newY;
        break;
      } else if (newDiff < diff) {
        bestX = newX;
        bestY = newY;
        diff = newDiff;
      }
      Log.w(TAG, "preview-size: " + previewSize +", newDiff: "+newDiff+", diff: "+diff);
    }

 if (bestX > 0 && bestY > 0) {
      return new Point(bestX, bestY);
    }

    return null;
 }

这样就基本解决了预览变形的问题。剩下的就是优化了,现在如果手机离得太近,识别还是很慢,微信就优化的可好,继续研究.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值