webentwicklung-frage-antwort-db.com.de

Wie ändere ich die Größe eines Bildes (Bitmap) auf eine bestimmte Größe?

Wie kann ich die Bildgröße (Bitmap) programmatisch auf beispielsweise 800 * 480 ändern? Ich habe ein Bild in meiner App abgerufen, das ~ 1 MB groß ist, und ich muss es auf 800 * 480 verkleinern. Ich habe das Bild geladen und komprimiert, aber wie kann ich es verkleinern:

ByteArrayOutputStream bos = new ByteArrayOutputStream(8192);
photo.compress(CompressFormat.JPEG, 25, bos); 
47
Damir
Bitmap scaledBitmap = scaleDown(realImage, MAX_IMAGE_SIZE, true);

Verkleinerungsmethode:

public static Bitmap scaleDown(Bitmap realImage, float maxImageSize,
        boolean filter) {
    float ratio = Math.min(
            (float) maxImageSize / realImage.getWidth(),
            (float) maxImageSize / realImage.getHeight());
    int width = Math.round((float) ratio * realImage.getWidth());
    int height = Math.round((float) ratio * realImage.getHeight());

    Bitmap newBitmap = Bitmap.createScaledBitmap(realImage, width,
            height, filter);
    return newBitmap;
}
97
Padma Kumar
 Bitmap yourBitmap;
 Bitmap resized = Bitmap.createScaledBitmap(yourBitmap, newWidth, newHeight, true);

oder:

 resized = Bitmap.createScaledBitmap(yourBitmap,(int)(yourBitmap.getWidth()*0.8), (int)(yourBitmap.getHeight()*0.8), true);
15

Sie können Bitmaps skalieren, indem Sie canvas.drawBitmap mit einer bereitgestellten Matrix verwenden. Beispiel:

public static Bitmap scaleBitmap(Bitmap bitmap, int wantedWidth, int wantedHeight) {
        Bitmap output = Bitmap.createBitmap(wantedWidth, wantedHeight, Config.ARGB_8888);
        Canvas canvas = new Canvas(output);
        Matrix m = new Matrix();
        m.setScale((float) wantedWidth / bitmap.getWidth(), (float) wantedHeight / bitmap.getHeight());
        canvas.drawBitmap(bitmap, m, new Paint());

        return output;
    }
11
Jin35

In MonoDroid ist hier, wie (c #)

/// <summary>
/// Graphics support for resizing images
/// </summary>
public static class Graphics
{
    public static Bitmap ScaleDownBitmap(Bitmap originalImage, float maxImageSize, bool filter)
    {
        float ratio = Math.Min((float)maxImageSize / originalImage.Width, (float)maxImageSize / originalImage.Height);
        int width = (int)Math.Round(ratio * (float)originalImage.Width);
        int height =(int) Math.Round(ratio * (float)originalImage.Height);

        Bitmap newBitmap = Bitmap.CreateScaledBitmap(originalImage, width, height, filter);
        return newBitmap;
    }

    public static Bitmap ScaleBitmap(Bitmap originalImage, int wantedWidth, int wantedHeight)
    {
        Bitmap output = Bitmap.CreateBitmap(wantedWidth, wantedHeight, Bitmap.Config.Argb8888);
        Canvas canvas = new Canvas(output);
        Matrix m = new Matrix();
        m.SetScale((float)wantedWidth / originalImage.Width, (float)wantedHeight / originalImage.Height);
        canvas.DrawBitmap(originalImage, m, new Paint());
        return output;
    }

}
2

Die anderen Antworten sind korrekt, um die Größe zu ändern, aber ich würde auch die Empfehlung einfließen lassen, zunächst nur die Auflösung zu wählen, an der Sie interessiert sind. Die meisten Android Geräte bieten eine Reihe von Auflösungen und Sie sollten eine auswählen, die Ihnen eine Dateigröße bietet, mit der Sie zufrieden sind. Der Hauptgrund dafür ist, dass die native Android Der Skalierungsalgorithmus (wie von Jin35 und Padma Kumar beschrieben) liefert ziemlich bescheidene Ergebnisse. Er wird Ihnen keine Größenänderung in Photoshop-Qualität ermöglichen, auch keine Verkleinerung (ganz zu schweigen von einer Verkleinerung, nach der Sie nicht fragen, aber ...) das ist nur ein Nichtstarter).

Also, Sie sollten versuchen, ihre Lösung und wenn Sie mit dem Ergebnis zufrieden sind, großartig. Wenn nicht, würde ich eine Funktion schreiben, die einen Bereich von Breite bietet, mit dem Sie zufrieden sind, und im verfügbaren Bildgrößen-Array des Geräts nach dieser Abmessung (oder der nächstgelegenen) suchen und sie einfach festlegen und verwenden.

2
Genia S.