2

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

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;

    }
4

3 回答 3

1

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

Bitmap originalBitmap = <original initialization>;

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

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

https://github.com/biokys/cropimage

于 2013-09-03T13:40:36.553 回答
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(...)如果您需要将相应裁剪的位图居中,请使用。

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

在我看来,如果您需要高效使用 API 的最佳介绍:阅读ImageViewDrawable实例的源代码;一个非常值得的个人开发练习是使用 SDK 来实现一个中心裁剪的淡入淡出过渡可绘制对象,因为这是 Android 库中唯一缺少的东西之一,而且会涉及到很多类似的东西您在上面尝试执行的编码。

注意:

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

最好的。

于 2013-09-03T13:45:42.137 回答
0

看看https://github.com/coomar2841/image-chooser-library/blob/d27b542d2487132b0150be382f39e9ef95aafe68/src/com/kbeanie/imagechooser/threads/MediaProcessorThread.java

该方法称为compressAndSaveImage.

于 2014-09-05T09:08:19.670 回答