android - 在 Android : can it be done? 中干净地缩小图像

标签 android image bitmap scaling android-drawable

我在 Android 上完全缩小图像时遇到问题。我希望在原始大小的大约 10-100% 的任意大小之间缩放小 PNG 图像。

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

NOTE: you will want to right-click on the image and view it directly...this page may downscale the image again 上图是添加了一些注释的 Android 设备的屏幕截图。我还在左侧的第二列中添加了相同的图像,显​​示了它们是如何通过“GIMP”(GNU 图像处理程序)进行线性缩放渲染的。

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

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

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

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

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

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

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

再次感谢您的任何建议!

最佳答案

在矩阵中使用 Bitmap.createScaledBitmap() 和 Bitmap.createBitmap 是一样的; see the source for Bitmap.createScaledBitmap (自 Android 2 以来没有改变)。

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

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

关于android - 在 Android : can it be done? 中干净地缩小图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15292445/

相关文章:

android - Eclipse 不显示 XML 错误

python - Pyglet文字背景不透明

java - 为什么我的图片不显示? ( java )

image - AS3/AIR/Mobile - 将位图保存到文件

android - 包含位图的动态壁纸 Canvas 会闪烁

.net - 有哪些库可用于在 .Net 中操作超大图像

android - 更改android中的通知铃声

java - 使用数组而不是缓冲区加载 Android OpenGL ES 2.0 纹理

android - 如何使图像完整作为背景图像?

Android:如何为应用程序设置自定义键盘?