ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2021SC@SDUSC Zxing开源代码(六)图像解码处理

2021-10-28 19:59:39  阅读:171  来源: 互联网

标签:null 2021SC 解码 Zxing decode 图像 message 源代码 id


文章目录


前言

通过上篇博客的分析,我们已经明确了扫码解码的大致流程,了解了如何获取相机的一帧图像数据,并进行消息传递。这篇博客则用于详细分析在获得了图像数据后,如何进行具体的图像解码处理,其消息处理时序图如下:
在这里插入图片描述
首先先看一下传递的message对象,其中各个参数取值为:

参数取值
what(消息标识)R.id.decode
arg1(整型参数)相机分辨率的宽度
arg2(整型参数)相机分辨率的高度
obj(传递对象)byte[] data 表示预览图像的数据

一、基础知识

二、图像解码处理

首先先看一下传递的message对象,其中各个参数取值为:

参数取值
what(消息标识)R.id.decode
arg1(整型参数)相机分辨率的宽度
arg2(整型参数)相机分辨率的高度
obj(传递对象)byte[] data 表示预览图像的数据

1. DecodeHandler 处理图像解码

处理从子线程发送过来的消息 handleMessage

由于之前已经注入了处理器,则发送的消息则会传递到decodehandler的handleMessage方法中

  public void handleMessage(Message message) {
    if (message == null || !running) {
      return;
    }
    // 取消息标识头
    switch (message.what) {
      case R.id.decode:
        // 调用decode方法
        decode((byte[]) message.obj, message.arg1, message.arg2);
        break;
      case R.id.quit:
        running = false;
        Looper.myLooper().quit();
        break;
    }
  }

这里对应消息标识头为 ‘R.id.decode’ ,则调用 DecodeHandler 的decode方法,下面看一下这个方法

进行图像解码 decode

private void decode(byte[] data, int width, int height) {
    // 返回的解码结果
    Result rawResult = null;
    // 转换从相机设备中返回的YUV数据数组,可以选择性的将YUV的完整数据剪切其中一部分用于解析,以加快速度
    PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(data, width, height);
    if (source != null) {
      // 将图片进行混合二值化,创建二值化的比特位图
      BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
      try {
        // 调用核心算法,返回解码结果
        rawR、esult = multiFormatReader.decodeWithState(bitmap);
      } catch (ReaderException re) {
      } finally {
        multiFormatReader.reset();
      }
    }
    Handler handler = activity.getHandler();
    if (rawResult != null) {
      if (handler != null) {
        // 创建并发送解码成功的message
        Message message = Message.obtain(handler, R.id.decode_succeeded, rawResult);
        Bundle bundle = new Bundle();
        bundleThumbnail(source, bundle);
        message.setData(bundle);
        message.sendToTarget();
      }
    } else {
      if (handler != null) {
        // 创建并发送解码失败的message
        Message message = Message.obtain(handler, R.id.decode_failed);
        message.sendToTarget();
      }
    }
  }

分析来看的话,DecodeHandler 的 decode 方法主要完成了以下几个动作:

  • 首先实例化了 PlanarYUVLuminanceSource 对象,其主要作用是将传入的图像数据进行裁剪,去除掉扫描框以外的部分,以加快解码速度。
  • 而后将图片进行了二值化处理,将其赋值给一个二值比特位图
  • 将二值位图传入,调用 core.jar 的解码算法,返回解码结果
  • 发送解码成功(失败)的 message,接收方应该是 CaptureActivityHandler

2. CaptureActivityHandler 处理图像解码


总结

标签:null,2021SC,解码,Zxing,decode,图像,message,源代码,id
来源: https://blog.csdn.net/Dream_Glow/article/details/121021304

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有