Flutter ui.ImageByteFormat.rawRgba 图像质量很差

Flutter ui.ImageByteFormat.rawRgba has terrible Image Quality

在我的项目中,我需要捕获颤动动画的帧并将该帧作为图像(可能是 .png 格式)保存到设备存储中。

我正在使用 RepaintBoundary 来捕获帧,但我不能使用 ui.ImageByteFormat.png 方法,因为将帧捕获为 .png 需要很多处理时间,而且我需要采取很多框架,这不是一个可行的解决方案。相反,我使用的是超快的 ui.ImageByteFormat.rawRgba,但是当我将它保存到存储时,图像质量很糟糕。看起来和我拍的一模一样。

我正在使用 FFMPEG 将 .raw 或 .bmp 格式转换为 png 并将其保存到存储中。

在这两种情况下,使用 raw 或使用 BitMap 输出图像都是这样的:

但是,画质应该是这样的

现在,我需要帮助以通过使用无关紧要的任何文件格式来高质量地保存此原始捕获,或者如果您有任何其他可行的方法来捕获颤动动画的帧,请分享。

恕我直言,这与质量无关(例如,“模糊”图像质量差)。那是因为格式上有一些问题 - encoding/decoding 肯定有人错误地理解了格式。

查看您的代码后,很可能您的 Bitmap.fromHeadless(300,100,bytes) 有问题。图片不是 300x100!请更正尺寸。

让我解释一下“raw”或“bmp”格式。基本上,该格式只是将像素一个接一个地放入一个大字节列表中。例如,数组看起来像:["red at (0,0)", "green at (0,0)", "blue at (0,0)", "alpha at (0,0)", "red at (0,1)", "green at (0,1)", "blue at (0,1)", "alpha at (0,1)", ...]。注意它是行主要顺序。换句话说,顺序类似于“pixel0,0”、“pixel0,1”、...“pixel0,k”、“pixel1,0”、...

因此,如果您指定了错误的尺寸,则会被错误地解释 - 这就是为什么您会看到那张看起来很奇怪的图片!

关于如何获取尺寸:在 ui.Image image = await boundary.toImage(pixelRatio: 3); 行之后,您可以简单地执行 image.widthimage.height 以获得正确的尺寸。

有不明白之处请回复,我愿意解释;)