Как правильно уменьшить изображение?

Фон

Создавая приложение с большим количеством изображений высокого качества, я решил уменьшить изображение до необходимого размера (то есть, если изображение больше экрана, я уменьшу его).

Проблема

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

Но это даже хорошее решение? Что мне делать, если изображения находятся внутри папки ресурсов (я не думаю, что есть функция для определения, в какой папке плотности находится растровое изображение)? почему это работает при использовании рекомендуемого способа (говорили оВот) не работает хорошо?

РЕДАКТИРОВАТЬ: я нашел трюк, чтобы получить, какая плотность используется для рисования, которое вы получаете из ресурсов (ссылка здесь) однако, это не является будущим доказательством, так как вы должны быть конкретны для определения плотности.

Ответы на вопрос(3)

Ваш ответ на вопрос