1

我有一个 android 应用程序,并注意到它是 onImageAvailable(ImageReader imagereader) 函数,它在可用时从 ImageReader 获取图像并处理它们。我的目标是操纵该 Image 对象,以便它处理 png 文件,而不是从相机中获取该图像。所以,我想改变

    this.imagereader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
                    public final void onImageAvailable(ImageReader imageReader) {
                        Image image = imageReader.acquireLatestImage();
                    }
                }, this.thread1);

类似于


    this.imagereader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
                    public final void onImageAvailable(ImageReader imageReader) {
                        Image image = //png path;
                    }
                }, this.thread1);

可能吗?

4

1 回答 1

1

Image是由硬件缓冲区支持的系统资源,您不能只实现自己的变体。但是,您可以做的是ImageReader使用所需参数创建一个(您可能希望使用与原始应用程序期望的相同大小和格式),从中获取一个表面并将您的 png 绘制到该表面。您可以使用最适合您需求的绘图方法 - 调用lockCanvas并在 CPU 上绘图或使用 Vulkan / OpenGL / Renderscript(取决于图像格式,其中一些方法可能无法使用使用标志)。

另外,我不会使用另一个创建 ImageImageReader并将其注入onImageAvailable,而是考虑使用现有的ImageReader,但将图像的生产者(在您的情况下为相机)替换为您自己的。所以基本上你可以surface从现有的ImageReader而不是将其传递到相机会话中,只需自己绘制即可。

于 2021-09-25T16:42:52.250 回答