1 回答
TA贡献1848条经验 获得超10个赞
您不能使此模式高效,因为这需要对每个像素进行接口方法调用。为了快速访问图像数据,您可以直接访问图像数据。以image.RGBA类型为例:
type RGBA struct {
// Pix holds the image's pixels, in R, G, B, A order. The pixel at
// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*4].
Pix []uint8
// Stride is the Pix stride (in bytes) between vertically adjacent pixels.
Stride int
// Rect is the image's bounds.
Rect Rectangle
}
每种图像类型的文档包括数据布局和索引公式。Pix对于这种类型,您可以使用以下方法从切片中提取所有红色像素:
w, h := img.Rect.Dx(), img.Rect.Dy()
pixList := make([]uint8, w*h)
for i := 0; i < w*h; i++ {
pixList[i] = img.Pix[i*4]
}
如果需要转换其他图像类型,可以使用现有的方法进行颜色转换,但首先要断言正确的图像类型并使用native*At方法避免接口调用。从 YCbCr 图像中提取近似红色值:
w, h := img.Rect.Dx(), img.Rect.Dy()
pixList := make([]uint8, w*h)
for x := 0; x < w; x++ {
for y := 0; y < h; y++ {
r, _, _, _ := img.YCbCrAt(x, y).RGBA()
pixList[(x*h)+y] = uint8(r >> 8)
}
}
return pixList
类似于上面的 YCbCr 图像没有“红色”像素(需要为每个单独的像素计算值),调色板图像没有像素的单独 RGBA 值,需要在图像的调色板中查找。您可以更进一步并预先确定调色板颜色的颜色模型以删除Color.RGBA()接口调用以加快速度,就像这样:
palette := make([]*color.RGBA, len(img.Palette))
for i, c := range img.Palette {
palette[i] = c.(*color.RGBA)
}
pixList := make([]uint8, len(img.Pix))
for i, p := range img.Pix {
pixList[i] = palette[p].R
}
- 1 回答
- 0 关注
- 328 浏览
添加回答
举报