Как вырезать из Bitmap круг или другую фигуру?

Рейтинг: 1Ответов: 3Опубликовано: 12.02.2015

Всем привет! Мне интересно, как можно из bitmap вырезать какую-либо фигуру, не прямоугольник? Как я знаю, прямоугольник можно копировать из битмапа с помощью Bitmap.createBitmap (параметры копируемого прямоугольника). Есть ли что-то подобное для круга или треугольника? И еще интересно, можно ли не копировать, а именно вырезать? Чтоб вместо нее были пиксели transparent, к примеру.

Ответы

▲ 2Принят

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

Как вырезать что-либо из изображения?
Закрасить прозрачным цветом нужную область.

▲ 4

Например, круг вырезать. Как избежать OutOfMemoryException.

public static Bitmap makeRoundedBitmap(Bitmap bitmap) {
        Bitmap bmp;
        bmp = Bitmap.createBitmap(
                bitmap.getWidth(),
                bitmap.getHeight(),
                Bitmap.Config.ARGB_4444);
        int color = 0xff424242;
        int circleRadius;
        int height = bmp.getHeight();
        int width = bmp.getWidth();

        Canvas canvas = new Canvas(bmp);
        Paint paint = new Paint();
        Rect rect = new Rect(0, 0, width, height);

        if (width <= height) {
            circleRadius = width / 2;
        } else
            circleRadius = height / 2;

        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawCircle(width / 2, height / 2, circleRadius, paint);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);
        return bmp;
    }
▲ 1

Правильный ответ:

private Bitmap getCroppedBitmap(Bitmap bitmap, Integer cx, Integer cy, Integer radius) {
    int diam = radius << 1;
    Bitmap targetBitmap = Bitmap.createBitmap(diam, diam, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(targetBitmap);
    final int color = 0xff424242;
    final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    canvas.drawARGB(0, 0, 0, 0);
    paint.setColor(color);
    canvas.drawCircle(radius, radius, radius, paint);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    canvas.drawBitmap(bitmap, -cx+radius, -cy+radius, paint);
    return targetBitmap;
}