我目前正致力于编写将RGBA图像转换为灰度的程序。我知道有更简单的方法可以做到这一点,但我试图这样做,这种方法更适合我将来做的工作。
我尝试使用两个for循环逐个遍历每个像素。然后将像素的RGBA值转换为灰色,然后保存新图像。
以下是我的代码:
package main
import (
"image/color"
"image/jpeg"
"log"
"os"
)
type ImageSet interface {
Set(x, y int, c color.Color)
}
func main() {
file, err := os.Open("biden.jpg")
if err != nil {
log.Fatal(err)
}
defer file.Close()
img, err := jpeg.Decode(file)
if err != nil {
log.Fatal(os.Stderr, "%s: %v\n", "biden.jpg", err)
}
b := img.Bounds()
imgSet = img.(ImageSet)
for y := b.Min.Y; y < b.Max.Y; y++ {
for x := b.Min.X; x < b.Max.X; x++ {
oldPixel := img.At(x, y)
r, g, b, a := oldPixel.RGBA()
//fmt.Println(r, g, b, a)
r = (r+g+b)/3
// g = (r+g+b)/3
//b = (r+g+b)/3
pixel := color.RGBA{uint8(r), uint8(r), uint8(r), uint8(a)}
imgSet.Set(x, y, pixel)
}
}
fd, err := os.Create("gray.jpg")
if err != nil {
log.Fatal(err)
}
err = jpeg.Encode(fd, img)
if err != nil {
log.Fatal(err)
}
err = fd.Close()
if err != nil {
log.Fatal(err)
}
}
尝试运行此代码时出现以下错误。
# command-line-arguments
.\rgbtogray.go:28: undefined: imgSet
.\rgbtogray.go:38: undefined: imgSet in imgSet.Set
.\rgbtogray.go:47: not enough arguments in call to jpeg.Encode
have (*os.File, image.Image)
want (io.Writer, image.Image, *jpeg.Options)
[Finished in 4.002s]
任何人都可以看到这些错误的来源以及代码无效的原因吗?
编辑:
做了一些改变 -
package main
import (
"image/color"
"image/jpeg"
"image/png"
"log"
"os"
)
type ImageSet interface {
Set(x, y int, c color.Color)
}
func main() {
file, err := os.Open("biden.jpg")
if err != nil {
log.Fatal(err)
}
defer file.Close()
img, err := jpeg.Decode(file)
if err != nil {
log.Fatal(os.Stderr, "%s: %v\n", "biden.jpg", err)
}
b := img.Bounds()
imgSet := img.(ImageSet)
for y := b.Min.Y; y < b.Max.Y; y++ {
for x := b.Min.X; x < b.Max.X; x++ {
oldPixel := img.At(x, y)
r, g, b, a := oldPixel.RGBA()
//fmt.Println(r, g, b, a)
g = (r+g+b)/3
pixel := color.RGBA{uint8(g), uint8(g), uint8(g), uint8(a)}
imgSet.Set(x, y, pixel)
}
}
fd, err := os.Create("gray.jpg")
defer fd.Close()
png.Encode(fd, img)
}
我现在得到的错误是 -
panic: interface conversion: *image.YCbCr is not main.ImageSet: missing method Set
我知道在底部使用png.Encode很奇怪,但这就是我认识的人如何解决他们的问题。