我试图使用两个库(拇指imgscalr和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();发布于 2014-12-04 17:22:53
我经常听到这个问题(imgscalr的作者) --问题总是在于,您正在读取/写入不同的文件格式,而ALPHA通道导致您的一个彩色通道(R/G/B)被从结果文件中剔除。
例如,如果您读取的文件是ARGB (4通道),并将其写成JPG (3通道)--除非您有意自己操作图像类型并直接将旧图像呈现给新的图像,否则您将得到一个带有"ARG“通道的文件.或者更具体的说,只有红色和绿色-没有蓝色。
PNG支持alpha通道,而JPG不支持,所以请注意这一点。
解决这一问题的方法是有目的地创建合适类型的BufferedImage (RGB、ARGB等)。并使用destImage.getGraphics()调用将一个图像呈现给另一个映像,然后将其写入磁盘并重新编码。
Sun和Oracle从来没有让ImageIO库聪明到能够在写入不同的文件类型时检测到不受支持的通道,因此这种行为经常发生:(
希望这能帮上忙!
发布于 2016-11-14 08:42:59
以下代码解决了我的问题:
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
https://stackoverflow.com/questions/26115851
复制相似问题