gpt4 book ai didi

java - 合并 BG 为 JPEG 的图像会导致意外结果

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:25:56 25 4
gpt4 key购买 nike

为什么合并 BG 为 JPEG 的图像会导致意外结果?

这是我在 Overlaying of 2 images doesnt work properly 中回答的后续.那里发布的源代码(使用在内存中创建的 BG 图像)如下所示:

  • 背景图在左边。
  • FG 图像(透明的 PNG)在中间。
  • 合并后的图像在右侧。

到目前为止,还不错。但是后来问问题的人评论说如果BG是JPEG就失败了。认为他们错了,我改变了我的例子,将 BG 图像编码为 JPEG。现在,如果我使用 BufferedImage.TYPE_INT_ARGBBufferedImage.TYPE_INT_RGB 作为最终图像,我会得到它们所指的内容:

TYPE_INT_ARGB

Combined image using a final image that supports transparency

TYPE_INT_RGB

Combined image using a final image that does not support transparency

我希望至少其中一个结果与原始结果相同(ARGB 变体更是如此)。

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.net.URL;
import javax.imageio.ImageIO;

class CombineImages {

public static void main(String[] args) {
Runnable r = new Runnable() {

@Override
public void run() {
try {
URL urlImage1 =
new URL("http://i.stack.imgur.com/T5uTa.png");

// Load the FG image
Image fgImage = ImageIO.read(urlImage1);
int w = fgImage.getWidth(null);
int h = fgImage.getHeight(null);
// Create a non-trasparent BG image
BufferedImage bgImageTemp =
new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);

ByteArrayOutputStream baos =
new ByteArrayOutputStream();
ImageIO.write(bgImageTemp, "jpg", baos);
ByteArrayInputStream bais =
new ByteArrayInputStream(baos.toByteArray());
BufferedImage bgImageJpeg = ImageIO.read(bais);

int result = JOptionPane.showConfirmDialog(
null,
"Use a final image with transparency?",
"Transparency",
JOptionPane.YES_NO_OPTION);

int type = (result==JOptionPane.OK_OPTION ?
BufferedImage.TYPE_INT_ARGB :
BufferedImage.TYPE_INT_RGB);

// Create the final image
BufferedImage finalImage =
new BufferedImage(w,h,type);
Graphics2D g = finalImage.createGraphics();
g.drawImage(bgImageJpeg, w, h, null);
g.drawImage(fgImage, w, h, null);
g.dispose();

JPanel gui = new JPanel(new GridLayout(1,0,5,5));

gui.add(new JLabel(new ImageIcon(bgImageJpeg)));
gui.add(new JLabel(new ImageIcon(fgImage)));
gui.add(new JLabel(new ImageIcon(finalImage)));

JOptionPane.showMessageDialog(null, gui);
} catch (Exception e) {
e.printStackTrace();
}
}
};
SwingUtilities.invokeLater(r);
}
}

最佳答案

看起来这是由于打字错误造成的。

在您引用的 answer 中,形成组合图像的代码是

Graphics2D g = finalImage.createGraphics();
g.drawImage(bgImage, 0, 0, null);
g.drawImage(fgImage, 0, 0, null);

但是在这个问题中,它被改成了,

Graphics2D g = finalImage.createGraphics();
g.drawImage(bgImageJpeg, w, h, null);
g.drawImage(fgImage, w, h, null);

后者在 "top-left corner" 处开始绘图, 它恰好是图像的右下角,所以实际上没有绘制任何东西。然而,前者按预期绘制了整个图像。

关于java - 合并 BG 为 JPEG 的图像会导致意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17816277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com