hartyu 2023-07-14 19:21 采纳率: 100%
浏览 55
已结题

android Bitmap 转 ImageProxy

android Bitmap 转 ImageProxy?
一个人脸识别的项目需要通过H5的方式传照片给android对比,现在找到一个免费的离线识别,通过分析代码

// 1. Camera 的初始化
        int cameraLens = sharedPref.getInt("cameraFlag", sharedPref.getInt("cameraFlag", 0));
        CameraXAnalyzeFragment cameraXFragment = CameraXAnalyzeFragment.newInstance(cameraLens);
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_camerax, cameraXFragment)
                .commit();

        cameraXFragment.setOnAnalyzerListener(imageProxy -> {

            Log.e("vhg", String.valueOf(imageProxy));

            //可以加个红外检测之类的,有人靠近再启动检索服务
            if (!isDestroyed() && !isFinishing()) {
                FaceSearchEngine.Companion.getInstance().runSearch(imageProxy, 0);
            }
        });

他是获取相机的图片流imageProxy 方式,我希望通过 image转 imageProxy的方式来实现。


  • 写回答

6条回答 默认 最新

  • 田猿笔记 2023-07-15 13:01
    关注

    要将 Android 的 Bitmap 转换为 ImageProxy,你可以使用 Jetpack CameraX 库。以下是一个示例代码,展示了如何将 Bitmap 转换为 ImageProxy:

    import androidx.camera.core.ImageProxy
    import android.graphics.Bitmap
    import android.media.Image
    import android.media.Image.Plane
    import androidx.core.graphics.BitmapCompat
    import androidx.core.graphics.BitmapCompat.*
    import java.nio.ByteBuffer
    
    fun bitmapToImageProxy(bitmap: Bitmap): ImageProxy {
        val planes = arrayOfNulls<Plane>(1)
        val buffer = ByteBuffer.allocate(bitmap.byteCount)
        bitmap.copyPixelsToBuffer(buffer)
        val pixels = buffer.array()
    
        val width = bitmap.width
        val height = bitmap.height
    
        val imageProxy = object : ImageProxy {
            override fun getWidth(): Int {
                return width
            }
    
            override fun getHeight(): Int {
                return height
            }
    
            override fun getCropRect(): Int {
                return 0 // 这里可以返回剪裁的矩形区域,如果不需要剪裁,返回0即可
            }
    
            override fun getImage(): Image {
                return object : Image {
                    override fun getPlanes(): Array<Plane> {
                        return planes
                    }
    
                    override fun getFormat(): Int {
                        return ImageFormat.YUV_420_888
                    }
    
                    override fun getWidth(): Int {
                        return width
                    }
    
                    override fun getHeight(): Int {
                        return height
                    }
    
                    override fun getTimestamp(): Long {
                        return System.currentTimeMillis() * 1000000 // 这里可以返回图片的时间戳
                    }
    
                    override fun getScalingMode(): Int {
                        return SCALING_MODE_SCALE_TO_FIT
                    }
    
                    override fun close() {
                        // 释放资源
                    }
                }
            }
    
            override fun setCropRect(i: Int) {
                // 设置剪裁的矩形区域
            }
    
            override fun getImageInfo(): ImageInfo {
                return object : ImageInfo {
                    override fun getRotationDegrees(): Int {
                        return 0 // 这里可以返回图片的旋转角度
                    }
                }
            }
    
            override fun getPlanes(): Array<Plane> {
                return planes
            }
    
            override fun getFormat(): Int {
                return ImageFormat.YUV_420_888
            }
    
            override fun getTimestamp(): Long {
                return System.currentTimeMillis() * 1000000 // 这里可以返回图片的时间戳
            }
    
            override fun close() {
                // 释放资源
            }
        }
    
        planes[0] = object : Plane {
            override fun getBuffer(): ByteBuffer {
                return ByteBuffer.wrap(pixels)
            }
    
            override fun getPixelStride(): Int {
                return 1
            }
    
            override fun getRowStride(): Int {
                return width
            }
        }
    
        return imageProxy
    }
    

    上述代码将 Bitmap 转换为 ImageProxy 对象,其中 ImageProxy 代表一个图像,可以通过该对象的方法获取图像的信息和数据。

    请注意,上述示例代码中的 ImageProxy 实现仅提供了一些必要的方法,具体根据你的需求进行修改和完善。另外,代码中的图像格式为 YUV_420_888,如果你的图像格式不同,可以相应地进行修改。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 7月27日
  • 已采纳回答 7月19日
  • 创建了问题 7月14日

悬赏问题

  • ¥20 数学建模,尽量用matlab回答,论文格式
  • ¥15 昨天挂载了一下u盘,然后拔了
  • ¥30 win from 窗口最大最小化,控件放大缩小,闪烁问题
  • ¥20 易康econgnition精度验证
  • ¥15 msix packaging tool打包问题
  • ¥28 微信小程序开发页面布局没问题,真机调试的时候页面布局就乱了
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能