Android:如何叠加位图/绘制位图?

Leg*_*end 57 graphics android drawing overlay bitmap

我实际上有两个问题:

  1. 在位图上绘制图像或创建位图作为资源然后在位图上绘制是否更好?表现明智......哪个更好?
  2. 如果我想在位图上绘制透明的东西,我该怎么做呢?
  3. 如果我想将一个透明位图叠加到另一个上,我该怎么做?

对于长长的清单感到抱歉,但为了学习,我想探索两种方法......

Dec*_*ghy 105

我不敢相信没有人回答这个问题!在SO上很少发生!

1

问题对我来说没有意义.但生病了.如果你问的是直接绘制到画布(多边形,阴影,文本等......)VS加载一个位图并将其blitting到画布上,这取决于绘图的复杂程度.随着绘图变得越来越复杂,所需的CPU时间也会相应增加.但是,将位图blitting到画布上将始终是一个与位图大小成比例的常量时间.

2

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

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;
        }
    
    Run Code Online (Sandbox Code Playgroud)

  • 九百!:) (13认同)

Lio*_*ior 29

你可以这样做:

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);
} 
Run Code Online (Sandbox Code Playgroud)

这个想法非常简单:将位图与画布关联后,可以调用任何画布的方法来绘制位图.

这适用于具有透明度的位图.如果位图具有Alpha通道,则位图将具有透明度.看看Bitmap.Config.您可能想要使用ARGB_8888.

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

性能方面(内存方面,确切地说),Bitmaps是最好的对象,因为它们只是包装一个本机位图.ImageView是View的子类,BitmapDrawable包含一个Bitmap,但它也包含许多其他内容.但这是一种过度简化.您可以为精确答案建议特定于性能的方案.

  • 我有900张想要将图像叠加到其中的图像..它的工作原理非常好,但为什么它非常慢:(它真的需要时间 (2认同)

Ans*_*hen 14

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;
}
Run Code Online (Sandbox Code Playgroud)