【问题标题】:Flutter ui.ImageByteFormat.rawRgba has terrible Image QualityFlutter ui.ImageByteFormat.rawRgba 的图像质量很差
【发布时间】:2021-06-30 10:08:28
【问题描述】:

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

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

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

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

但是,图像的质量应该是这样的

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

【问题讨论】:

    标签: android flutter dart bitmap rgba


    【解决方案1】:

    恕我直言,这与质量无关(例如,“模糊”图像的质量很差)。那是因为格式存在一些问题——编码/解码时一定有人错误地理解了格式。

    查看您的代码后,您的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 即可获得正确的尺寸。

    如果有不明白的地方请回复,我愿意解释;)

    【讨论】:

    • 谢谢,你不知道你对我有多大帮助!最美好的祝愿!
    • @RajDhakad 很高兴听到这个消息!您可以将赏金奖励给这个答案(请参阅this article 的最后一部分了解如何做到这一点)
    • 我在发表评论之前就已经获得了赏金。
    • @RajDhakad 有点奇怪……在这个页面中仍然可以看到“赏金在 6 天后结束”
    • 好吧,现在检查...再次感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2016-05-25
    • 2020-01-22
    • 2010-10-22
    • 1970-01-01
    • 2015-04-23
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多