我使用Groovy&Grails和thumbnailator来调整缩略图的大小,代码如下:
BufferedImage image = ImageIO.read(new FileInputStream("input.jpg"))
BufferedImage output = Thumbnails.of(image).size(400, 400).crop(Positions.CENTER).asBufferedImage()
ByteArrayOutputStream baos = new ByteArrayOutputStream()
ImageIO.write(output, "jpg", baos)
baos.flush()
OutputStream outputStream = new FileOutputStream("output.jpg")
baos.writeTo(outputStream)
baos.close() 但在某些不可重现的情况下,图像将变成这样:

我已经检查了其他线程,比如下面的链接:Pink/Reddish tint while resizing jpeg images using java thumbnailator or imgscalr
我坚持认为,完全相同的文件可以工作99%,但在某些情况下,根据定义,不能。
我的问题是:如何重现这种行为?
发布于 2015-10-28 09:33:41
尽管预计每次输入都是相同的,但肯定会有一些东西发生变化。你能做的就是原封不动地写出输入文件和output.jpg。当你遇到这个问题时,你就可以将它的输入文件与已经工作的调整大小的输入文件进行比较。
应该有一些不同。如果有,那么问题很可能出在提供输入文件的过程中。如果没有,这将是相当令人惊讶的,那么调整大小的代码就有问题。
提示:您可以使用SHAx、MD5等来确定输入文件是否不同。
确认输入文件
要确认输入文件,可以将传入数据写入单独的文件。
def inputCopy = new FileOutputStream("input-SOMETHING-UNIQUE-HERE.jpg")
def input = new WritingInputStream(
new FileInputStream("input.jpg"),
inputCopy)
BufferedImage image = ImageIO.read(input)
...
inputCopy.close()从OutputStream读取数据时,WritingInputStream将数据写入InputStream。源码如下所示:
class WritingInputStream extends FilterInputStream {
private OutputStream output
public WritingInputStream(InputStream input, OutputStream output) {
super(input)
this.output = output
}
int read() {
int data = super.read()
output.write(data)
return data
}
int read(byte[] b) {
int result = super.read(b)
output.write(b)
return result
}
int read(byte[] b, int off, int len) {
int result = super.read(b, off, len)
output.write(b, off, len)
return result
}
}写出inputCopy文件的另一种方法是使用ByteArrayOutputStream并记录其内容的SHA1,然后可以将其与输入文件的SHA1进行比较。
https://stackoverflow.com/questions/33370585
复制相似问题