Android作物中心的位图

我有正方形或长方形的位图。 我采取最短的一面,做这样的事情:

int value = 0; if (bitmap.getHeight() <= bitmap.getWidth()) { value = bitmap.getHeight(); } else { value = bitmap.getWidth(); } Bitmap finalBitmap = null; finalBitmap = Bitmap.createBitmap(bitmap, 0, 0, value, value); 

然后我将它缩放到144 x 144位图使用这个:

 Bitmap lastBitmap = null; lastBitmap = Bitmap.createScaledBitmap(finalBitmap, 144, 144, true); 

问题是它裁剪原始位图的左上angular,任何人都有代码来裁剪位图的中心?

在这里输入图像描述

这可以通过以下方式来实现: Bitmap.createBitmap(source,x,y,width,height)

 if (srcBmp.getWidth() >= srcBmp.getHeight()){ dstBmp = Bitmap.createBitmap( srcBmp, srcBmp.getWidth()/2 - srcBmp.getHeight()/2, 0, srcBmp.getHeight(), srcBmp.getHeight() ); }else{ dstBmp = Bitmap.createBitmap( srcBmp, 0, srcBmp.getHeight()/2 - srcBmp.getWidth()/2, srcBmp.getWidth(), srcBmp.getWidth() ); } 

虽然大多数上述答案提供了一个方法来做到这一点,已经有一个内置的方式来实现这一点,它是1行代码( ThumbnailUtils.extractThumbnail()

 int dimension = getSquareCropDimensionForBitmap(bitmap); bitmap = ThumbnailUtils.extractThumbnail(bitmap, dimension, dimension); ... //I added this method because people keep asking how //to calculate the dimensions of the bitmap...see comments below public int getSquareCropDimensionForBitmap(Bitmap bitmap) { //use the smallest dimension of the image to crop to return Math.min(bitmap.getWidth(), bitmap.getHeight()); } 

如果你想要回收位图对象,你可以传递如下的选项:

 bitmap = ThumbnailUtils.extractThumbnail(bitmap, dimension, dimension, ThumbnailUtils.OPTIONS_RECYCLE_INPUT); 

来自: ThumbnailUtils文档

公共静态位图extractThumbnail(位图源,int宽度,int高度)

在API级别8中添加创build所需大小的居中位图。

参数来源原始位图源宽度目标宽度高度目标高度

在使用接受的答案时,我发现内存不足错误,使用ThumbnailUtils解决了这些问题。 此外,这是更清洁,更可重用。

你有没有考虑从layout.xml做这个? 你可以为你的ImageView设置ScaleType为android:scaleType="centerCrop"并在layout.xml中的ImageView设置图像的尺寸。

这里有一个更完整的代码片段,可以将任意维度的[位图]的中心剪出,并将结果缩放到所需的[IMAGE_SIZE] 。 所以你总是会得到一个固定大小的图像中心[croppedBitmap]缩放的平方。 适合缩略图等。

它是其他解决scheme的更完整组合。

 final int IMAGE_SIZE = 255; boolean landscape = bitmap.getWidth() > bitmap.getHeight(); float scale_factor; if (landscape) scale_factor = (float)IMAGE_SIZE / bitmap.getHeight(); else scale_factor = (float)IMAGE_SIZE / bitmap.getWidth(); Matrix matrix = new Matrix(); matrix.postScale(scale_factor, scale_factor); Bitmap croppedBitmap; if (landscape){ int start = (tempBitmap.getWidth() - tempBitmap.getHeight()) / 2; croppedBitmap = Bitmap.createBitmap(tempBitmap, start, 0, tempBitmap.getHeight(), tempBitmap.getHeight(), matrix, true); } else { int start = (tempBitmap.getHeight() - tempBitmap.getWidth()) / 2; croppedBitmap = Bitmap.createBitmap(tempBitmap, 0, start, tempBitmap.getWidth(), tempBitmap.getWidth(), matrix, true); } 

你可以使用下面的代码来解决你的问题。

 Matrix matrix = new Matrix(); matrix.postScale(0.5f, 0.5f); Bitmap croppedBitmap = Bitmap.createBitmap(bitmapOriginal, 100, 100,100, 100, matrix, true); 

以上方法在裁剪之前先对图像进行缩放,这样就可以得到裁剪后图像的最佳效果而不会出现OOM错误。

有关更多详细信息,请参阅此博客

到目前为止,可能是最简单的解决scheme:

 public static Bitmap cropCenter(Bitmap bmp) { int dimension = Math.min(bmp.getWidth(), bmp.getHeight()); return ThumbnailUtils.extractThumbnail(bmp, dimension, dimension); } 

import:

 import android.media.ThumbnailUtils; import java.lang.Math; import android.graphics.Bitmap; 

要纠正@willsteel解决scheme:

 if (landscape){ int start = (tempBitmap.getWidth() - tempBitmap.getHeight()) / 2; croppedBitmap = Bitmap.createBitmap(tempBitmap, start, 0, tempBitmap.getHeight(), tempBitmap.getHeight(), matrix, true); } else { int start = (tempBitmap.getHeight() - tempBitmap.getWidth()) / 2; croppedBitmap = Bitmap.createBitmap(tempBitmap, 0, start, tempBitmap.getWidth(), tempBitmap.getWidth(), matrix, true); } 
 public static Bitmap resizeAndCropCenter(Bitmap bitmap, int size, boolean recycle) { int w = bitmap.getWidth(); int h = bitmap.getHeight(); if (w == size && h == size) return bitmap; // scale the image so that the shorter side equals to the target; // the longer side will be center-cropped. float scale = (float) size / Math.min(w, h); Bitmap target = Bitmap.createBitmap(size, size, getConfig(bitmap)); int width = Math.round(scale * bitmap.getWidth()); int height = Math.round(scale * bitmap.getHeight()); Canvas canvas = new Canvas(target); canvas.translate((size - width) / 2f, (size - height) / 2f); canvas.scale(scale, scale); Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG | Paint.DITHER_FLAG); canvas.drawBitmap(bitmap, 0, 0, paint); if (recycle) bitmap.recycle(); return target; } private static Bitmap.Config getConfig(Bitmap bitmap) { Bitmap.Config config = bitmap.getConfig(); if (config == null) { config = Bitmap.Config.ARGB_8888; } return config; } 
 public Bitmap getResizedBitmap(Bitmap bm) { int width = bm.getWidth(); int height = bm.getHeight(); int narrowSize = Math.min(width, height); int differ = (int)Math.abs((bm.getHeight() - bm.getWidth())/2.0f); width = (width == narrowSize) ? 0 : differ; height = (width == 0) ? differ : 0; Bitmap resizedBitmap = Bitmap.createBitmap(bm, width, height, narrowSize, narrowSize); bm.recycle(); return resizedBitmap; }