当前位置: 首页 > 知识库问答 >
问题:

在旧图像上绘制新图像java

燕星鹏
2023-03-14
    BufferedImage newImage = ImageIO.read(new File("new.png"));
    BufferedImage oldImage = ImageIO.read(new File("old.png"));

    newImage = makeWhiteTransparent(newImage);
    oldImage = makeWhiteTransparent(oldImage);

    Graphics2D graphics = (Graphics2D) oldImage.getGraphics();
    graphics.drawImage(newImage,null, 0,0);

    File outputImage = new File("merged.png");
    ImageIO.write(oldImage, "png", outputImage);

我的makeWhiteTransparent方法如下所示:

    public static BufferedImage makeWhiteTransparent(BufferedImage img){
        BufferedImage dst = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
        dst.getGraphics().drawImage(img, 0, 0, null);
        int markerRGB = Color.WHITE.getRGB() | 0xFF000000;
        int width = dst.getWidth();
        int height = dst.getHeight();
        for(int x = 0; x < width; x++){
            for(int y = 0; y < height; y++){
                int rgb = dst.getRGB(x, y);
                if ( ( rgb | 0xFF000000 ) == markerRGB ) {
                    int value = 0x00FFFFFF & rgb;
                    dst.setRGB(x, y, value); 
                }
            }
        }
        return dst;
    }

我尝试将graphics.drawImage(newImage,null,0,0)更改为graphics.drawImage(newImage,0,0,null),并按照建议将TYPE_4BYTE_ABGR更改为TYPE_INT_ARGB,但没有任何效果。错误仍然存在。

共有1个答案

乐健
2023-03-14

这需要改变:

graphics.drawImage(newImage,null, 0,0);

graphics.drawImage(newImage, 0,0, null);

您使用了错误版本的drawImage-请检查http://docs.oracle.com/javase/7/docs/api/java/awt/graphics2d.html

public BufferedImage makeWhiteTransparent(BufferedImage img){
    BufferedImage dst = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB);
    dst.getGraphics().drawImage(img, 0, 0, null);
    int markerRGB = 0x00ffffff; // Color.WHITE.getRGB() | 0xFF000000;
    int width = dst.getWidth();
    int height = dst.getHeight();
    for(int x = 0; x < width; x++){
        for(int y = 0; y < height; y++){
            int rgb = dst.getRGB(x, y)&0x00ffffff;
            if ( rgb  == markerRGB ) {
                int value = 0x00FFFFFF & rgb;
                dst.setRGB(x, y, value); 
            }
        }
    }
    return dst;
}

bim = makeWhiteTransparent(bim);
bim2 = makeWhiteTransparent(bim2);

Graphics2D graphics = (Graphics2D) bim.getGraphics();
graphics.drawImage(bim2,0,0, null);

g2.drawImage(bim, w/2-wc/2, h/2-hc/2, null);
 类似资料:
  • 为什么我上传新图片时不能删除我的旧图片? 这是我用来存储数据和图像的控制器。我的文件图像名由nama_post_adps和$imageName组合存储,其中$imageName是对

  • 除了绘制矢量图形和文本之外,canvas还提供了极为丰富的图像支持。开发者可以选择绘制某幅图像的全部或某个部分,在绘制时可以进行缩放或保持原样,可以把图像绘制到画布的任何地方。同时,还允许开发人员直接访问画布的像素数据。数据访问是双向的,既可以获取画布中的像素数据,也可以把像素重新绘制到画布中。 Canvas的API提供了如下4个用于绘制及操作图像的方法: drawImage():把图像、或另一个

  • 通过绘制一幅简单的图像,让我们直奔主题。本节,我们将学习如何加载一幅图像,并把它绘制到画布的某个地方。 图3-1 绘制图像 绘制步骤 按照以下步骤,在画布中央绘制一幅图像: 1. 定义画布上下文: window.onload  = function(){ var canvas  = document.getElementById("myCanvas"); var context  = c

  • 2D 绘图上下文内置了对图像的支持。如果你想把一幅图像绘制到画布上,可以使用drawImage()方法。根据期望的最终结果不同,调用这个方法时,可以使用三种不同的参数组合。最简单的调用方式是传入一个HTML <img>元素,以及绘制该图像的起点的x 和y 坐标。例如: var image = document.images[0]; context.drawImage(image, 10, 10);

  • 我看了java文档和其他文章没有找到答案,这是我的最后一招:/ 提前致谢

  • 问题内容: 我有一个带有两个按钮的面板。我正在尝试在面板内插入图像,我想在单击按钮后在图像内画线。我使用了下面的代码,但这似乎不起作用。 最大的问题是我的其他班级使用的相同代码。 问题答案: 尝试在更新后包装内部。同样,当您完成对图形上下文的渲染时,还应该调用。 您还应该依靠布局管理器,而不是自己动手做,这只会使您的生活更轻松。 就个人而言,我认为将其直接绘制到自定义组件会更容易。查看执行自定义绘