背景
创建具有大量高质量图像的应用程序后,我决定将图像缩小到所需的大小(这意味着如果图像大于屏幕,则将其缩小)。
问题
我注意到,在某些设备上,如果图像按比例缩小,则它们会变得模糊/像素化,但是在相同的设备上,对于相同的目标imageView大小,如果图像没有按比例缩小,它们看起来就很好。
我尝试过的
我决定进一步检查此问题,并创建了一个显示该问题的小型POC应用程序。
在向您展示代码之前,这是我正在谈论的演示:
在此处输入图片说明
很难看出区别,但是您可以看到第二个像素化了。这可以显示在任何图像上。
public class MainActivity extends Activity
{
@Override
protected void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageView originalImageView=(ImageView)findViewById(R.id.originalImageView);
final ImageView halvedImageView=(ImageView)findViewById(R.id.halvedImageView);
final ImageView halvedBitmapImageView=(ImageView)findViewById(R.id.halvedBitmapImageView);
//
final Bitmap originalBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.test);
originalImageView.setImageBitmap(originalBitmap);
halvedImageView.setImageBitmap(originalBitmap);
//
final LayoutParams layoutParams=halvedImageView.getLayoutParams();
layoutParams.width=originalBitmap.getWidth()/2;
layoutParams.height=originalBitmap.getHeight()/2;
halvedImageView.setLayoutParams(layoutParams);
//
final Options options=new Options();
options.inSampleSize=2;
// options.inDither=true; //didn't help
// options.inPreferQualityOverSpeed=true; //didn't help
final Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.test,options);
halvedBitmapImageView.setImageBitmap(bitmap);
}
}
问题
为什么会发生?
两种方法都应具有相同的结果,因为两种样品均来自同一来源且使用相同因子。
我尝试使用下采样方法,但没有任何帮助。
使用inDensity(而不是inSampleSize)似乎可以解决此问题,但是我不确定该为它设置什么。我认为对于外部图像(例如,来自互联网),我可以将其设置为屏幕密度乘以我希望使用的样本大小。
但这甚至是一个好的解决方案吗?如果图像位于资源文件夹中,该怎么办(我不认为有一个函数可以获取位图位于哪个密度文件夹中)?为什么在使用推荐的方法(在此讨论)时不能正常工作?
编辑:我发现了一个技巧,可以从资源中获得用于绘制的密度(从此处链接)。但是,这并不是未来的证明,因为您需要特定于要检测的密度。
忽然笑
相关分类