Łączenie obrazów, w których BG jest JPEG, powoduje nieoczekiwane rezultaty
Dlaczego łączenie obrazów, w których BG jest JPEG, powoduje nieoczekiwane rezultaty?
To jest kontynuacja mojej odpowiedzi wNakładanie 2 zdjęć nie działa prawidłowo. Źródło zamieszczone tam (używając obrazu BG utworzonego w pamięci) wygląda tak:
Obraz BG znajduje się po lewej stronie.Obraz FG (PNG z przezroczystością) znajduje się pośrodku.Połączony obraz jest po prawej stronie.Jak na razie dobrze. Ale wtedy osoba, która zadała pytanie, skomentowała, że jeśli BG jest JPEG, nie powiodło się. Myśląc, że się mylili, zmieniłam przykład, aby zakodować obraz BG do JPEG. Teraz, jeśli użyjęBufferedImage.TYPE_INT_ARGB
lubBufferedImage.TYPE_INT_RGB
na ostateczny obraz otrzymuję to, o czym mówili:
TYPE_INT_ARGB
TYPE_INT_RGB
Spodziewałem się, że wynik będzie taki sam jak oryginał dla przynajmniej jednego z nich (bardziejARGB
wariant).
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);
}
}