【发布时间】:2019-03-24 15:36:51
【问题描述】:
我正在通过网络下载图像数据,显然它已被压缩。在应用程序内部,我需要数据与原始数据 100% 准确。因此,例如对于 720x720 图像,我需要一个 518400 长度的 int 数组或 2073600 长度的字节数组,其中的值尚未从原始值修改。由于PNG压缩是无损的,这应该是可能的。我注意到BitmapFactory在解码时应用了一些在查看图像时并不明显的心理视觉效果,但是稍微改变字节值(我假设这是为了速度和/或更好的屏幕视觉效果)。
我目前正在做的是使用 BitmapFactory.decode 然后迭代每个像素以从近似值中创建一个新数组并使用 Bitmap.create 创建一个新位图这是可能的,因为现在图像是二进制的并且是原始的图像每个像素是 (r, g, b, 255) 或 (0, 0, 0, 0)。我可以找到最流行的颜色,并将所有 alpha 值超过某个阈值的像素设置为此 RGB 值。这个解决方案虽然很慢,而且看起来很复杂。
所以我的问题是 - BitmapFactory.decode 的选项标志是否有任何组合返回原始位图的 100% 真实,还是我必须自己创建一个 PNG 解码器来实现这一点?
【问题讨论】:
-
我不知道
"psychovisual effects"是什么意思~你的意思是......你不必添加任何额外的标志,解码后的Bitmap将是原版的 100% 副本 -
我不知道你为什么认为位图正在被解码处理。您可以查看源代码并发现情况并非如此。
-
我认为你可以称之为抗锯齿,或者至少这个想法是相似的。我对图形不是很了解。对于二值图像,边缘像素仅被几个值扭曲。原始二进制图像在解码时应该只有 2 个颜色值,而在查看原始数据时却有大约 10 个不同的 RGB 值。这些值彼此之间略有不同。因此,例如,如果图像应具有 (255, 0, 0, 255) 和 (0, 0, 0, 0) 像素值,则它具有一些 (254, 0, 0, 255) 和一些 (254, 0, 0) , 10) 等。我想摆脱这种影响。
-
@pskink - 运行您的代码会产生预期的结果
-
@usr2564301 - BitmapFactory.decodeByteArray(bytes, 0, bytes.size) 是唯一相关的代码行。不幸的是,由于公司政策,我无法分享源数据。但谢谢你的评论。我将仔细查看源代码并尝试弄清楚到底发生了什么。
标签: android compression png android-bitmap bitmapfactory