Удаление выбранного количества строк пикселей из изображения в C # [dубликат]

Как я могу обрезать растровое изображение? это мой вопрос, я пробовал некоторые концепции, используя намерения, но все же терпит неудачу ..

У меня есть растровое изображение, которое я хочу обрезать !!

вот код:

 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

40
задан 3 April 2013 в 19:20

3 ответа

Использование вышеприведенного ответа не работает, если вы хотите, чтобы вырезали / обрезали области вне пределов! Используя этот код, вы всегда получите желаемый размер - даже если источник меньше.

//  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);

... и все готово!

11
ответ дан 15 August 2018 в 14:46

У меня была схожая проблема с обрезкой, и, попробовав многочисленные подходы, я понял это, что имело смысл для меня. Этот метод только приравнивает изображение к квадратной форме, я все еще работаю над круговой формой (не стесняйтесь модифицировать код, чтобы получить нужную вам форму).

Итак, сначала у вас есть растровое изображение, которое вы хотите crop:

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;
1
ответ дан 15 August 2018 в 14:46

Я использовал этот метод для обрезки изображения, и он отлично работает:

Bitmap bmp=BitmapFactory.decodeResource(getResources(), R.drawable.xyz);

resizedbitmap1=Bitmap.createBitmap(bmp, 0,0,yourwidth, yourheight);

createBitmap () принимает растровое изображение, запускает X, запускает Y, width & amp; высота как параметр

103
ответ дан 15 August 2018 в 14:46
  • 1
    sankettt, о вашей ширине, вашем свете; не могли бы вы вкратце объяснить – user 3 April 2013 в 19:20
  • 2
    sankettt в любом случае спасибо – user 3 April 2013 в 19:20
  • 3
    @ priya2134412 уверен. его ширину и высоту количества растрового изображения, которое вы хотите уронить. Эта часть, которую вы хотите обрезать – sankettt 3 April 2013 в 19:23
  • 4
    sankettt я должен использовать любой класс !! – user 3 April 2013 в 19:26
  • 5
    Нет, просто используйте его напрямую и resizedbitmap, где бы вы ни захотели. Я использовал этот код для создания анимации кадра, разрезав изображение на несколько секций и загружая каждый раздел в кадр – sankettt 3 April 2013 в 19:29

Другие вопросы по тегам:

Похожие вопросы: