Java 从 PNG 到 JPG 的转换将白色变为红色

Conversion in Java from PNG to JPG changes white color into red

使用

转换图像时
UploadedFile uf; //as a paremeter in function; PrimeFaces Object;
BufferedImage old = ImageIO.read(uf.getInputstream());
ByteArrayOutputStream temp = new ByteArrayOutputStream();
ImageIO.write(old, "jpg", temp);

白色变成红色..

http://www.primefaces.org/showcase/ui/file/upload/basic.xhtml

效果如下:

你知道如何处理这个问题吗? 提前感谢您的帮助:)

问题是 PNG 文件中的 alpha 通道,它在 JPG 文件中不存在。因此,alpha 通道正在替换输出中的 red/green/blue 通道之一,并且颜色是错误的。 您可以在此处找到如何正确执行此操作的示例:http://www.mkyong.com/java/convert-png-to-jpeg-image-file-in-java/

试试这个:

BufferedImage bufferedImageUp = (BufferedImage)up;    
BufferedImage old = new BufferedImage(bufferedImageUp.getWidth(), bufferedImageUp.getHeight(), bufferedImageUp.TYPE_INT_RGB);
ImageIO.write(old, "jpg", temp);

关键部分是使用白色背景的 RGB 通道将 BufferedImage 写入新的 BufferedImage。这将解决奇怪的颜色问题:

public static InputStream encodeToJpg(String filepath) throws IOException {
    System.out.println("Encoding to JPG...");
    BufferedImage buffImg;
    InputStream origStream = new FileInputStream(new File(filepath));
    buffImg = ImageIO.read(origStream);
    origStream.close();

    // Recreate the BufferedImage to fix channel issues
    BufferedImage newBuffImg = new BufferedImage(buffImg.getWidth(), buffImg.getHeight(), BufferedImage.TYPE_INT_RGB);
    newBuffImg.createGraphics().drawImage(buffImg, 0, 0, Color.WHITE, null);
    buffImg.flush();

    ByteArrayOutputStream outStream = new ByteArrayOutputStream();
    ImageIO.write(newBuffImg, "jpg", outStream);

    ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
    return inStream;
}