gpt4 book ai didi

java - 使用 Java Resizer 的粉色/紫色

转载 作者:行者123 更新时间:2023-11-30 07:50:45 26 4
gpt4 key购买 nike

我正在使用 Groovy&Grails 和缩略图生成器通过以下代码行调整缩略图大小:

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、操作系统、源代码)。但在一些不可重现的情况下,图像会变成这样:

color

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

我遇到了这样的情况:完全相同的文件 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进行比较.

关于java - 使用 Java Resizer 的粉色/紫色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33370585/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com