4

我无法在 Android 上干净地缩小图像。我正在寻找在大约 10-100% 的原始大小的任意大小之间缩放小的 PNG 图像。

我创建了一个示例图像来演示问题并加剧我在 Android 的图像缩放器中看到的异常行为:

注意:您需要右键单击图像并直接查看...此页面可能会再次缩小图像 上图是 Android 设备的屏幕截图,添加了一些注释。我还在左侧的第二列中添加了相同的图像,显​​示了它们是如何通过“GIMP”(GNU 图像操作程序)以线性缩放呈现的。

基本图像由红色和蓝色像素的棋盘图案背景组成。在那个背景上,我画了一些 1px 宽的黄线和相当细的绿色文字。图像为 288x288 像素。

当将图像缩放到其原始尺寸的 1/3 时,Android 似乎只是抓取了九分之一的像素,而丢弃了所有其他数据。结果,一些黄线完全消失了。值得注意的是,棋盘图案保持不变(这只是每使用 3 个像素的结果)。

当将图像缩放到接近其原始大小的 50%(例如 142x142 或 143x143)的尺寸时,缩放器会在图像上产生一些相当大的异常/伪影。

在 50% 尺寸 (144x144) 下,图像看起来正确。

测试图像确实带出了最差的图像缩放器,但“正常”的 PNG 图标图像也受到了严重影响。10-33% 左右的图像没有正确重新采样,因此看起来非常“位图”。并且某些较大尺寸的图像在某些尺寸下具有非常奇怪的异常。

如果有人知道禁用这种奇怪的缩放行为的方法,即使是以性能为代价,我也会非常感激知道它。它当然可以通过编写一个直接作用于位图像素的算法来解决,但我希望这不是唯一的选择。

同样值得注意的是,所有图像工作都是使用 ARGB_8888 Bitmap.Configs 完成的。我尝试通过在 ImageViews 上设置 maxwidth/maxheight、使用 Bitmap.createScaledBitmap() 以及使用带有 Matrix 的 Bitmap.createBitmap 来操纵图像大小。所有尝试都有相同的结果。位图过滤已启用。

再次感谢您的任何建议!

4

1 回答 1

2

使用带 Matrix 的 Bitmap.createScaledBitmap() 和 Bitmap.createBitmap 是一样的;请参阅 Bitmap.createScaledBitmap 的源代码(自 Android 2 以来未更改)。

在 Android 4.0+ 上,如果启用(在 4.1+ IIRC 上默认启用),使用矩阵(如 Bitmap.createScaledBitmap)允许硬件加速操作,因此我们无法直接控制正在做什么以及如何完成.

这意味着您必须使用所需的(此处为线性)过滤来实现自己的缩放方法;通过像素处理;或使用带有良好过滤器的 OpenGL ES,但它可能不适用于所有设备。

于 2013-03-09T18:42:36.293 回答