我在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(),并使用Bitmap.createBitmap和Matrix。所有尝试都有同样的结果。启用位图过滤。
再次感谢您的任何建议!
答案 0 :(得分:2)
使用Bitmap.createScaledBitmap()和Bitmap.createBitmap与Matrix是一样的; see the source for Bitmap.createScaledBitmap(自Android 2以来没有变化)。
在Android 4.0+上,使用矩阵(如在Bitmap.createScaledBitmap中)允许硬件加速操作(如果启用了4.1+ IIRC),因此我们无法直接控制正在执行的操作以及如何操作它完成了。
这意味着您必须使用所需的(此处为线性)过滤来实现您自己的缩放方法;通过像素处理;或者使用带有良好过滤器的OpenGL ES,但它可能并非在所有设备上都可用。