Обрезать изображение на квадрат-Android

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

[решение]

как сказал @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);

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

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

здесь вы можете найти документацию


расширение немного на ответ выше

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

java.ленг.IllegalArgumentException: ширина x + должна быть

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

Edit: обновлено согласно заявлению droidster.

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;
}

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

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


установите фиксированную высоту изображения, ширину и установите два свойства в image view

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

сделал