使用java thumbnailator或imgscalr调整jpeg图像大小时的粉红色/偏红色调

时间:2014-09-30 08:10:55

标签: java thumbnails bufferedimage javax.imageio imgscalr

我正在尝试使用两个库(thumbnitor和imgscalr)转换图像(下面的url)。我的代码适用于大多数图像,除了转换后的一些图像具有粉红色/红色色调。

我想了解原因并欢迎任何建议。

注意 - 此图片的图片类型为5,即 BufferedImage.TYPE_3BYTE_BGR ,我正在使用 Java 7

enter image description here enter image description here

使用Thumbnailator

  Thumbnails.of(fromDir.listFiles())                
                    .size(thumbnailWidth, thumbnailHeight)
                    .toFiles(Rename.SUFFIX_HYPHEN_THUMBNAIL);

使用imgscalr

    BufferedImage bufferedImage = ImageIO.read(file);
    final BufferedImage jpgImage;

    LOG.debug("image type is =[{}] ", bufferedImage.getType());

     BufferedImage scaledImg = Scalr.resize(bufferedImage, Method.ULTRA_QUALITY, thumbnailWidth, thumbnailHeight, Scalr.OP_ANTIALIAS);


    File thumbnailFile = new File(fromDirPath + "/" + getFileName(file.getName()) +THUMBNAIL_KEYWORD  + ".png");

    ImageIO.write(scaledImg, getFileExtension(file.getName()), thumbnailFile);

    bufferedImage.flush();
    scaledImg.flush();

2 个答案:

答案 0 :(得分:6)

我得到了很多这个问题(imgscalr的作者) - 问题是几乎总是你正在阅读/写出不同的文件格式,而ALPHA频道正在引起你的一个颜色通道( R / G / B)将从生成的文件中剔除。

例如,如果您读入的文件是ARGB(4通道)并将其写为JPG(3通道) - 除非您有意自行操作图像类型并直接将旧图像渲染为新图像,你会得到一个带有" ARG"的文件。渠道......或更具体地说,只是红色和绿色 - 没有蓝色。

PNG支持alpha通道,而JPG则不支持,所以要注意这一点。

解决此问题的方法是有目的地创建正确类型的适当BufferedImage(RGB,ARGB等)并使用destImage.getGraphics()调用将一个图像渲染到另一个图像,然后再将其写出磁盘并重新编码。

Sun和Oracle从未使ImageIO库足够智能,以便在写入不同的文件类型时检测不支持的通道,因此这种行为始终发生:(

希望有所帮助!

答案 1 :(得分:1)

以下代码解决了我的问题:

ByteArrayOutputStream baos = new ByteArrayOutputStream();

  Thumbnails.of(new ByteArrayInputStream(imageByteArray))
    .outputFormat("jpg")
    .size(200, 200)
    .toOutputStream(outputStream);

  return baos.toByteArray();

我正在使用Thumbnailator,代码已发布在此处:https://github.com/coobird/thumbnailator/issues/23