[英]Flutter ui.ImageByteFormat.rawRgba has terrible Image Quality
在我的项目中,我需要捕获 flutter animation 的框架并将该框架作为图像(可能是 in.png)保存到设备存储。
我正在使用 RepaintBoundary 来捕获帧,但我不能使用ui.ImageByteFormat.png
方法,因为将帧捕获为 a.png 需要很多处理时间,而且由于我需要拍摄很多帧不会是一个可行的解决方案。 相反,我使用的是超级快的ui.ImageByteFormat.rawRgba
,但是当我将其保存到 Storage 时,图像质量很糟糕。 它看起来几乎与我捕获的图像相同。
我正在使用 FFMPEG 将 .raw 或 .bmp 格式转换为 png 并将其保存到存储中。
在这两种情况下,使用 raw 或使用 BitMap output 图像是这样的:
现在,我需要帮助以通过使用无关紧要的任何文件格式保存此原始捕获,或者如果您有任何其他可行的方法来捕获 flutter animation 的帧,请分享。
恕我直言,这与质量无关(例如,“模糊”图像质量差)。 那是因为格式上存在一些问题 - 编码/解码时必须有人错误地理解格式。
查看您的代码后,您的Bitmap.fromHeadless(300,100,bytes)
很可能有问题。 图像不是 300x100。 请更正尺寸。
让我解释一下“原始”或“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.width
和image.height
来获得正确的大小。
如果您有不明白的地方请回复,我愿意解释;)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.