399 Stimmen

Wie ändert man die Größe einer Bitmap in Android?

Ich habe eine Bitmap von einem Base64-String aus meiner Remote-Datenbank genommen, ( encodedImage ist die Zeichenkette, die das Bild mit Base64 darstellt):

profileImage = (ImageView)findViewById(R.id.profileImage);

byte[] imageAsBytes=null;
try {
    imageAsBytes = Base64.decode(encodedImage.getBytes());
} catch (IOException e) {e.printStackTrace();}

profileImage.setImageBitmap(
    BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length)
);

profileImage ist mein ImageView

Ok, aber ich muss die Größe dieses Bildes ändern, bevor ich es auf meiner ImageView meines Layouts. Ich muss die Größe auf 120x120 ändern.

Kann mir jemand den Code für die Größenänderung nennen?

Die Beispiele, die ich gefunden habe, konnten nicht auf eine Bitmap mit Base64-String angewendet werden.

0 Stimmen

Mögliches Duplikat von Größe der Bitmap in Android ändern

0 Stimmen

@SagarPilkhwal diese Frage wurde zuerst gestellt

1voto

Tarasantan Punkte 885

Beibehaltung des Seitenverhältnisses,

  public Bitmap resizeBitmap(Bitmap source, int width,int height) {
    if(source.getHeight() == height && source.getWidth() == width) return source;
    int maxLength=Math.min(width,height);
    try {
        source=source.copy(source.getConfig(),true);
        if (source.getHeight() <= source.getWidth()) {
            if (source.getHeight() <= maxLength) { // if image already smaller than the required height
                return source;
            }

            double aspectRatio = (double) source.getWidth() / (double) source.getHeight();
            int targetWidth = (int) (maxLength * aspectRatio);

            return Bitmap.createScaledBitmap(source, targetWidth, maxLength, false);
        } else {

            if (source.getWidth() <= maxLength) { // if image already smaller than the required height
                return source;
            }

            double aspectRatio = ((double) source.getHeight()) / ((double) source.getWidth());
            int targetHeight = (int) (maxLength * aspectRatio);

            return Bitmap.createScaledBitmap(source, maxLength, targetHeight, false);

        }
    }
    catch (Exception e)
    {
        return source;
    }
}

0voto

Ashutosh Gupta Punkte 620

Während die vorherigen Antworten das Bild skalieren und das Seitenverhältnis berücksichtigen, sollte das Resampling selbst so erfolgen, dass kein Aliasing auftritt. Bei der Skalierung kommt es darauf an, die Argumente richtig zu setzen. Es gibt viele Kommentare über die Qualität der Ausgabebilder des Standard-Skalierungsaufrufs. Um die Qualität des Bildes zu erhalten, sollte man den Standardaufruf verwenden:

Bitmap resizedBitmap = Bitmap.createScaledBitmap(originalBitmap, newWidth, newHeight, true);

mit dem letzten Argument, das auf true weil es die bilineare Filterung für das Resampling durchführt, um Aliasing zu verhindern. Lesen Sie hier mehr über Aliasing: https://en.wikipedia.org/wiki/Aliasing

Aus der Android-Dokumentation:

https://developer.Android.com/reference/Android/graphics/Bitmap#createScaledBitmap(Android.graphics.Bitmap,%20int,%20int,%20boolean)

public static Bitmap createScaledBitmap (Bitmap src, 
                int dstWidth, 
                int dstHeight, 
                boolean filter)

Filter : boolean, ob bei der Skalierung der Bitmap eine bilineare Filterung verwendet werden soll oder nicht. Wenn dies true ist, wird beim Skalieren die bilineare Filterung verwendet, die eine bessere Bildqualität auf Kosten einer schlechteren Leistung bietet. Bei false wird stattdessen die Skalierung mit den nächsten Nachbarn verwendet, die zwar eine schlechtere Bildqualität hat, aber schneller ist. Es wird empfohlen, den Filter auf 'true' zu setzen, da die Kosten der bilinearen Filterung in der Regel minimal sind und die verbesserte Bildqualität erheblich ist.

0voto

Praful Parmar Punkte 193
* For resize bitmap with width and height ratio.    

public static Bitmap getResizedBitmap(Bitmap image, int maxSize) {
            int width = image.getWidth();
            int height = image.getHeight();

            float bitmapRatio = (float) width / (float) height;
            if (bitmapRatio > 1) {
                width = maxSize;
                height = (int) (width / bitmapRatio);
            } else {
                height = maxSize;
                width = (int) (height * bitmapRatio);
            }
            return Bitmap.createScaledBitmap(image, width, height, true);
        }

0voto

lannyf Punkte 8485

Matrix.ScaleToFit.CENTER) anwenden, um ein neues Bitmap zu erhalten, das das Seitenverhältnis beibehält.

public static Bitmap getScaledwonBitmap(Bitmap srcBmp, int deisredWidth, int desiredHeight) {

            Matrix matrix = new Matrix();
            matrix.setRectToRect(new RectF(0, 0, srcBmp.getWidth(), srcBmp.getHeight()),
                    new RectF(0, 0, deisredWidth, desiredHeight),
                    Matrix.ScaleToFit.CENTER);
           return Bitmap.createBitmap(srcBmp, 0, 0, srcBmp.getWidth(), srcBmp.getHeight(), matrix, true);

    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X