为了账号安全,请及时绑定邮箱和手机立即绑定

获取所有像素值(rgba)

获取所有像素值(rgba)

Go
慕慕森 2022-01-17 10:54:13
我是围棋新手,正在努力提高我的技能。目前我正在处理图像,我需要拥有图像的所有像素的红色值。我知道我可以使用下面的代码来实现这一点,但对我来说似乎很慢(~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).PixnewPixList := 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 图像,也许转换可以工作。有任何想法吗?
查看完整描述

1 回答

?
慕桂英546537

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

}



查看完整回答
反对 回复 2022-01-17
  • 1 回答
  • 0 关注
  • 328 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信