Android: Как наложить-a-bitmap / нарисовать bitmap?

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

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

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

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

    1

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

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

    Идея очень проста: как только вы ассоциируете bitmap с canvasом, вы можете вызвать любой из методов canvas для рисования над растровым изображением.

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

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

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

     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.

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

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

     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

     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; } 
    Давайте будем гением компьютера.