为什么我在 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)

}


四季花海
浏览 84回答 1
1回答

繁花不似锦

我不确定为什么 Go 有两种解码方式。如果您知道文件类型,我认为最好只使用特定的包:package mainimport (   "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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go