[英]Android: How to overlay a bitmap and draw over a bitmap?
其實我有三個問題:
抱歉,列表很長,但為了學習的興趣,我想探索這兩種方法。
我不敢相信還沒有人回答這個問題! 罕見的發生在 SO!
這個問題對我來說不是很有意義。 但我會試一試。 如果您詢問直接繪制到畫布(多邊形、陰影、文本等)與加載位圖並將其位圖傳送到畫布上,這取決於您的繪圖的復雜性。 隨着繪圖變得越來越復雜,所需的 CPU 時間也會相應增加。 但是,將位圖塊傳輸到畫布上將始終是一個與位圖大小成正比的恆定時間。
在不知道什么是“某事”的情況下,我如何向您展示如何去做? 您應該能夠從#3 的答案中找出#2。
假設:
您希望它們都從左上角覆蓋。
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 粉絲:
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
}
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.