Android: как наложить растровое изображение и нарисовать поверх растрового изображения? - PullRequest
56 голосов
/ 09 октября 2009

На самом деле у меня три вопроса:

  1. Лучше ли нарисовать изображение на растровом изображении или создать растровое изображение в качестве ресурса, а затем нарисовать его поверх растрового изображения? Производительность мудрая, какая из них лучше?
  2. Если я хочу нарисовать что-то прозрачное поверх растрового изображения, как бы я это сделал?
  3. Если я хочу наложить одно прозрачное растровое изображение на другое, как бы я это сделал?

Извините за длинный список, но в интересах изучения, я хотел бы изучить оба подхода.

Ответы [ 6 ]

104 голосов
/ 18 февраля 2010

Не могу поверить, что никто еще не ответил на это! Редкое явление на SO!

1

Вопрос не совсем имеет для меня смысл. Но я сделаю это. Если вы спрашиваете о прямом рисовании на холсте (полигоны, штриховка, текст и т. Д.), А не о загрузке растрового изображения и перетаскивании его на холст, это будет зависеть от сложности вашего рисунка. По мере усложнения чертежа требуемое время ЦП будет соответственно увеличиваться. Однако перетаскивание растрового изображения на холст всегда будет постоянным временем, пропорциональным размеру растрового изображения.

2

Не зная, что такое «что-то», как я могу показать вам, как это сделать? Вы должны быть в состоянии выяснить № 2 из ответа на № 3.

3

Предположения:

  • bmp1 больше, чем bmp2.
  • Вы хотите, чтобы они оба были наложены в верхнем левом углу.

        private Bitmap overlay(Bitmap bmp1, Bitmap bmp2) {
            Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig());
            Canvas canvas = new Canvas(bmOverlay);
            canvas.drawBitmap(bmp1, new Matrix(), null);
            canvas.drawBitmap(bmp2, new Matrix(), null);
            return bmOverlay;
        }
    
29 голосов
/ 29 января 2011

Вы можете сделать что-то вроде этого:

public void putOverlay(Bitmap bitmap, Bitmap overlay) {
    Canvas canvas = new Canvas(bitmap);
    Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG);
    canvas.drawBitmap(overlay, 0, 0, paint);
} 

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

Это будет работать для растровых изображений с прозрачностью. Растровое изображение будет иметь прозрачность, если оно имеет альфа-канал. Посмотрите на Bitmap.Config . Возможно, вы захотите использовать ARGB_8888.

Важно: посмотрите на этот пример Android для различных способов рисования. Это вам очень поможет.

С точки зрения производительности (точнее, памяти) точнее, растровые изображения - лучший объект для использования, поскольку они просто переносят исходное растровое изображение. ImageView является подклассом View, а BitmapDrawable содержит внутри Bitmap, но также содержит и много других вещей. Но это чрезмерное упрощение. Вы можете предложить конкретный сценарий для точного ответа.

12 голосов
/ 21 октября 2015
public static Bitmap overlayBitmapToCenter(Bitmap bitmap1, Bitmap bitmap2) {
    int bitmap1Width = bitmap1.getWidth();
    int bitmap1Height = bitmap1.getHeight();
    int bitmap2Width = bitmap2.getWidth();
    int bitmap2Height = bitmap2.getHeight();

    float marginLeft = (float) (bitmap1Width * 0.5 - bitmap2Width * 0.5);
    float marginTop = (float) (bitmap1Height * 0.5 - bitmap2Height * 0.5);

    Bitmap overlayBitmap = Bitmap.createBitmap(bitmap1Width, bitmap1Height, bitmap1.getConfig());
    Canvas canvas = new Canvas(overlayBitmap);
    canvas.drawBitmap(bitmap1, new Matrix(), null);
    canvas.drawBitmap(bitmap2, marginLeft, marginTop, null);
    return overlayBitmap;
}
1 голос
/ 19 декабря 2016

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

Подробнее или скачать демо здесь

private Bitmap createSingleImageFromMultipleImages(Bitmap firstImage, Bitmap secondImage){

        Bitmap result = Bitmap.createBitmap(firstImage.getWidth(), firstImage.getHeight(), firstImage.getConfig());
        Canvas canvas = new Canvas(result);
        canvas.drawBitmap(firstImage, 0f, 0f, null);
        canvas.drawBitmap(secondImage, 10, 10, null);
        return result;
    }

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

public void buttonMerge(View view) {

        Bitmap bigImage = BitmapFactory.decodeResource(getResources(), R.drawable.img1);
        Bitmap smallImage = BitmapFactory.decodeResource(getResources(), R.drawable.img2);
        Bitmap mergedImages = createSingleImageFromMultipleImages(bigImage, smallImage);

        img.setImageBitmap(mergedImages);
    }

Для более чем двух изображений, вы можете перейти по этой ссылке, как программно объединить несколько изображений на Android

1 голос
/ 19 октября 2012

Если целью является получение растрового изображения, это очень просто:

Canvas canvas = new Canvas();
canvas.setBitmap(image);
canvas.drawBitmap(image2, new Matrix(), null);

В конце изображение будет содержать перекрытие изображения и изображения 2.

0 голосов
/ 25 июля 2017
public static Bitmap createSingleImageFromMultipleImages(Bitmap firstImage, Bitmap secondImage, ImageView secondImageView){

    Bitmap result = Bitmap.createBitmap(firstImage.getWidth(), firstImage.getHeight(), firstImage.getConfig());
    Canvas canvas = new Canvas(result);
    canvas.drawBitmap(firstImage, 0f, 0f, null);
    canvas.drawBitmap(secondImage, secondImageView.getX(), secondImageView.getY(), null);

    return result;
}
...