簡體   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