我实际上有三个问题:
对于长长的清单感到抱歉,但为了学习,我想探索两种方法。
答案 0 :(得分:104)
我简直不敢相信没有人回答这个问题! SO上很少见!
这个问题对我来说没有意义。但是我会给它一个刺。 如果您要求直接绘制到画布(多边形,阴影,文本等等),而不是加载位图并将其blitting到画布上,这取决于绘图的复杂程度。 随着绘图变得越来越复杂,所需的CPU时间也会相应增加。 但是,将位图blitting到画布上将始终是一个与位图大小成比例的常量时间。
如果不知道“某事”是什么,我怎么能告诉你该怎么做? 你应该能够从#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;
}
答案 1 :(得分:28)
您可以这样做:
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。
重要提示:请查看this Android示例,了解可以执行绘图的不同方法。它会对你有所帮助。
性能方面(内存方面,确切地说),Bitmaps是最好的对象,因为它们只是包装一个本机位图。 ImageView是View的子类,BitmapDrawable包含一个Bitmap,但它也包含许多其他内容。但这是一种过度简化。您可以为精确答案建议特定于性能的场景。
答案 2 :(得分:12)
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;
}
答案 3 :(得分:1)
如果目的是获取位图,这很简单:
Canvas canvas = new Canvas();
canvas.setBitmap(image);
canvas.drawBitmap(image2, new Matrix(), null);
最后,图像将包含图像和图像2的重叠。
答案 4 :(得分:1)
我认为这个例子肯定会帮助您在另一个图像上叠加透明图像。通过在画布上绘制图像并返回位图图像,可以实现这一点。
阅读更多内容或下载演示here
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);
}
对于两张以上的图片,您可以点击此链接how to merge multiple images programmatically on android
答案 5 :(得分:0)
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;
}
答案 6 :(得分:0)
对于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)