ImageView Bitmap auf die richtige größe anpassen.

  • Antworten:4
  • OffenNicht stickyNicht beantwortet
Gelöschter Account
  • Forum-Beiträge: 47

02.07.2017, 03:47:47 via Website

Hallo,
Ich habe in meiner ListView eine ImageView.
Nun die ImageView hat den scaletyp:"centerCrop" oder "fitYX", ich möchte ein bild das größer ist auf die imageview anpassen sodass diese komplett mit dem bild ausgefüllt ist, ohne das bild zu verzerren und den Radius (aspected ratio) beizuhalten. Nun ich habe vieles ausprobiert, ohne Erfolg. Das bild ist meistens verzerrt. Die bilder die dargestellt werden sind meistens größer als die eigentliche ImageView. Die imageView soll von der Breite her den kompletten bildschirm ausfüllen, aber von der Höhe immer auf ca. 300 dp bleiben. Wie kriege ich das hin?
Noch ein paar Sachen zur verarbeitung vom Bild:

-Das Bild wird heruntergeladen und gespeichert.
-Das Bild wird mit meinem momentanen Code skaliert:

private void scaleImage(ImageView view, Bitmap bitmap)
{
    int width = bitmap.getWidth();
    int height = bitmap.getHeight();
    int bounding = dpToPx(400);
    Log.i("T", "original width = " + Integer.toString(width));
    Log.i("T", "original height = " + Integer.toString(height));
    Log.i("T", "bounding = " + Integer.toString(bounding));

    float xScale = ((float) bounding) / width;
    float yScale = ((float) bounding) / height;
    float scale = (xScale <= yScale) ? xScale : yScale;
    Log.i("T", "xScale = " + Float.toString(xScale));
    Log.i("T", "yScale = " + Float.toString(yScale));
    Log.i("T", "scale = " + Float.toString(scale));

    Matrix matrix = new Matrix();
    matrix.postScale(scale, scale);


    Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
    width = scaledBitmap.getWidth();
    height = scaledBitmap.getHeight();

    Log.i("T", "scaled width = " + Integer.toString(width));
    Log.i("T", "scaled height = " + Integer.toString(height));

    view.setImageBitmap(scaledBitmap);

    ViewGroup.LayoutParams params = (ViewGroup.LayoutParams) view.getLayoutParams();
    params.width = width;
    params.height = height;
    view.setLayoutParams(params);

    Log.i("T", "donte");
}

private int dpToPx(int dp)
{
    float density = context.getResources().getDisplayMetrics().density;
    return Math.round((float)dp * density);
}

-Meine ImageView sieht folgendermaßen aus:

  android:scaleType="fitXY"
  android:adjustViewBounds="false"

Ich muss einfach die Bilder runterskalieren können auf eine bestimmte Höhe.

Liebe Grüße Subrim.

Antworten
  • Forum-Beiträge: 2.902

02.07.2017, 07:32:49 via Website

Hallo Subrim ,

Dein Ansatz sieht ganz gut aus ..

An welcher stelle ist denn der Fehler genau ? Stimmt bei dir die Aspect-Ratio schon nicht ?
Ist das scaled Bitmap schon falsch ? Macht die ImageView denn alles richtig ?

Die imageView soll von der Breite her den kompletten bildschirm ausfüllen, aber von der Höhe immer auf ca. 300 dp bleiben.

Ich sehe nirgendwo, dass Du die Breite des Bildschirmes berücksichtigst.

.

Anm :
Du brauchst im Übrigen nicht das matrix/postScale anzuwenden.

Ein einfaches Bitmap resizedBitmap = Bitmap.createScaledBitmap(originalBitmap, newWidth, newHeight, false);
reicht.
Ergo : Berechne Vorher deine Zielgröße von Hand - Ich vermute , dass da auch dein Fehler liegt.
.

Und ganz zum Schluss noch ein Tip :
.
Versuche bei der Breite immer ein Boundering 8 hinzubekommen. Passe lieber dann die Höhe ein wenig an.
Grund : Ein Bitmap benötigt Boundering 8 ansonsten kann es gut sein , dass rechts die fehlenden Pixel mit
schwarz oder weis aufgefüllt werden

— geändert am 02.07.2017, 18:49:59

Liebe Grüße - Stefan
[ App - Entwicklung ]

subrim

Antworten
Gelöschter Account
  • Forum-Beiträge: 47

02.07.2017, 20:30:52 via Website

Wie stelle ich das denn auf Boundering 8 ein ? Ich habe keine Ahnung von Bildbearbeitung.

Antworten
  • Forum-Beiträge: 2.902

02.07.2017, 20:39:19 via Website

Boundering 8 hat nichts mit Imaging zu tun , sondern ist mathematisch

Durch 8 teilbar

Liebe Grüße - Stefan
[ App - Entwicklung ]

subrim

Antworten
Gelöschter Account
  • Forum-Beiträge: 47

02.07.2017, 20:45:29 via Website

Also bis jetzt ist der werd durch acht teilbar Sie die variable bounding meinen.
Ich brauche auf dem Gebiet ganz viel Hilfe... sitzte da mal wieder Wochen dran.

Antworten

Empfohlene Artikel