Фон
Создав приложение с большим количеством высококачественных изображений, я решил уменьшить масштаб изображения до необходимого размера (это означает, что если изображение больше экрана, я уменьшаю его).
Проблема
Я заметил, что на некоторых устройствах, если изображения уменьшены, они становятся размытыми/пиксельными, но на тех же устройствах, для одного и того же целевого размера изображения, если изображения не масштабируются, они выглядят просто отлично.
Что я пробовал
Я решил еще раз проверить эту проблему и создал небольшое приложение 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), похоже, исправляет его, но я не уверен, что его установить. Я думаю, что для внешних изображений (например, из Интернета) я могу установить его на плотность экрана, умноженную на размер выборки, которую я хочу использовать.
Но это даже хорошее решение? что я должен делать в том случае, если изображения находятся внутри папки ресурсов (я не думаю, что есть функция, чтобы получить, какая папка плотности имеет растровое изображение)? почему это работает при использовании рекомендуемого способа (о здесь) не работает?
EDIT: я нашел трюк, чтобы получить, какая плотность используется для выталкиваемого вами из ресурсов (здесь). однако это не является будущим доказательством, поскольку вам нужно быть конкретным для определения плотности.