Combinando imagens onde BG é um JPEG causa resultados inesperados
Por que combinar imagens onde o BG é um JPEG causa resultados inesperados?
Este é um follow-up para a minha resposta emA sobreposição de 2 imagens não funciona corretamente. A fonte postada lá (usando uma imagem BG criada na memória) se parece com isso:
A imagem do BG está à esquerda.A imagem FG (um PNG com transparência) está no meio.A imagem combinada está à direita.Por enquanto, tudo bem. Mas então a pessoa que fez a pergunta comentou que se o BG fosse um JPEG, ele falhou. Pensando que estavam enganados, alterei meu exemplo para codificar a imagem do BG para um JPEG. Agora se eu usarBufferedImage.TYPE_INT_ARGB
ouBufferedImage.TYPE_INT_RGB
para a imagem final, recebo o que eles estavam se referindo:
TYPE_INT_ARGB
TYPE_INT_RGB
Eu esperava que o resultado fosse o mesmo que o original para pelo menos um deles (mais aindaARGB
variante).
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);
}
}