Вы можете использовать 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
.