Android:如何覆盖位图/绘制位图?

其实我有两个问题:

  1. 在位图上绘制图像还是创build一个位图作为资源然后通过位图绘制它会更好吗? performance明智…哪一个更好?
  2. 如果我想在位图上绘制透明的东西,我该如何去做呢?
  3. 如果我想叠加一个透明的位图,我该怎么做?

对不起,长长的名单,但为了学习的兴趣,我想探索两种方法…

我不相信没有人回答这个问题呢! SO上罕见的事件!

1

问题对我来说不太合理。 但是生病了。 如果你问直接绘制到一个canvas(多边形,阴影,文本等)VS加载一个位图,并将其布莱恩canvas上,这取决于您的绘图的复杂性。 随着绘图变得越来越复杂,所需的CPU时间将相应增加。 但是,将位图传输到canvas上始终是一个与位图大小成比例的恒定时间。

2

不知道什么是“什么”,我怎么能告诉你如何做到这一点? 你应该能够从#3的答案中找出#2。

3

假设:

  • bmp1是两者中较大的一个
  • 你希望他们都从左上angular覆盖。

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

这个想法非常简单:一旦将一个位图与一个canvas相关联,就可以调用任何一个canvas的方法来绘制位图。

这将适用于具有透明度的位图。 一个位图将具有透明度,如果它有一个alpha通道。 看看Bitmap.Config 。 你可能会想使用ARGB_8888。

重要提示:查看这个 Android示例,了解可以执行绘制的不同方法。 它会帮助你很多。

性能明智(精确地说是内存),位图是最好的使用对象,因为它们只是简单地包装本地位图。 一个ImageView是View的一个子类,BitmapDrawable内部包含一个Bitmap,但它也包含许多其他的东西。 但是这是一个过度简化。 你可以build议一个性能特定的场景,以获得准确的答案。

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

并在button点击时调用上述函数,并将两个图像传递给我们的函数,如下所示

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