gpt4 book ai didi

java - 从原始帧缓冲区数据获取 jpg 图像

转载 作者:太空宇宙 更新时间:2023-11-03 12:37:34 24 4
gpt4 key购买 nike

我可以获取 android 帧缓冲区。但我不知道如何将这些原始字节转换为 jpg 图像文件。如果我尝试使用 java bufferedImage.setpixel 方法在笔记本电脑上绘制图像。我得到的彩色图像不正确

Process sh = Runtime.getRuntime().exec("su", null,null);    
OutputStream os = sh.getOutputStream();
os.write("/system/bin/cat /dev/graphics/fb0 > /sdcard/img.raw".getBytes());
os.flush();
os.close();
sh.waitFor();`

最佳答案

在 android 上,帧缓冲区中缓冲了 2 个或更多图像。所以当你像上面那样复制 fb0 文件时,里面至少有 2 个屏幕图像。您可以通过执行以下操作来拆分它们:

dd if=/sdcard/img.raw bs=<width_of_your_screen> \
count=<height_of_your_screen> of=/sdcard/img-1.raw
dd if=/sdcard/img.raw bs=<width_of_your_screen> \
count=<times height_of_your_screen> skip=<previous count> of=/sdcard/img-2.raw

例如,如果您的设备是 480x320,并且像素编码为 4 字节,您可以通过以下方式提取 2 个连续帧:

dd if=/sdcard/img.raw bs=1920 count=320 of=/sdcard/img-1.raw
dd if=/sdcard/img.raw bs=1920 count=320 skip=320 of=/sdcard/img-2.raw

如果 fb0 帧缓冲区中有 3 张图像:

dd if=/sdcard/img.raw bs=1920 count=320 skip=640 of=/sdcard/img-3.raw

地点:

  • dd 是一个 linux 实用程序,用于复制和转换带有参数的原始文件:

    • if 用于“输入文件”
    • of 用于“输出文件”
    • bs 用于“ block 大小”。例子中480x4=1920(480像素高,每像素4字节)
    • count 是计算从 if 中读取并写入到 of 中的“ block 大小”的数量(即这里我们读/写宽度尺寸)
    • skip 第二张图片是要跳过的“ block 大小”的 nb(即从第一张图片跳过 count 的 nb)

您可以通过将 block 大小设置为 480x320x4=614400 和 count=1 来使用更简单的命令,但如果您需要动态支持不同的屏幕尺寸,我发现拆分 bs 并像我的示例中那样使用参数更容易编程。

另请注意,如果您从设备外壳运行上述命令,您的设备可能没有 dd 命令。如果您安装了 busybox,您可以将 dd 替换为 busybox dd

图像根据您的设备以 RGB32、BGR32 等像素格式进行编码。您需要重新编码它们以获得 JPG 或 PNG...有使用 ffmpeg 的示例在 Stackoverflow 上,您可能会找到。一个简单的例子是(对于 RGB32 设备,屏幕 sixe 为 480x320):

ffmpeg -vframes 1 -vcodec rawvideo -f rawvideo -pix_fmt rgb32 -s 480x320 -i img-1.raw -f image2 -vcodec mjpeg img-1.jpg

如果您使用 ffmpeg,stackoverflow 上也有帖子指出如何为 android 构建它(即 https://stackoverflow.com/a/9681231/1012381)

关于java - 从原始帧缓冲区数据获取 jpg 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15220927/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com