繁体   English   中英

带有Java Resizer的粉红色/紫色

[英]Pink/Purple Color with Java Resizer

我正在使用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()   

使用input.jpg可以在99%的所有情况下(相同的Java,OS,源代码)工作。 但是在某些不可复制的情况下,图像将变为:

颜色

我检查了其他线程,例如以下链接: 使用Java thumbnailator或imgscalr调整jpeg图像大小时的粉红色/偏红色调

我坚持完全相同的文件可以工作99%的情况,但是在某些情况下(可以定义的情况)却不能。

我的问题:如何复制这种行为?

尽管每次输入都期望相同,但是必须有所变化。 您可以做的是不变地将输入文件和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()

InputStream读取时, WritingInputStream将数据写入到OutputStream中。 源代码如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM