合并两张位图图片(并排)

22

有人能帮忙将两个位图图像合并成单个位图图像吗?

在Android中(并排)。

谢谢, Yuvaraj

4个回答

75
你可以使用 Canvas - 可以查看这篇文章:

http://www.jondev.net/articles/Combining_2_Images_in_Android_using_Canvas

已更新的代码可将其并排拼接。
public Bitmap combineImages(Bitmap c, Bitmap s) { // can add a 3rd parameter 'String loc' if you want to save the new image - left some code to do that at the bottom 
    Bitmap cs = null; 

    int width, height = 0; 

    if(c.getWidth() > s.getWidth()) { 
      width = c.getWidth() + s.getWidth(); 
      height = c.getHeight(); 
    } else { 
      width = s.getWidth() + s.getWidth(); 
      height = c.getHeight(); 
    } 

    cs = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 

    Canvas comboImage = new Canvas(cs); 

    comboImage.drawBitmap(c, 0f, 0f, null); 
    comboImage.drawBitmap(s, c.getWidth(), 0f, null); 

    // this is an extra bit I added, just incase you want to save the new image somewhere and then return the location 
    /*String tmpImg = String.valueOf(System.currentTimeMillis()) + ".png"; 

    OutputStream os = null; 
    try { 
      os = new FileOutputStream(loc + tmpImg); 
      cs.compress(CompressFormat.PNG, 100, os); 
    } catch(IOException e) { 
      Log.e("combineImages", "problem combining images", e); 
    }*/ 

    return cs; 
  } 

1
谢谢xil3。我试过那个方法,但它会将两张图片合并在一起,一张在另一张下面。但是我需要将两张图片并排合并。 - Yuvaraj
我更新了答案,并附上了代码,应该可以并行工作。与原始代码相比只有一些小修改。 - xil3
有人能上传图像合并的完整源代码吗?我急需...请任何人帮忙。提前致谢。 - Farhan Shah
如何将第二张图片放在第一张图片的右上角?这段代码将第二张图片放在第一张图片的右侧。 - Hardik Joshi
1
根据我的被拒绝的编辑,这里的尺寸计算有点偏差。将图像并排放置时,宽度始终为c+s,并且您需要从c和s中选择更高的高度。以下是该部分的正确代码:if (c.getHeight() > s.getHeight()) { width = c.getWidth() + s.getWidth(); height = c.getHeight(); } else { width = c.getWidth() + s.getWidth(); height = s.getHeight(); } - Timo Albert

1

我最终将xil3的答案修改为Kotlin扩展函数,也许对某些人有用。在我的情况下,我想要垂直堆叠图像。

fun Bitmap?.combine(b: Bitmap?): Bitmap? =
when {
    b == null || this == null -> {
        this ?: b
    } else -> {
        val cs = Bitmap.createBitmap(
            max(this.width, b.width),
            this.height + b.height,
            Bitmap.Config.ARGB_8888
        )
        val canvas = Canvas(cs)
        canvas.drawBitmap(this, 0f, 0f, null)
        canvas.drawBitmap(b, 0f, this.height.toFloat(), null)
        cs
    }
}

0

选定答案非常出色。 如果您想使用位图数组并且并排查看,请参见以下内容:

private Bitmap combineImageIntoOneFlexWidth(ArrayList<Bitmap> bitmap) {
        int w = 0, h = 0;
        for (int i = 0; i < bitmap.size(); i++) {
            if (i < bitmap.size() - 1) {
                h = bitmap.get(i).getHeight() > bitmap.get(i + 1).getHeight() ? bitmap.get(i).getHeight() : bitmap.get(i + 1).getHeight();
            }
            w += bitmap.get(i).getWidth();
        }

        Bitmap temp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(temp);
        int top = 0;
        for (int i = 0; i < bitmap.size(); i++) {
            Log.e("HTML", "Combine: " + i + "/" + bitmap.size() + 1);

            top = (i == 0 ? 0 : top + bitmap.get(i).getWidth());
            //attributes 1:bitmap,2:width that starts drawing,3:height that starts drawing
            canvas.drawBitmap(bitmap.get(i), top, 0f, null);
        }
        return temp;
    }

0
这是一个函数,可以将位图数组水平或垂直合并:
public Bitmap combineBitmaps(ArrayList<Bitmap> bitmaps, Boolean isHorizontal) {
    int w = 0, h = 0;
    for (int i = 0; i < bitmaps.size(); i++) {
        if(i == 0 || isHorizontal){
            w += bitmaps.get(i).getWidth();
        } else if(!isHorizontal && bitmaps.get(i).getWidth() > w) {
            w = bitmaps.get(i).getWidth();
        }
        if(i == 0 || !isHorizontal){
            h += bitmaps.get(i).getHeight();
        } else if(isHorizontal && bitmaps.get(i).getHeight() > h) {
            h = bitmaps.get(i).getHeight();
        }
    }
    Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    int pos = 0;
    for (int i = 0; i < bitmaps.size(); i++) {
        if(isHorizontal){
            canvas.drawBitmap(bitmaps.get(i), pos, 0f, null);
        } else {
            canvas.drawBitmap(bitmaps.get(i), 0f, pos, null);
        }
        pos += isHorizontal ? bitmaps.get(i).getWidth() : bitmaps.get(i).getHeight();
    }
    return bitmap;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接