roh*_*dev 6 java bufferedimage thumbnails javax.imageio imgscalr
我正在尝试使用两个库(thumbnitor和imgscalr)转换图像(下面的url).我的代码适用于大多数图像,除了转换后的一些图像具有粉红色/红色色调.
我想了解原因并欢迎任何建议.
注意 - 此图像的图像类型是5即BufferedImage.TYPE_3BYTE_BGR,我使用的是Java 7

Thumbnails.of(fromDir.listFiles())
.size(thumbnailWidth, thumbnailHeight)
.toFiles(Rename.SUFFIX_HYPHEN_THUMBNAIL);
Run Code Online (Sandbox Code Playgroud)
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();
Run Code Online (Sandbox Code Playgroud)
我得到了很多这个问题(imgscalr的作者) - 问题几乎总是你正在阅读/写出不同的文件格式,而ALPHA频道导致你的一个颜色通道(R/G/B)被剔除生成的文件.
例如,如果您读入的文件是ARGB(4通道)并将其写为JPG(3通道) - 除非您自己有目的地操纵图像类型并将旧图像直接呈现给新图像,您将获得带有"ARG"频道的文件......或者更具体地说,只有红色和绿色 - 没有蓝色.
PNG支持alpha通道,而JPG则不支持,所以要注意这一点.
修复此问题的方法是有目的地创建正确类型的适当BufferedImage(RGB,ARGB等),并使用该destImage.getGraphics()调用将一个图像渲染到另一个图像,然后再将其写入磁盘并重新编码.
Sun和Oracle从未使ImageIO库足够智能,以便在写入不同的文件类型时检测不支持的通道,因此这种行为始终发生:(
希望有所帮助!