Обрезать растровое изображение
Как я могу обрезать растровое изображение? это мой вопрос, я попробовал некоторые концепции, используя намерения, но все еще не удается..
У меня растровое изображение, которое я хочу обрезать!
вот код:
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setClassName("com.android.camera", "com.android.camera.CropImage");
File file = new File(filePath);
Uri uri = Uri.fromFile(file);
intent.setData(uri);
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 96);
intent.putExtra("outputY", 96);
intent.putExtra("noFaceDetection", true);
intent.putExtra("return-data", true);
startActivityForResult(intent, REQUEST_CROP_ICON);
Может ли кто-нибудь помочь мне в этом @Thanks
6 ответов
Я использовал этот метод для обрезки изображения, и он отлично работает:
Bitmap bmp=BitmapFactory.decodeResource(getResources(), R.drawable.xyz);
resizedbitmap1=Bitmap.createBitmap(bmp, 0,0,yourwidth, yourheight);
createBitmap () принимает растровое изображение, начало X, начало Y, ширину и высоту в качестве параметра
Использование ответа выше не работает, если вы хотите вырезать / обрезать области, особенно за пределами! Используя этот код, вы всегда получите желаемый размер - даже если исходный код меньше.
// Here I want to slice a piece "out of bounds" starting at -50, -25
// Given an endposition of 150, 75 you will get a result of 200x100px
Rect rect = new Rect(-50, -25, 150, 75);
// Be sure that there is at least 1px to slice.
assert(rect.left < rect.right && rect.top < rect.bottom);
// Create our resulting image (150--50),(75--25) = 200x100px
Bitmap resultBmp = Bitmap.createBitmap(rect.right-rect.left, rect.bottom-rect.top, Bitmap.Config.ARGB_8888);
// draw source bitmap into resulting image at given position:
new Canvas(resultBmp).drawBitmap(bmp, -rect.left, -rect.top, null);
...и вы сделали!
У меня была похожая проблема с обрезкой, и после попытки многочисленных подходов я понял, что имеет смысл для меня. Этот метод только обрезает изображение до квадратной формы, я все еще работаю над круглой формой (не стесняйтесь изменять код, чтобы получить нужную форму).
Итак, сначала у вас есть растровое изображение, которое вы хотите обрезать:
Bitmap image; //you need to initialize it in your code first of course
Информация об изображении хранится в массиве int [ ], который является не чем иным, как массивом целых чисел, содержащим значение цвета каждого пикселя, начиная с верхнего левого угла изображения с индексом 0 и заканчивая в правом нижнем углу индексом N Вы можете получить этот массив с помощью метода Bitmap.getPixels(), который принимает различные аргументы.
Нам нужна квадратная форма, поэтому нам нужно укоротить длинную из сторон. Кроме того, чтобы центрировать изображение, обрезка должна быть выполнена с обеих сторон изображения. Надеюсь, изображение поможет вам понять, что я имею в виду. Визуальное представление обрезки. Красные точки на изображении представляют начальный и конечный пиксели, которые нам нужны, а переменная с чертой численно равна той же переменной без черты.
Теперь, наконец, код:
int imageHeight = image.getHeight(); //get original image height
int imageWidth = image.getWidth(); //get original image width
int offset = 0;
int shorterSide = imageWidth < imageHeight ? imageWidth : imageHeight;
int longerSide = imageWidth < imageHeight ? imageHeight : imageWidth;
boolean portrait = imageWidth < imageHeight ? true : false; //find out the image orientation
//number array positions to allocate for one row of the pixels (+ some blanks - explained in the Bitmap.getPixels() documentation)
int stride = shorterSide + 1;
int lengthToCrop = (longerSide - shorterSide) / 2; //number of pixel to remove from each side
//size of the array to hold the pixels (amount of pixels) + (amount of strides after every line)
int pixelArraySize = (shorterSide * shorterSide) + (shorterImageDimension * 1);
int pixels = new int[pixelArraySize];
//now fill the pixels with the selected range
image.getPixels(pixels, 0, stride, portrait ? 0 : lengthToCrop, portrait ? lengthToCrop : 0, shorterSide, shorterSide);
//save memory
image.recycle();
//create new bitmap to contain the cropped pixels
Bitmap croppedBitmap = Bitmap.createBitmap(shorterSide, shorterSide, Bitmap.Config.ARGB_4444);
croppedBitmap.setPixels(pixels, offset, 0, 0, shorterSide, shorterSide);
//I'd recommend to perform these kind of operations on worker thread
listener.imageCropped(croppedBitmap);
//Or if you like to live dangerously
return croppedBitmap;
Я расширяю метод @sankettt, когда вы хотите уменьшить большое растровое изображение и обрезать его по размеру ImageView.
используйте этот метод:
/**
* crop a img with new expected size
* @param src
* @param newSize
* @return
*/
public static Bitmap scaleAndGenerateBmpWithNewSize(Bitmap src, SizeManager newSize) {
Bitmap bitmapRes;
int imageWidth = src.getWidth();
int imageHeight = src.getHeight();
float newWidth = newSize.width;
float scaleFactor = newWidth / imageWidth;
int newHeight = (int) (imageHeight * scaleFactor);
bitmapRes = Bitmap.createScaledBitmap(src, (int) newWidth, newHeight, true);
bitmapRes = Bitmap.createBitmap(bitmapRes, 0, 0, (int) newWidth, (int) newSize.height);
return bitmapRes;
}
SizeManager класс:
public class SizeManager {
public float width;
public float height;
public SizeManager() {
}
public SizeManager(float width, float height) {
this.width = width;
this.height = height;
}
public void set(float width, float height) {
this.width = width;
this.height = height;
}
public float getWidth() {
return width;
}
public void setWidth(float width) {
this.width = width;
}
public float getHeight() {
return height;
}
public void setHeight(float height) {
this.height = height;
}
}
Использование:
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.src);
imgView.setImageBitmap(scaleAndGenerateBmpWithNewSize(bitmap, new SizeManager(100, 100)));
Для обрезки растрового изображения с заданной шириной слева и справа просто используйте этот код
int totalCropWidth = "your total crop width";
int cropingSize = totalCropWidth / 2;
Bitmap croppedBitmap = Bitmap.createBitmap(yourSourceBitmap, cropingSize ,0,yourSourceBitmapwidth-totalCropWidth , yourheight);
Если у вас есть это,
Rect f = barcode.getBoundingBox();
Bitmap.createBitmap(bmp,f.left,f.top,f.width(),f.height());
Bitmap.createBitmap принимает (bitmap,left,top,width,height)// убедитесь, что ни одно из значений не является отрицательным и не выходит за пределы области изображения.