我正在使用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()
这有99%的情况(相同的Java,操作系统,源代码),使用input.jpg。但在一些不可再现的情况下,图像将变为:
我检查了其他线程,例如以下链接: Pink/Reddish tint while resizing jpeg images using java thumbnailator or imgscalr
我坚持使用完全相同的文件99%的情况,但在某些情况下,定义的情况不会。
我的问题:如何重现这种行为?
答案 0 :(得分:1)
虽然每次输入预计都是相同的,但必须改变一些东西。您可以做的是将输入文件与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()
WritingInputStream
将数据从OutputStream
读取到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进行比较。