我想将 Bitmap
缩放为依赖于运行时的宽度和高度,其中保持纵横比并且 Bitmap
填充整个宽度并使图像垂直居中,裁剪多余部分或用0像素填充间隙 .
我正在重新绘制位图,方法是创建所有0像素的 Bitmap
并在其上绘制图像 Bitmap
,缩放到指定的精确宽度并保持纵横比,然而,它最终会丢失/搞砸像素数据 .
我是这样做的:
Bitmap background = Bitmap.createBitmap((int)width, (int)height, Config.ARGB_8888);
float originalWidth = originalImage.getWidth(), originalHeight = originalImage.getHeight();
Canvas canvas = new Canvas(background);
float scale = width/originalWidth;
float xTranslation = 0.0f, yTranslation = (height - originalHeight * scale)/2.0f;
Matrix transformation = new Matrix();
transformation.postTranslate(xTranslation, yTranslation);
transformation.preScale(scale, scale);
canvas.drawBitmap(originalImage, transformation, null);
return background;
是否有一个库或一些更好的代码可以做得更好?我希望图像看起来尽可能清晰,但我知道我的功能不会提供很好的结果 .
我知道我可以通过使用整数缩放而不是浮动缩放来保持图像保持良好,但我需要宽度为100%填充 .
另外,我知道 ImageView
的 Gravity.CENTER_CROP
功能,它也使用整数缩放,所以当它不应该时,它会切断图像的宽度 .
11 回答
那这个呢:
我添加了一个
paint
来过滤缩放的位图 .这将尊重maxWidth和maxHeight,这意味着生成的位图的尺寸永远不会大于:
在这里,我有一个经过测试的解决方案,我在一个位图文件中创建一个缩放的Bitmap:
请注意,我需要缩放的位图,其最大尺寸为4096x4096像素,但在调整大小时需要保持纵横比 . 如果您需要宽度或高度的其他值,只需替换值“4096” .
这只是Coen答案的补充,但他的代码中的问题是他计算比率的线 . 除以两个整数得到一个整数,如果结果为<1,它将被舍入为0.所以这会抛出“除以零”异常 .
这是我的Utils类的一个方法,它完成了这项工作:
它也可以通过自己计算比率来完成,就像这样 .
更简单的解决方案:请注意我们将宽度设置为500像素
上面的答案都没有为我工作,我只是创建了一个方法,将所有尺寸设置为所需的尺寸,并将空白区域绘制为黑色 . 这是我的方法:
例如;
假设您的图像为100 x 100但所需尺寸为300x50,则此方法会将图像转换为50 x 50并将其绘制为尺寸为300 x 50的新图像(空文件将为黑色) .
另一个例子:假设您的图像为600 x 1000,所需的尺寸再次为300 x 50,那么您的图像将被转换为30 x 50并绘制成新创建的图像,尺寸为300 x 50 .
我认为这是必须的,卢比 .
在Gowrav的回答中添加了RESIZE_CROP .
This is an awesome library from ArthurHub如果您不想重新发明轮子,则以编程方式和交互方式处理图像裁剪 .
但是如果你喜欢像我这样的非膨胀版本..,这里显示的内部函数是一个相当复杂的执行Image Scaling与几个标准选项
我的解决方案是这样,它保持纵横比,并且只需要一个尺寸,例如,如果你有一个1920 * 1080和一个1080 * 1920的图像,你想要将它调整为1280,第一个将是1280 * 720,第二个是将是720 * 1280