我用作image.png的图片是:
使用254运行我的程序时,它可以工作,输出为:
这是我的代码。如果我将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所以它应该工作...
答案 0 :(得分: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")
}
关于忽略错误的正常警告适用。
答案 1 :(得分:2)
我认为尝试按照您的方式更改Alpha通道是错误的。如果成功,您将设置每个透明部分是可见的,每个可见部分都是透明的,这会使图像看起来像废话。
请尝试将您的newPix[i+3]
行替换为:
newPix[i+3] = a