我用golang改写了一个我最初用python编写的脚本。我试图重新创建的函数当前需要一个图像(一个彩色覆盖图)并将其粘贴到相同大小的背景(地图)上,透明度为50%。我的python脚本产生的所需输出是:
我写过的golang代码试图在golang中复制它,参考this stackoverflow thread。 在main.go中// overlayImg is type image.Image, consists of the coloured overlay overlayImg = lib.AddMap(overlayImg) // lib.SaveToRecords is a function that saves image.Image overlayImg to path specified by string download.FileName lib.SaveToRecords(overlayImg, download.FileName)在程序包myproject / lib中
func AddMap(i image.Image) image.Image{
// mapFile is the background map image
mapFile, err := os.Open("./res/map.png")
if err != nil { panic(err) }
mapImg, _, err := image.Decode(mapFile)
if err != nil { panic(err) }
mask := image.NewUniform(color.Alpha{128})
canvas := image.NewRGBA(mapImg.Bounds())
draw.Draw(canvas, canvas.Bounds(), mapImg, image.Point{0, 0}, draw.Src)
draw.DrawMask(canvas, canvas.Bounds(), i, image.Point{0, 0}, mask, image.Point{0, 0}, draw.Over)
return canvas
}
然而,由此产生的图像在彩色覆盖层的某些部分产生了一种“毛刺”。这种颜色故障可以在脚本的每次运行中可靠地重现,即使使用不同的叠加层(当然,地图始终保持相同)。
我如何摆脱'毛刺'?
我已经尝试过的事情:
draw.Drawdraw.DrawMaskdraw.Over
draw.DrawMaskdraw.Src
draw.Drawdraw.DrawMaskdraw.Src
更新 我尝试根据putu's comment分配
mask := image.NewUniform(color.Alpha16{32767})来代替mask := image.NewUniform(color.Alpha{128})。故障仍然出现。此外,这个小故障并不像我想象的那样一致,只在大约10%的时间出现。看起来毛刺显示取决于粘贴到背景的图像内容。
更新2 最初,
mapImg是* image.RGBA类型的* image.NRGBA,i和canvas类型。再次按照建议in the comments,我将mapImg转换为键入* image.RGBA以与其余部分匹配。为此,我使用了以下几行代码:
mapImg, _, err := image.Decode(mapFile)
mapImgRGBA := image.NewRGBA(mapImg.Bounds())
draw.Draw(mapImgRGBA, mapImgRGBA.Bounds(), mapImg, image.Point{0, 0}, draw.Src)
// Use mapImgRGBA in place of mapImg from here
仍然不工作: