获取所有像素值(rgba)

我是围棋新手,正在努力提高我的技能。目前我正在处理图像,我需要拥有图像的所有像素的红色值。我知道我可以使用下面的代码来实现这一点,但对我来说似乎很慢(~485 毫秒),


pixList := make([]uint8, width*height)


for y := 0; y < height; y++ {

    for x := 0; x < width; x++ {

        r, _, _, _ := img.At(x, y).RGBA()

        var rNew uint8 = uint8(float32(r)*(255.0/65535.0))

        pixList[(x*height)+y] = rNew

    }

}

有没有更快的方法来做到这一点?任何内置函数可以一次获取所有像素值?


编辑:我现在使用 Pix 来获取所有像素数据,但我的 Pix 列表仍然没有给出我正在寻找的内容。


新代码:


pixList := img.(*image.Paletted).Pix

newPixList := make([]uint8, width*height)


fmt.Println(len(pixList))//gives width*height, shouldn't it be width*height*4?

for index := 0; index < width*height; index++ {

    newPixList[index] = pixList[index*4]//this part gives index out of range error, because the pixList is length of width*height, i dunno why


}

我认为它不是我的图像,因为它是 rgba 图像,也许转换可以工作。有任何想法吗?


慕慕森
浏览 329回答 1
1回答

慕桂英546537

您不能使此模式高效,因为这需要对每个像素进行接口方法调用。为了快速访问图像数据,您可以直接访问图像数据。以image.RGBA类型为例:type RGBA struct {&nbsp; &nbsp; &nbsp; &nbsp; // Pix holds the image's pixels, in R, G, B, A order. The pixel at&nbsp; &nbsp; &nbsp; &nbsp; // (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*4].&nbsp; &nbsp; &nbsp; &nbsp; Pix []uint8&nbsp; &nbsp; &nbsp; &nbsp; // Stride is the Pix stride (in bytes) between vertically adjacent pixels.&nbsp; &nbsp; &nbsp; &nbsp; Stride int&nbsp; &nbsp; &nbsp; &nbsp; // Rect is the image's bounds.&nbsp; &nbsp; &nbsp; &nbsp; Rect Rectangle}每种图像类型的文档包括数据布局和索引公式。Pix对于这种类型,您可以使用以下方法从切片中提取所有红色像素:w, h := img.Rect.Dx(), img.Rect.Dy()pixList := make([]uint8, w*h)for i := 0; i < w*h; i++ {&nbsp; &nbsp; 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++ {&nbsp; &nbsp; for y := 0; y < h; y++ {&nbsp; &nbsp; &nbsp; &nbsp; r, _, _, _ := img.YCbCrAt(x, y).RGBA()&nbsp; &nbsp; &nbsp; &nbsp; pixList[(x*h)+y] = uint8(r >> 8)&nbsp; &nbsp; }}return pixList类似于上面的 YCbCr 图像没有“红色”像素(需要为每个单独的像素计算值),调色板图像没有像素的单独 RGBA 值,需要在图像的调色板中查找。您可以更进一步并预先确定调色板颜色的颜色模型以删除Color.RGBA()接口调用以加快速度,就像这样:palette := make([]*color.RGBA, len(img.Palette))for i, c := range img.Palette {&nbsp; &nbsp; palette[i] = c.(*color.RGBA)}pixList := make([]uint8, len(img.Pix))for i, p := range img.Pix {&nbsp; &nbsp; pixList[i] = palette[p].R}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go