背景
创建一个包含大量高质量图像的应用程序,我决定将图像缩小到所需的大小(这意味着如果图像大于屏幕,我会缩小它)。
问题
我注意到在某些设备上,如果图像被缩小,它们会变得模糊/像素化,但在相同的设备上,对于相同的目标 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);
}
}
xml:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" tools:context=".MainActivity"
android:fillViewport="true">
<HorizontalScrollView android:layout_width="match_parent"
android:fillViewport="true" android:layout_height="match_parent">
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent" android:orientation="vertical">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="original" />
<ImageView android:layout_width="wrap_content"
android:id="@+id/originalImageView" android:layout_height="wrap_content" />
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="original , imageView size is halved" />
<ImageView android:layout_width="wrap_content"
android:id="@+id/halvedImageView" android:layout_height="wrap_content" />
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="bitmap size is halved" />
<ImageView android:layout_width="wrap_content"
android:id="@+id/halvedBitmapImageView" android:layout_height="wrap_content" />
</LinearLayout>
</HorizontalScrollView>
</ScrollView>
问题
为什么会发生?
两种方法都应该具有相同的结果,因为它们都来自相同的来源并使用相同的因子。
我尝试过使用下采样方法,但没有任何帮助。
使用 inDensity(而不是 inSampleSize)似乎可以修复它,但我不确定要为它设置什么。我认为对于外部图像(例如来自互联网),我可以将其设置为屏幕密度乘以我希望使用的样本大小。
但它甚至是一个好的解决方案吗?如果图像位于资源文件夹中,我该怎么办(我认为没有功能可以获取位图所在的密度文件夹)?为什么它在使用推荐的方式(在此处讨论)时效果不佳?
编辑:我发现了一个技巧,可以从资源中获取用于绘制的可绘制对象(此处的链接)。但是,这不是未来的证据,因为您需要特定于要检测的密度。