如何将图像(位图)调整为给定大小?

时间:2011-12-12 07:37:39

标签: android bitmap

如何以编程方式将图像(位图)调整为800 * 480?我已经在我的应用程序中检索到了大约1MB的图片,我需要将其缩小到800 * 480 我已经加载了该图片并对其进行了压缩,但我该如何缩小它:

ByteArrayOutputStream bos = new ByteArrayOutputStream(8192);
photo.compress(CompressFormat.JPEG, 25, bos); 

5 个答案:

答案 0 :(得分:94)

Bitmap scaledBitmap = scaleDown(realImage, MAX_IMAGE_SIZE, true);

缩小方法:

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;
}

答案 1 :(得分:15)

 Bitmap yourBitmap;
 Bitmap resized = Bitmap.createScaledBitmap(yourBitmap, newWidth, newHeight, true);

或:

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

答案 2 :(得分:11)

您可以使用canvas.drawBitmap并使用提供矩阵来缩放位图,例如:

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;
    }

答案 3 :(得分:2)

关于“如何”调整它们的其他答案是正确的,但我也会在建议中抛出你感兴趣的解决方案,一开始。大多数Android设备提供一系列分辨率,您应该选择一个能够提供您熟悉的文件大小的设备。最大的原因是原生的Android缩放算法(由Jin35和Padma Kumar详细说明)产生了非常糟糕的结果。它不会给你Photoshop质量调整大小,甚至缩小尺寸(更不用说升级了,我知道你没有问过,但这只是一个非首发)。

所以,你应该尝试他们的解决方案,如果你对结果感到满意,那很好。但如果没有,我会编写一个函数,提供您满意的宽度范围,并在设备的可用图片大小数组中查找该维度(或任何最接近的维度),然后设置并使用它。

答案 4 :(得分:2)

在MonoDroid中这里是如何(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;
    }

}