如何在Java中将图像叠加在一起?

时间:2009-03-13 22:59:42

标签: java awt overlay drawimage

所以我一直在发帖,但还没有得到一个可靠的答案:

我使用裁剪方法创建了一个图像大小调整类。种植很有效。我遇到的问题是我在drawImage Graphics函数中指定的背景颜色无法正常工作。无论我提供什么(在这种情况下为Color.WHITE),它都默认为黑色作为背景。

此外,重叠图像或最顶层图像(来自文件)正在被反转(我认为是)或以其他方式变色。只是这样你可以更好地概念化这个,我正在使用jpeg并将其覆盖在新的BufferedImage之上,新的缓冲图像的背景未被设置。以下是我正在使用的代码:

public void Crop(int Height, int Width, int SourceX, int SourceY) throws Exception {
    //output height and width
    int OutputWidth = this.OutputImage.getWidth();
    int OutputHeight = this.OutputImage.getHeight();

    //create output streams
    ByteArrayOutputStream MyByteArrayOutputStream = new ByteArrayOutputStream();
    MemoryCacheImageOutputStream MyMemoryCacheImageOutputStream = new MemoryCacheImageOutputStream(MyByteArrayOutputStream);

    //Create a new  BufferedImage
    BufferedImage NewImage = new BufferedImage(Width, Height, BufferedImage.TYPE_INT_RGB);
    Graphics MyGraphics = NewImage.createGraphics();

    MyGraphics.drawImage(this.OutputImage, -SourceX, -SourceY, OutputWidth, OutputHeight, Color.WHITE, null);

    // Get Writer and set compression
    Iterator MyIterator = ImageIO.getImageWritersByFormatName("png");
    if (MyIterator.hasNext()) {
        //get image writer
        ImageWriter MyImageWriter = (ImageWriter)MyIterator.next();

        //get params
        ImageWriteParam MyImageWriteParam = MyImageWriter.getDefaultWriteParam();

        //set outputstream
        MyImageWriter.setOutput(MyMemoryCacheImageOutputStream);

        //create new ioimage
        IIOImage MyIIOImage = new IIOImage(NewImage, null, null);

        //write new image
        MyImageWriter.write(null, MyIIOImage, MyImageWriteParam);
    }

    //convert output stream back to inputstream
    ByteArrayInputStream MyByteArrayInputStream = new ByteArrayInputStream(MyByteArrayOutputStream.toByteArray());
    MemoryCacheImageInputStream MyMemoryCacheImageInputStream = new MemoryCacheImageInputStream(MyByteArrayInputStream);

    //resassign as a buffered image
    this.OutputImage = ImageIO.read(MyMemoryCacheImageInputStream);
}

2 个答案:

答案 0 :(得分:1)

您能否分辨出图形方法或ImageIO方法是否会破坏您的图像?看起来你可以通过短路整个ImageIO过程并简单地分配

来测试它
this.OutputImage = NewImage;

就此而言,我认为ImageIO的操作有所收获吗?在编写样本时,它似乎(理想情况下)是无操作。

此外,在开始ImageIO过程之前,不要丢弃Graphics2D。它通常没有什么区别,但你不想假设它。

答案 1 :(得分:1)

在叠加颜色失真问题上,确保您的图形上下文处于绘画模式而不是xor模式。 (Graphics.setPaintMode())。否则,颜色位一起进行异或。