Преобразование изображений RGB в YUV 420P в Go
Мне интересно, как я могу выполнить преобразование из изображения RGB в YUV 420P в Go (точнее *image.RGBA
к *image.YcbCr
). Я не нашел стандартного метода вimage
пакет для этого. Поскольку я также не нашел для этого никакой библиотеки, моя единственная идея заключалась в том, чтобы сделать ее пиксель за пикселем, используяcolor.RGBToYCbCr()
, но я понял, что *image.YcbCr
не имеет Set()
метод работы непосредственно с пикселями, поэтому я немного запутался. Я был бы признателен за некоторые направления или код для этого. приветствия
1 ответ
Вы могли бы использовать image.NewYCbCr()
создать экземпляр image.YCbCr
чьи пиксели вы можете напрямую манипулировать. Тогда это просто вопрос использованияcolor.RGBToYCbCr()
для каждого пикселя изображения:
bounds := original.Bounds()
converted := image.NewYCbCr(bounds, image.YCbCrSubsampleRatio420)
for row := 0; row < bounds.Max.Y; row++ {
for col := 0; col < bounds.Max.X; col++ {
r, g, b, _ := original.At(col, row).RGBA()
y, cb, cr := color.RGBToYCbCr(uint8(r), uint8(g), uint8(b))
converted.Y[converted.YOffset(col, row)] = y
converted.Cb[converted.COffset(col, row)] = cb
converted.Cr[converted.COffset(col, row)] = cr
}
}
В приведенном выше фрагменте original
регулярный image.RGBA
а также converted
является image.YCbCr
. Смотрите, что соответствующая позицияpos
в массивах цветовых составляющих converted
вычисляется из координат пикселей в original
.