将RGBA转换为灰度Golang的程序

时间:2017-02-28 16:18:46

标签: image go colors image-manipulation

我目前正致力于编写将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很奇怪,但这就是我认识的人如何解决他们的问题。

0 个答案:

没有答案