为什么我在 Go 中遇到分段违规错误

Why I'm getting segmentation violation error in Go

我正在尝试导入 2 个 png 图像并将一个粘贴到另一个之上。输出将是 jpeg。

当我 运行 下面的代码时,我得到了这个错误:

image: unknown format
image: unknown format
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x20 pc=0x109d7a4]
goroutine 1 [running]:
main.main()

每当我使用“Bounds()”方法时就会出现错误。你认为是什么原因呢

代码:

func main() {
    imgFile1, err := os.Open("./pics/00/body.png")
    if err != nil {
        fmt.Println(err)
    }
    defer imgFile1.Close()
    imgFile2, err := os.Open("./pics/01/face.png")
    if err != nil {
        fmt.Println(err)
    }
    defer imgFile2.Close()
    img1, _, err := image.Decode(imgFile1)
    if err != nil {
        fmt.Println(err)
    }
    img2, _, err := image.Decode(imgFile2)
    if err != nil {
        fmt.Println(err)
    }
    //new rectangle for the second image
    sp1 := image.Point{0,0}
    sp2 := image.Point{img1.Bounds().Dx(),img1.Bounds().Dy()}
    r2 := image.Rectangle{sp1, sp2}

    //create new image
    rgba := image.NewRGBA(r2)

    //draw the two images into this new image
    draw.Draw(rgba, r2, img1, image.Point{0, 0}, draw.Src)
    draw.Draw(rgba, r2, img2, image.Point{0, 0}, draw.Src)

    //export it
    out, err := os.Create("./output.jpg")
    if err != nil {
        fmt.Println(err)
    }
    defer out.Close()

    var opt jpeg.Options
    opt.Quality = 80

    jpeg.Encode(out, rgba, &opt)
}

我不确定为什么 Go 有两种解码方式。如果你知道文件类型,我认为最好只使用特定的包:

package main

import (
   "fmt"
   "image/png"
   "net/http"
)

const ava = "http://gravatar.com/avatar/5ec9c21c8d54825b04def7a41998d18d"

func main() {
   r, err := http.Get(ava)
   if err != nil {
      panic(err)
   }
   defer r.Body.Close()
   i, err := png.Decode(r.Body)
   if err != nil {
      panic(err)
   }
   dx := i.Bounds().Dx()
   fmt.Println(dx)
}

如果您坚持使用其他方法,则需要添加一个导入(感谢mkopriva):

import (
   "image"
   _ "image/png"
)

https://godocs.io/image/png#Decode