2014-10-08 4 views
12

Как я могу вырезать прямоугольное изображение (600 x 300) слева и справа, чтобы вставить квадрат ImageView? Я не хочу, чтобы изменить размер изображения, я просто хочу, чтобы обрезать его, чтобы быть 300 х 300.Обрезать изображение на квадрат - Android

[РЕШЕНИЕ]

Как @blackbelt сказал

Bitmap cropImg = Bitmap.createBitmap(src, startX, startY, dstWidth, dstHeight);

велик для обрезки изображений. Итак, как вы можете автоматически обрезать изображения разных размеров. Я создаю этот простой код для этого:

// From drawable 
Bitmap src= BitmapFactory.decodeResource(context.getResources(), R.drawable.image); 

// From URL 
Bitmap src = null; 
try { 
    String URL = "http://www.example.com/image.jpg"; 
    InputStream in = new java.net.URL(URL).openStream(); 
    src = BitmapFactory.decodeStream(in); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

int width = src.getWidth(); 
int height = src.getHeight(); 
int crop = (width - height)/2; 
Bitmap cropImg = Bitmap.createBitmap(src, crop, 0, height, height); 

ImageView.setImageBitmap(cropImg); 

ответ

3

Вы можете использовать

Bitmap dst = Bitmap.createBitmap(src, startX, startY, dstWidth, dstHeight); 

из документации:

Возвращает неизменяемое растровое изображение из заданного подмножества исходного растрового изображения. Новый битмап может быть тем же объектом, что и источник, или копия может быть выполнена . Он инициализируется с той же плотностью, что и исходное растровое изображение .

Here вы можете найти в документации

16

Расширяющаяся немного на ответ выше

Поскольку в некоторых ситуациях вы можете в конечном итоге с исключением или не ожидается результат, только с помощью Bitmap.createBitmap(), как и для заполнения:

java.lang.IllegalArgumentException: х + ширина должна быть < = bitmap.width()

Heres является небольшая функция, которая делает урожай и обрабатывать некоторые из случаев общин.

Редактировать: Обновлено в соответствии с требованием дроидстра.

public static Bitmap cropToSquare(Bitmap bitmap){ 
    int width = bitmap.getWidth(); 
    int height = bitmap.getHeight(); 
    int newWidth = (height > width) ? width : height; 
    int newHeight = (height > width)? height - (height - width) : height; 
    int cropW = (width - height)/2; 
    cropW = (cropW < 0)? 0: cropW; 
    int cropH = (height - width)/2; 
    cropH = (cropH < 0)? 0: cropH; 
    Bitmap cropImg = Bitmap.createBitmap(bitmap, cropW, cropH, newWidth, newHeight); 

    return cropImg; 
} 

Я провел несколько испытаний с некоторыми изображениями разных разрешений и размеров, и он работает должным образом.

Его также можно использовать в других ситуациях, например, когда вы пытаетесь создать «идеальное» круглое изображение и нужно передать квадратное растровое изображение и т. Д.

+1

Это именно то, что я искал, чтобы получить идеально круговые изображения, а не овальные. Однако, если высота изображения больше ширины, не обрезается в центре, потому что значение y param равно 0 в методе createBitmap. Вот как это можно исправить: добавьте эти 2 строки: 'int cropH = (высота - ширина)/2; \t cropH = (cropH <0)? 0: cropH; 'Использовать значение cropH как y. \t 'Bitmap cropImg = Bitmap.createBitmap (bitmap, cropW, cropH, newWidth, newHeight);' –

+0

Приятно, я вижу вашу точку ... В основном, чтобы делать те же вычисления для ширины и высоты. –

1

набор высоты вид неподвижное изображение, ширина и установить два свойства зрения

android:adjustViewBounds="true" 
android:scaleType="centerCrop" 

изображение сделано

Смежные вопросы