使用Java Resizer

时间:2015-10-27 14:27:08

标签: java grails thumbnails

我正在使用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。但在一些不可再现的情况下,图像将变为:

color

我检查了其他线程,例如以下链接: Pink/Reddish tint while resizing jpeg images using java thumbnailator or imgscalr

我坚持使用完全相同的文件99%的情况,但在某些情况下,定义的情况不会。

我的问题:如何重现这种行为?

1 个答案:

答案 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进行比较。