使用Golang绘制透明的PNG图片。

4

我正在尝试绘制多个透明图像以形成一个大图像,并将其保存为PNG格式。

func generateUserImage(username string, items []models.Item) error {
    imageFile, err := os.Create("public/items/users/" + username + ".png")
    if err != nil {
        return err
    }
    profileImage := image.NewRGBA(image.Rect(0, 0, 261, 336))
    for _, item := range items {
        revel.INFO.Println(item)
        itemFile, err := os.Open("public/items/universe/" + item.Type + "/" + item.Name + ".png")
        if err != nil {
            return err
        }
        itemImage, err := png.Decode(itemFile)
        if err != nil {
            return err
        }
        draw.Draw(profileImage, profileImage.Bounds(), itemImage, image.Point{0, 0}, draw.Src)
        itemFile.Close()
    }
    err = png.Encode(imageFile, profileImage)
    if err != nil {
        return err
    }
    defer imageFile.Close()
    return nil
}

除了最终的图像只包含范围循环的最后一个图像(即使范围循环5次),一切似乎都正常工作。所有图像都是带有透明背景的.png格式。这里是演示图像的样子。

enter image description here

你可以尝试保存图像并查看背景是否透明...所以我不知道为什么最终图像只包含1个图像而不是全部。谢谢。

3
使用 draw.Over 而不是 draw.Src - Paul Hankin
忘了那个。问题解决了! - Raggaer
3
顺便提一下,在你的函数中,你将关闭操作推迟到倒数第二行。在检查返回该函数的错误之后再推迟它。因此,在你的示例中,请在具有变量profileImage的行之前defer关闭操作。 - Nathan Hyland
1个回答

6
如评论中所述。
draw.Draw(profileImage, profileImage.Bounds(), itemImage, image.Point{0, 0}, draw.Over)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接