閱讀Get a pixel array from from golang image.Image 的答案,我看到有兩種像素 RGBA 檢索方法,分別是 viaimg.At()和rgba.Pix()。
哪個更好用?應該始終使用一個,還是在某些情況下應該使用一個而不是另一個,反之亦然?
uj5u.com熱心網友回復:
如果您的程式將在需要大多數(如果不是全部)像素資料的情況下進行計算,則rgba.Pix()性能明顯優于img.At(). 如果您只需要影像中單個或幾個像素的像素資料,請使用img.At()(rgba.Pix()這種情況下計算先決條件的開銷太大)。
以下是各種測驗負載的結果,每個負載的持續時間平均超過 10 個樣本。
| 方法 | 1x1 | 1000x667 | 3840x2160 | 1000x667 計算 | 1000x667 僅 5x5 訪問 |
|---|---|---|---|---|---|
img.At() |
195ns | 30.211071ms | 294.885396ms | 853.345043ms | 42.431微秒 |
rgba.Pix() |
719ns | 7.786029ms | 77.700552ms | 836.480063ms | 6.791461毫秒 |
我們可以看到微小的 1x1 影像和我們將 for 回圈限制為上限 5 的影像如何使用img.At()結果更快的執行時間。但是,對于獲取每個像素的用例,會rgba.Pix()產生更好的性能。這一改進的性能不太明顯的更多的計算,我們與每一個像素做,作為總時間的增加之間的差異img.At(),并rgba.Pix()變得很不明顯,如“看到1000x667 計算上表”。
這是使用的測驗代碼:
func main() {
resp, err := http.Get("IMAGE URL GOES HERE")
if err != nil {
panic(err)
}
defer resp.Body.Close()
img, _, err := image.Decode(resp.Body)
if err != nil {
panic(err)
}
var start time.Time
var duration time.Duration
samples := 10
var sum time.Duration
fmt.Println("Samples: ", samples)
sum = time.Duration(0)
for i := 0; i < samples; i {
start = time.Now()
usingAt(img)
duration = time.Since(start)
sum = duration
}
fmt.Println("*** At avg: ", sum/time.Duration(samples))
sum = time.Duration(0)
for i := 0; i < samples; i {
start = time.Now()
usingPix(img)
duration = time.Since(start)
sum = duration
}
fmt.Println("*** Pix avg: ", sum/time.Duration(samples))
}
func usingAt(img image.Image) {
bounds := img.Bounds()
width, height := bounds.Max.X, bounds.Max.Y
for y := 0; y < height; y {
for x := 0; x < width; x {
r, g, b, _ := img.At(x, y).RGBA()
_ = uint8(r >> 8)
_ = uint8(g >> 8)
_ = uint8(b >> 8)
}
}
}
func usingPix(img image.Image, targetColor colorful.Color) {
bounds := img.Bounds()
width, height := bounds.Max.X, bounds.Max.Y
rgba := image.NewRGBA(bounds)
draw.Draw(rgba, bounds, img, bounds.Min, draw.Src)
for y := 0; y < height; y {
for x := 0; x < width; x {
index := (y*width x) * 4
pix := rgba.Pix[index : index 4]
_ = pix[0]
_ = pix[1]
_ = pix[2]
}
}
}
1000x667只有5×5訪問取代height和width在與5,5回圈,限制訪問的像素數。
1000x667 計算實際上是通過將每個像素與目標顏色的顏色距離與go-colorful的 DE2000 計算進行比較來使用 RGB 值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/405674.html
標籤:
上一篇:去多級優先佇列
下一篇:Go中切片的濫用
