如何使用自定义大小调整图像大小

时间:2013-09-03 13:25:00

标签: android android-image

我需要使用自定义尺寸调整图像大小。图像来自设备相机或画廊,我厌倦了下面的代码,但图像被拉伸,我需要方形的图像,没有任何拉伸。

public Bitmap decodeSampledBitmapFromFile(Bitmap bm, int boundBoxInDp) {
boundBoxInDp=300;
        int height = bm.getHeight();
        int width = bm.getWidth();
        float scaleWidth = ((float) boundBoxInDp) / width;
        float scaleHeight = ((float) boundBoxInDp) / height;
        Matrix matrix = new Matrix();
        matrix.postScale(scaleWidth, scaleHeight);
        Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height,
                matrix, false);
        return resizedBitmap;

    }

3 个答案:

答案 0 :(得分:1)

如果您已有位图,则可以使用以下代码调整大小:

Bitmap originalBitmap = <original initialization>;

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

或者您可以使用以下库来调整图像大小

https://github.com/biokys/cropimage

答案 1 :(得分:1)

这不适合你的图像在一个边界框(其失败可能是你所谓的“拉伸”)。它不会处理方形边框中的矩形位图,也不会处理比边界框小的图像。你可能想要这样的东西:

public Bitmap decodeSampledBitmapFromFile(Bitmap bm, int boundBoxInDp) {
    boundSquareInPx=convertToPixels(300);
    int maxDimen = Math.max(bm.getHeight(), bm.getWidth())
    float scale = (maxDimen <= boundSquareInPx) ? 1 : boundSquareInPx / (float) maxDimen;
    float scaleWidth = scale * bm.getWidth();
    float scaleHeight = scale * bm.getHeight();
    Matrix matrix = new Matrix();
    matrix.postScale(scaleWidth, scaleHeight);
    Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height,
            matrix, true);
    return resizedBitmap;

}

很少有人注意到:如果您的图像小于您的图像,则不适合它 - 显而易见的修改就是这样。

其次,dp!= px; Bitmap对象返回px,因此您将不得不从dp转换为px(在其他地方有详细记录)。

如果您需要将相应裁剪的位图居中,请使用postTranslate(...)

文档为here;这个 已经是我知道在Android中调整大小的最好的库 - 我从来不需要任何其他东西,而且我已经在游戏中使用了一段时间并经常使用它。

在我看来,如果您需要有效使用API​​的最佳介绍:请阅读ImageViewDrawable个实例的源代码;一个非常有价值的个人开发练习是使用SDK来实现一个中心裁剪的渐变过渡可绘制,因为这是令人讨厌的Android库中唯一缺少的东西之一,并且会涉及很多类型的编码,你正试图在上面做。

<强> NB:

正如您将注意到的,另一位回答者指出createScaledBitmap的存在,这可能是更清晰的代码;我只想指出你所做的事情基本上是正确的以及如何改进。

最佳。

答案 2 :(得分:0)