Android: Как наложить растровое изображение/нарисовать поверх растрового изображения?



У меня есть два вопроса на самом деле:




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

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

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


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

846   6  

6 ответов:

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

1

вопрос не совсем имеет смысл для меня. Но я нанесу ему удар. Если вы спрашиваете о прямом рисовании на холсте (полигоны, затенение, текст и т. д...) VS загрузка растрового изображения и размытие его на холсте, что будет зависеть от сложности вашего рисунка. По мере усложнения чертежа требуемое время процессора будет соответственно увеличиваться. Тем не менее, размытие растрового изображения на холсте будет всегда будет постоянное время, которое пропорционально размеру растрового изображения.

2

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

3

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

  • bmp1 является большим из двух
  • вы хотите, чтобы они оба накладным от верхнего левого угла.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.