Wie werden Bilder korrekt heruntergemustert?

Hintergrund

Beim Erstellen einer App mit vielen Bildern in hoher Qualität habe ich beschlossen, die Bilder auf die erforderliche Größe zu verkleinern (dh, wenn das Bild größer als der Bildschirm ist, verkleinere ich es).

Das Problem

Ich habe festgestellt, dass die Bilder auf einigen Geräten, wenn sie verkleinert werden, verschwommen / pixelig werden, auf denselben Geräten jedoch bei gleicher Zielgröße von imageView. Wenn die Bilder nicht verkleinert werden, sehen sie gut aus.

Was ich versucht habe

Ich habe beschlossen, dieses Problem weiter zu prüfen, und eine kleine POC-App erstellt, die das Problem anzeigt.

Bevor Sie den Code anzeigen, sehen Sie hier eine Demo dessen, worüber ich spreche:

Es ist ein bisschen schwer, den Unterschied zu erkennen, aber Sie können sehen, dass der zweite etwas pixelig ist. Dies kann auf jedem Bild gezeigt werden.

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>
Die Frage

Warum tritt es auf?

Beide Methoden sollten dasselbe Ergebnis erzielen, da beide Proben aus derselben Quelle stammen und denselben Faktor verwenden.

Ich habe versucht, mit der Downsampling-Methode zu spielen, aber nichts hat geholfen.

Die Verwendung von inDensity (anstelle von inSampleSize) scheint das Problem zu beheben, aber ich bin nicht sicher, was ich dafür einstellen soll. Ich denke, dass ich für Außenaufnahmen (zum Beispiel aus dem Internet) die Bildschirmdichte multipliziert mit der Stichprobengröße einstellen kann, die ich verwenden möchte.

Aber ist es überhaupt eine gute Lösung? Was soll ich tun, wenn sich die Bilder im Ressourcenordner befinden? (Ich glaube nicht, dass es eine Funktion gibt, um den Dichteordner zu ermitteln, in dem sich eine Bitmap befindet.) Warum funktioniert es, wenn die empfohlene Methode verwendet wird?Hier) funktioniert nicht gut?

EDIT: Ich habe einen Trick gefunden, um herauszufinden, welche Dichte für ein Zeichen verwendet wird, das Sie aus den Ressourcen erhalten (hier verlinken). Es ist jedoch nicht zukunftssicher, da Sie die zu erkennende Dichte genau bestimmen müssen.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage