簡體   English   中英

Android:如何覆蓋位圖並在位圖上繪制?

[英]Android: How to overlay a bitmap and draw over a bitmap?

其實我有三個問題:

  1. 是在位圖上繪制圖像還是創建位圖作為資源然后在位圖上繪制它更好? 性能明智,哪個更好?
  2. 如果我想在位圖上繪制透明的東西,我該怎么做?
  3. 如果我想將一個透明位圖覆蓋在另一個上,我該怎么做?

抱歉,列表很長,但為了學習的興趣,我想探索這兩種方法。

我不敢相信還沒有人回答這個問題! 罕見的發生在 SO!

1

這個問題對我來說不是很有意義。 但我會試一試。 如果您詢問直接繪制到畫布(多邊形、陰影、文本等)與加載位圖並將其位圖傳送到畫布上,這取決於您的繪圖的復雜性。 隨着繪圖變得越來越復雜,所需的 CPU 時間也會相應增加。 但是,將位圖塊傳輸到畫布上將始終是一個與位圖大小成正比的恆定時間。

2

在不知道什么是“某事”的情況下,我如何向您展示如何去做? 您應該能夠從#3 的答案中找出#2。

3

假設:

  • bmp1 大於 bmp2。
  • 您希望它們都從左上角覆蓋。

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

這個想法很簡單:一旦將位圖與畫布相關聯,就可以調用畫布的任何方法來繪制位圖。

這適用於具有透明度的位圖。 如果位圖具有 Alpha 通道,則位圖將具有透明度。 看看Bitmap.Config 您可能想要使用 ARGB_8888。

重要提示:查看Android 示例以了解執行繪圖的不同方式。 它會幫助你很多。

性能方面(確切地說是內存方面),位圖是最好的對象,因為它們只是包裝了一個原生位圖。 ImageView 是 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);

最后,image 將包含 image 和 image2 的重疊部分。

我認為這個例子肯定會幫助你在另一個圖像上疊加一個透明圖像。 這是通過在畫布上繪制圖像並返回位圖圖像來實現的。

閱讀更多或在此處下載演示

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上以編程方式合並多個圖像

對於 Kotlin 粉絲:

  1. 你可以創建一個更通用的擴展:
 private fun Bitmap.addOverlay(@DimenRes marginTop: Int, @DimenRes marginLeft: Int, overlay: Bitmap): Bitmap? {
        val bitmapWidth = this.width
        val bitmapHeight = this.height
        val marginLeft = shareBitmapWidth - overlay.width - resources.getDimension(marginLeft)
        val finalBitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, this
            .config)

        val canvas = Canvas(finalBitmap)
        canvas.drawBitmap(this, Matrix(), null)
        canvas.drawBitmap(overlay, marginLeft, resources.getDimension(marginTop), null)
        return finalBitmap
    }

  1. 然后按如下方式使用它:
 bitmap.addOverlay( R.dimen.top_margin, R.dimen.left_margin, overlayBitmap)
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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM