Объединение изображений, где 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);
    }
}

Ответы на вопрос(2)

Ваш ответ на вопрос