2014-03-01 19 views
6

我使用作爲image.png的形象是:Golang PNG顏色操作將不會達到255

enter image description here

當254運行我的程序,它的工作原理和輸出是:

enter image description here

這是我的代碼。如果我改變了254至255,輸出文件變得完全空(0字節):

package main 

import "fmt" 
import "os" 
import "bufio" 
import "image/png" 
import "image" 

func main() { 
    f, _ := os.Open("image.png") 
    im, _ := png.Decode(bufio.NewReader(f)) 
    img := im.(*image.RGBA) 
    s := img.Bounds().Size() 
    w := s.X 
    h := s.Y 
    fmt.Println(w, h) 
    newPix := make([]uint8, len(img.Pix)) 
    iy := 0 
    for ; iy < h; iy++ { 
     ix := 0 
     for ; ix < w; ix++ { 
      i := img.PixOffset(ix, iy) 
      r := img.Pix[i+0] 
      g := img.Pix[i+1] 
      b := img.Pix[i+2] 
      a := img.Pix[i+3] 
      var max uint8 = 254 /*255*/ 
      newPix[i+0] = uint8(max - r) 
      newPix[i+1] = uint8(max - g) 
      newPix[i+2] = uint8(max - b) 
      newPix[i+3] = uint8(max - a) 
     } 
    } 
    newImg := image.NewRGBA(img.Bounds()) 
    newImg.Pix = newPix 
    o, _ := os.Create("out.png") 
    defer o.Close() 
    png.Encode(bufio.NewWriter(o), newImg) 
    fmt.Println("DONE") 
} 

這是爲什麼以及如何解決呢? 255仍然uint8所以它應該工作...

回答

4

我發現a discussion on the golang-nuts group哪裏這個問題之前已經上來了。

基本上,輸出太小而無法自動觸發寫入器刷新。手動沖洗作者(無論如何推薦)可以解決問題。

package main 

import "fmt" 
import "os" 
import "bufio" 
import "image/png" 
import "image" 

func main() { 
    f, _ := os.Open("image.png") 
    im, _ := png.Decode(bufio.NewReader(f)) 
    img := im.(*image.RGBA) 
    s := img.Bounds().Size() 
    w := s.X 
    h := s.Y 
    fmt.Println(w, h) 
    newPix := make([]uint8, len(img.Pix)) 
    iy := 0 
    for ; iy < h; iy++ { 
     ix := 0 
     for ; ix < w; ix++ { 
      i := img.PixOffset(ix, iy) 
      r := img.Pix[i+0] 
      g := img.Pix[i+1] 
      b := img.Pix[i+2] 
      a := img.Pix[i+3] 
      var max uint8 = 255 
      newPix[i+0] = uint8(max - r) 
      newPix[i+1] = uint8(max - g) 
      newPix[i+2] = uint8(max - b) 
      newPix[i+3] = uint8(max - a) 
     } 
    } 
    newImg := image.NewRGBA(img.Bounds()) 
    newImg.Pix = newPix 
    o, _ := os.Create("out.png") 
    defer o.Close() 
    writer := bufio.NewWriter(o) 
    png.Encode(writer, newImg) 
    writer.Flush() 
    fmt.Println("DONE") 
} 

關於忽略錯誤的正常注意事項適用。

2

我認爲這是一個錯誤,試圖改變alpha通道你的方式。你會設置每個透明部分是可見的,如果你成功,每個可見部分都是透明的,這會使圖像看起來像無稽之談。

所以嘗試更換您的newPix[i+3]行:

newPix[i+3] = a 
+0

@pauljz圖像不是空的,因爲當你使用255時沒有圖像。輸出是0字節 – Tom