2015-06-21 71 views
1

我正在編寫一個帶有一些簡單圖像操作的微服務。Go標準庫中是否存在將緩衝區編碼爲任何圖像格式的函數

當我將操縱圖像發送回用戶時,必須在通過緩衝區寫入之前將其正確編碼。

我可以很容易地檢測到格式,所以它不是一個問題。目前我使用我的格式字符串和不喜歡這樣寫道:

buffer := new(bytes.Buffer) 

switch format { //format is just a string as returned by image.Decode() 
case "jpeg": 
    err := jpeg.Encode(buffer, img, nil) //img is just an image.Image 
    if err != nil { 
     //Do some error handling 
    } 
case "png": 
    err := png.Encode(buffer, img) 
    if err != nil { 
     //Do some error handling 
    } 
//and so on... 

現在,這工作得很好,我正要出去拆分成我自己的函數,當我開始想我一定是在這裏錯過了一些東西。沒有像image.Encode(buffer, image, format)這樣的功能似乎太明顯了。

編寫它並不是很麻煩,但是如果我開始重新實現核心語言功能,我的代碼很快就會變得不必要的笨拙。

如果它只是不存在,因爲go是一個很好的整潔的語言,佔地面積小,我很酷。

+0

我認爲有一個'image.Encode ...'方法的主要問題是,它會導致一個循環包引用(我會認爲,無論如何)。最好把這樣一個小實施留給消費者,我會想到的。 –

+0

@SimonWhitehead圖像編碼和解碼包[註冊解碼函數](http://godoc.org/image#RegisterFormat)與圖像包。如果使用編碼功能完成相同的操作,則不會有循環包引用。 –

+0

@SimonWhitehead我不會期望這是推理,因爲你可以寫這樣的方式,以便沒有一個循環的導入很平凡(上面是一個蹩腳的例子的一半)。 ThunderCat的答案觸及了我的想法,因爲編碼函數每個都有不同的選項,對其他編碼選項沒有意義。 –

回答

2

標準庫不包含將圖像編碼爲任意格式的功能。

該庫沒有這種功能的一個原因是每種圖像格式都有不同的編碼選項。例如,JPEG optionsPNG options是不同的。

+1

啊,當然。 你真的很幸運,你指出了我的理由;我需要編寫的下一個功能將使用jpeg.Encode的質量參數,所以我會浪費我的努力,將其從抽象中隱藏起來。 非常感謝! –

相關問題