【问题标题】:getting jpg image from raw framebuffer data从原始帧缓冲区数据中获取 jpg 图像
【发布时间】:2013-02-19 16:25:36
【问题描述】:

我能够获得 android framebuffer。但我不知道如何将这些原始字节转换为 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();`

【问题讨论】:

标签: java android framebuffer


【解决方案1】:

在 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 用于“块大小”。在示例中 480x4=1920(480 像素高,每像素 4 个字节)
    • count 是计算从if 读取和写入of 的“块大小”(即在这里我们读/写宽度大小)
    • 第二张图片的skip 是要跳过的“块大小”的 nb(即从第一张图片中跳过 count 的 nb)

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

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

图像会根据您的设备以 RGB32、BGR32...像素格式进行编码。您需要重新编码它们以获得 JPG 或 PNG... 您可能会在 Stackoverflow 上找到使用 ffmpeg 的示例。一个简单的例子是(对于 RGB32 设备的情况,屏幕为 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

【讨论】:

  • 感谢您的宝贵回答。但我不明白您上面的四行代码例如:-keywords(dd,bs,count)。您能用更简单的方式解释一下吗?还有这两个或更多的帧缓冲区图像是设备屏幕的同一时间还是连续的?以及如何知道每个帧缓冲区图像的长度?
猜你喜欢
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多