java Android - 以编程方式处理图像缩放/裁剪
Posted
技术标签:
【中文标题】java Android - 以编程方式处理图像缩放/裁剪【英文标题】:java Android - working with image scaling/cropping programmatically 【发布时间】:2013-08-19 11:13:29 【问题描述】:好吧,这一切折磨了我好几个星期,我设置了一个 227 像素高的图像,将其缩放到 170 像素,即使我希望它是 wrap_content 每当我这样做的时候。
好的。在这里,我拍摄了 1950 像素长的 My Image(我将其中的一部分放在这里,以便您了解它的外观)。
首先,我想将其缩放回 227 像素高,因为它是这样设计的,应该是这样的
Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(),R.drawable.ver_bottom_panel_tiled_long);
int width = bitmapOrg.getWidth();
int height = bitmapOrg.getHeight();
int newWidth = 200; //this should be parent's whdth later
int newHeight = 227;
// calculate the scale
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// create a matrix for the manipulation
Matrix matrix = new Matrix();
// resize the bit map
matrix.postScale(scaleWidth, scaleHeight);
// recreate the new Bitmap
Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0,
width, height, matrix, true);
BitmapDrawable dmpDrwbl=new BitmapDrawable(resizedBitmap);
verbottompanelprayer.setBackgroundDrawable(dmpDrwbl);
所以...这根本不是裁剪图像 - 不,它是 1950 像素压入 200 像素。
但我只想剪掉除这 200 像素或我要设置的任何宽度之外的任何东西 - 剪裁它,而不是将所有这些长图像压入 200 像素区域。
还有,BitmapDrawable(Bitmap bitmap);和 imageView.setBackgroundDrawable(drawable);已弃用 - 我该如何更改?
【问题讨论】:
【参考方案1】:根据我所见,您创建了一个新尺寸 (200x227) 的位图,所以我不确定您的预期。你甚至在你缩放的 cmets 中写了,没有关于裁剪的消息......
你可以做的是:
如果 API 至少为 10(姜饼),您可以使用 BitmapRegionDecoder ,使用 decodeRegion :
如果 API 太旧,则需要解码大位图,然后将其裁剪为新位图,使用 Bitmap.createBitmap
类似这样的:
final Rect rect =...
if (VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD_MR1)
BitmapRegionDecoder decoder=BitmapRegionDecoder.newInstance(imageFilePath, true);
croppedBitmap= decoder.decodeRegion(rect, null);
decoder.recycle();
else
Bitmap bitmapOriginal=BitmapFactory.decodeFile(imageFilePath, null);
croppedBitmap=Bitmap.createBitmap(bitmapOriginal,rect.left,rect.top,rect.width(),rect.height());
【讨论】:
你能给我举个例子,如何用 Bitmap.CreateBitmap 裁剪它吗?它仍然不裁剪,只是尝试将整个图像放入其中。可能我做错了什么? 你检查过我刚刚给你的链接吗?您需要使用正确的功能。不管怎样,我已经写了一个示例代码,虽然我不确定它是否编译得很好。 好吧,这就是问题所在 - 我想使用 BitmapRegionDecoder 但它只适用于文件。但我想将它与资源 - 不同的 dpi 一起使用。处理文件会使事情复杂化。有没有办法将 BitmapRegionDecoder 与资源一起使用? 请阅读我给你的内容。我不能在一个地方教你关于 android 的所有东西......它不仅仅是用于文件。我只展示了一个例子。您也可以使用 inputStream 或 fileDescriptor。例如,您可以使用 getResources().openRawResource(R.drawable....) 这对我来说太疯狂了............我从资源中获取了一张图片......原来是 227 像素......如果我使用 getHeight - 它返回 170 pix。如果我把它放在 bitmap.xml 中 - 它将是 170 像素。但如果我裁剪它 - 高度将再次变为 227 像素!!!怎么回事???以上是关于java Android - 以编程方式处理图像缩放/裁剪的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式在 Android 中获取图像按钮的宽度和高度
[Android - Kitkat ]以编程方式从 Android 的内置图库应用程序中获取/选择图像
每次我在前端放大/缩小时,如何以编程方式检查 Altair 图表的放大/缩小功能