Преобразование изображений 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.

Другие вопросы по тегам