长按识别图中二维码

本文介绍了如何实现在Android应用中实现长按识别二维码的功能。通过监听长按事件,保存当前屏幕截图,然后解析截图中的二维码,展示识别结果。详细步骤包括获取屏幕截图、解析二维码图片以及使用QRCodeReader进行解码。
部署运行你感兴趣的模型镜像
iv_zxingimag  .setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View viewm) {
        saveCurrentImage();
        return false;
    }
});

private void saveCurrentImage() {
    //获取当前屏幕的大小
    int width = getWindow().getDecorView().getRootView().getWidth();
    int height = getWindow().getDecorView().getRootView().getHeight();
    //生成相同大小的图片
    Bitmap temBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    //找到当前页面的根布局
    View view = getWindow().getDecorView().getRootView();
    //设置缓存
    view.setDrawingCacheEnabled(true);
    view.buildDrawingCache();
    //从缓存中获取当前屏幕的图片,创建一个DrawingCache的拷贝,因为DrawingCache得到的位图在禁用后会被回收
    temBitmap = view.getDrawingCache();
    SimpleDateFormat df = new SimpleDateFormat("yyyymmddhhmmss");
    final String time = df.format(new Date());
    if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
        File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/screen", time + ".png");
        if (!file.exists()) {
            file.getParentFile().mkdirs();
            try {
                file.createNewFile();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(file);
            temBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
            fos.flush();
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        new Thread(new Runnable() {
            @Override
            public void run() {
                String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/screen/" + time + ".png";
                final Result result = parseQRcodeBitmap(path);
                runOnUiThread(new Runnable() {
                    public void run() {
                        if (null != result) {
                            Toast.makeText(TakewayActivity.this, result.toString(), Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(TakewayActivity.this, "无法识别", Toast.LENGTH_LONG).show();
                        }
                    }
                });
            }
        }).start();
        //禁用DrawingCahce否则会影响性能 ,而且不禁止会导致每次截图到保存的是第一次截图缓存的位图
        view.setDrawingCacheEnabled(false);
    }
}
//解析二维码图片,返回结果封装在Result对象中
private Result parseQRcodeBitmap(String bitmapPath) {
    //解析转换类型UTF-8
    Hashtable<DecodeHintType, String> hints = new Hashtable<DecodeHintType, String>();
    hints.put(DecodeHintType.CHARACTER_SET, "utf-8");
    //获取到待解析的图片
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    Bitmap bitmap = BitmapFactory.decodeFile(bitmapPath, options);
    options.inSampleSize = options.outHeight / 400;
    if (options.inSampleSize <= 0) {
        options.inSampleSize = 1; //防止其值小于或等于0
    }
    options.inJustDecodeBounds = false;
    bitmap = BitmapFactory.decodeFile(bitmapPath, options);
    //新建一个RGBLuminanceSource对象,将bitmap图片传给此对象
    RGBLuminanceSource rgbLuminanceSource = new RGBLuminanceSource(bitmap);
    //将图片转换成二进制图片
    BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(rgbLuminanceSource));
    //初始化解析对象
    QRCodeReader reader = new QRCodeReader();
    //开始解析
    Result result = null;
    try {
        result = reader.decode(binaryBitmap, hints);
    } catch (Exception e) {
        // TODO: handle exception
    }
    return result;
}
public class RGBLuminanceSource extends LuminanceSource {

    private byte bitmapPixels[];

    protected RGBLuminanceSource(Bitmap bitmap) {
        super(bitmap.getWidth(), bitmap.getHeight());

        // 首先,要取得该图片的像素数组内容
        int[] data = new int[bitmap.getWidth() * bitmap.getHeight()];
        this.bitmapPixels = new byte[bitmap.getWidth() * bitmap.getHeight()];
        bitmap.getPixels(data, 0, getWidth(), 0, 0, getWidth(), getHeight());

        // int数组转换为byte数组,也就是取像素值中蓝色值部分作为辨析内容
        for (int i = 0; i < data.length; i++) {
            this.bitmapPixels[i] = (byte) data[i];
        }
    }

    @Override
    public byte[] getMatrix() {
        // 返回我们生成好的像素数据
        return bitmapPixels;
    }

    @Override
    public byte[] getRow(int y, byte[] row) {
        // 这里要得到指定行的像素数据
        System.arraycopy(bitmapPixels, y * getWidth(), row, 0, getWidth());
        return row;
    }
}

您可能感兴趣的与本文相关的镜像

HunyuanVideo-Foley

HunyuanVideo-Foley

语音合成

HunyuanVideo-Foley是由腾讯混元2025年8月28日宣布开源端到端视频音效生成模型,用户只需输入视频和文字,就能为视频匹配电影级音效

### 识别二维码功能的实现 在 ArkTS 中,要实现识别二维码的功能,可以通过 `LongPress` 事件监听用户的按操作,并结合摄像头或像处理模块完成二维码的解析。以下是具体的实现方式: #### 用户界面设计 通过 `Column` 和 `Row` 布局构建用户界面,提供一个可触发按事件的区域用于启动二维码扫描。 ```typescript import { Column, Row, Text, Image } from '@ohos/arkui'; import { LongPressEvent } from '@ohos/gesture'; // 定义组件结构 @Entry @Component struct QRCodeScanner { @State isScanning: boolean = false; private handleLongPress(event: LongPressEvent): void { this.isScanning = true; console.log('Long press detected'); // 调用二维码扫描逻辑 this.scanQRCode(); } build() { Column() { Row() { Text('按此处识别二维码') .fontSize(16) .margin({ top: 20 }) .onLongPress(this.handleLongPress.bind(this)) } .width('90%') .height('30%') if (this.isScanning) { Text('正在扫描...') .color('#FF0000') .fontSize(18); } } .padding({ top: 50 }); } private scanQRCode(): void { // 使用设备摄像头或其他API调用二维码扫描服务 const qrResult = '模拟扫码结果'; // 替代实际扫描返回的结果 console.info(`Scan result: ${qrResult}`); this.isScanning = false; // 扫描完成后关闭状态 } } ``` #### 关键点说明 1. **按事件绑定** 在 `Text` 或其他 UI 组件上绑定 `onLongPress` 方法,当检测到用户按时会触发回调函数[^2]。 2. **二维码扫描逻辑** 实际应用中需要集成系统的相机 API 或第三方 SDK 来捕获二维码数据。这里使用了一个占位符 `scanQRCode()` 函数表示该过程[^3]。 3. **UI 反馈机制** 当进入扫描模式时,更新界面上的状态提示(如 “正在扫描...”),提升用户体验[^4]。 --- ### 注意事项 - 如果目标平台支持原生相机访问,则需申请权限并配置相关设置。 - 对于复杂场景下的二维码识别,建议引入成熟的 OCR 或条码解码库以提高准确性[^5]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值