安卓:如何叠加一个位图/抽取了一个位图?(Android: How to overlay-a-bit

2019-07-21 14:18发布

其实我也两个问题:

  1. 它是更好地在一个位图绘制图像或创建一个位图资源,然后绘制了一个位图? 性能方面......哪一个更好?
  2. 如果我想画的东西在透明位图,我怎么会去这样做呢?
  3. 如果我想在覆盖另一个透明位图,我会怎么做呢?

很抱歉的长长的名单,但在学习的兴趣,我想探讨两个方法...

Answer 1:

我不能相信没有人尚未回答了这个! 一种罕见的发生在这样的!

1

问题并不完全意义的我。 但生病给它一个刺。 如果你问直接绘制在画布(多边形,底纹,文字等)VS加载位图和位图传送到这将取决于您的绘图的复杂的画布。 如该图变得更加复杂所需的CPU时间将相应增加。 然而,位块传输的位图到画布上永远是恒定的时间成比例的所述位图的大小。

2

不知道是什么“东西”是我怎么能告诉你该怎么办呢? 您应该能够从答案找出#2#3。

3

假设:

  • BMP-1是两个大
  • 你希望他们无论从左上角覆盖。

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


Answer 2:

你可以这样做:

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

这个想法很简单:一旦你的位图用帆布关联,则可以调用任何画布方法绘制了位图。

这对于具有透明位图工作。 位图将有透明性,如果它具有alpha通道。 看看Bitmap.Config 。 你可能想使用ARGB_8888。

重要提示:看看这个你可以执行绘图的不同方式的Android样品。 这将帮助你很多。

性能方面(内存的角度来看,是精确的),位图是用最好的对象,因为他们只是换一个本土位图。 一个ImageView的是景观的子类,和BitmapDrawable拥有一个位图里面,但它拥有许多其他事情也是如此。 但是,这是一个过于简单化。 您能否提供一个特定的性能情况进行一个准确的答案。



Answer 3:

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


Answer 4:

如果目的是为了获得一个位图,这是非常简单的:

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

最终,图像将包含图像和图像2的重叠。



Answer 5:

我觉得这个例子一定会帮助你对另一个图像的顶部覆盖透明图像。 这是通过在画布上绘制两个图像并返回一个位图图像成为可能。

阅读或下载演示这里

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编程合并多个图像



Answer 6:

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


文章来源: Android: How to overlay-a-bitmap/draw-over a bitmap?