Intereting Posts
   

android:运行时resize的图像质量

我想使用drawBitmap()方法显示图像。 但在我想根据屏幕尺寸resize之前。 我的结果图像质量有问题。 您可以在下面看到屏幕截图和测试代码。 如何在运行时以高质量调整图像大小?

谢谢你的解决方案。

原始图片: alt text http://img.androidcookie.com/android/gradient.png

设备上的结果屏幕截图: alt text http://img.androidcookie.com/android/device.png

import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Rect; import android.os.Bundle; import android.view.View; import android.widget.LinearLayout; import java.io.IOException; import java.io.InputStream; public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); LinearLayout container = (LinearLayout) findViewById(R.id.container); container.addView(new View(this) { @Override protected void onDraw(Canvas canvas) { Bitmap unscaledBitmap; try { InputStream in = getAssets().open("images/gradient.png"); unscaledBitmap = BitmapFactory.decodeStream(in); in.close(); canvas.drawBitmap(unscaledBitmap, null, new Rect(0, 0, 320, 480), null); } catch (IOException e) { e.printStackTrace(); } } }); } } 

请参阅下面的Romain的答案 。

我想删除这个答案,但我无法将其标记为已接受。


请注意,Android [最初编写此答案时,未明确请求32位颜色]只会执行16位颜色,因此有时可能会出现不需要的工件。

您也可以尝试使用抖动选项告诉Android自动应用抖动,虽然不完美,但可以帮助让事情看起来更好一些。

不要在绘图时resize(这将是非常昂贵的),尝试在屏幕外位图中resize并确保位图为32位(ARGB888)。

查看http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html (与unscaledBitmap = BitmapFactory.decodeStream(in)一起使用;

您可以为图像添加质量设置。 我猜测质量正在下降,因为你没有通过任何设置来处理图像。

当您尝试缩放没有实际alpha值的ARGB_8888位图(即每个像素的alpha = 255)时,旧平台(API级别<12)上的createScaledBitmap(..)方法的实现会导致问题,因为它们的hasAlpha标志已设置为假。 在这种情况下,缩放的位图会自动转换为RGB_565格式。

因此,因为API级别12有一个方法(在类Bitmap中)

 setHasAlpha(boolean value); 

这有助于在使用createScaledBitmap(..)时阻止转换。

有一种方法可以在API级别> 3上使用相同的方法。它已存在很长时间,只是隐藏。 此处描述了包括源代码在内的所有必要步骤:

https://stackoverflow.com/a/12202069/1082933

希望这可以帮助。

我遇到了类似的问题,这就是我最终要做的事情: 在运行时调整图像大小时的质量问题

此外,如果您的resizefunction不符合图像的宽高比,则质量会受到影响。 你可以在网上find一些resize算法,例如检查一下