6

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

我试图了解原因,并欢迎任何建议。

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

在此处输入图像描述 在此处输入图像描述

使用缩略图器

  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();
4

2 回答 2

6

我经常收到这个问题(imgscalr 的作者)——问题几乎总是你正在读/写不同的文件格式,而 ALPHA 通道导致你的一个颜色通道(R/G/B)被剔除结果文件。

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

PNG 支持 alpha 通道,而 JPG 不支持,因此请注意这一点。

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

Sun 和 Oracle 从来没有让 ImageIO 库足够智能,无法在写入不同文件类型时检测到不受支持的通道,因此这种行为一直都在发生 :(

希望有帮助!

于 2014-12-04T17:22:53.190 回答
2

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

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

于 2016-11-14T08:42:59.493 回答