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 關注
- 190 瀏覽
添加回答
舉報