Объединение изображений, где BG является JPEG, приводит к неожиданным результатам
Почему объединение изображений, где BG является JPEG, приводит к неожиданным результатам?
Это продолжение моего ответа вНаложение 2 изображений не работает должным образом, Размещенный там источник (с использованием BG-изображения, созданного в памяти) выглядит следующим образом:
Изображение BG слева.Изображение FG (PNG с прозрачностью) находится посередине.Комбинированное изображение справа.Все идет нормально. Но затем человек, который задал вопрос, сказал, что, если BG был JPEG, он потерпел неудачу. Думая, что они ошиблись, я изменил свой пример для кодирования изображения BG в JPEG. Теперь, если я используюBufferedImage.TYPE_INT_ARGB
или жеBufferedImage.TYPE_INT_RGB
для окончательного изображения я получаю то, что они имели в виду:
TYPE_INT_ARGB
TYPE_INT_RGB
Я ожидал, что результат будет таким же, как оригинал, по крайней мере, для одного из них (тем более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);
}
}