1 回答
TA贡献1829条经验 获得超13个赞
该image.Image
类型是一个接口,它将图像定义为具有整数坐标的像素,可通过以下Image.At()
方法访问:
At(x, y int) color.Color
您使用的具体实现image.RGBA
允许再次使用整数坐标和方法来更改像素RGBA.Set()
:
func (p *RGBA) Set(x, y int, c color.Color)
最简单的解决方案是将浮点坐标转换为整数坐标。简单地将浮点转换为整数就是截断,因此您应该使用舍入。0.5
在转换之前添加一个简单的舍入。
最好是在“开始”坐标上执行此操作,以便循环可以使用整数值,例如:
func drawHLine(img *image.RGBA, startX, y, endX float32) {
col := color.RGBA{0x00, 0x00, 0x00, 0xff}
x1, x2 := int(startX + 0.5), int(endX + 0.5)
y1 := int(y + 0.5)
for x := x1; x <= x2; x++ {
img.Set(x, y1, col)
}
}
请注意,但是这种将浮点坐标转换为整数的“最简单”解决方案可能不是“最佳”。例如,如果您需要在坐标处绘制一条水平线x = 0.1
,则上述解决方案将在 处绘制一条线x = 0
。一种不同的解决方案可能是在 处画一条“较强”的线x = 0
,在 处画一条“较弱”的线,从而给出从远处观察时x = 1
该线实际上位于 处的效果。x = 0.1
如果线条不是水平和垂直的,这种混叠技术肯定会给出更好的结果,但需要更多的计算(因此速度更慢)。
如果您在绘图时确实需要浮动精度,您可以使用第 3 方库,例如github.com/fogleman/gg
它允许您传递float64
坐标,并且它使用抗锯齿来实现良好的结果。
例如,在图像github.com/fogleman/gg
上绘制一个矩形image.RGBA
,如下所示:
var img *image.RGBA = // create your RGBA image
ctx := gg.NewContextForRGBA(img)
// Set drawing color:
ctx.SetColor(color.RGBA{0x00, 0x00, 0x00, 0xff})
// Or simply: ctx.SetRGB(0, 0, 0)
// Draw rectangle: x, y, w, h are all float64 parameters
ctx.DrawRectangle(x, y, w, h)
- 1 回答
- 0 关注
- 134 浏览
添加回答
举报