Преобразование изображения RGB в YUV 420P в Go - PullRequest
0 голосов
/ 11 апреля 2020

Мне интересно, как я могу выполнить преобразование из изображения RGB в YUV 420P в Go (точнее *image.RGBA в *image.YcbCr). Я не нашел ни одного стандартного метода в пакете image для этого. Поскольку я также не нашел никакой библиотеки для этого, моей единственной идеей было сделать ее попиксельной, используя color.RGBToYCbCr(), но я понял, что *image.YcbCr не имеет Set() метода для работы непосредственно с пикселями, поэтому я ' Я немного смущен. Я был бы благодарен за некоторые указания или код для этого. Привет

1 Ответ

1 голос
/ 12 апреля 2020

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

...