Algoholic.in.ua

Решения > RGB. Разложение на каналы

RGB. Разложение на каналы С++

Категория: Решения | Добавлено: 2015-11-20 | Просмотров: 784

RGB (аббревиатура английских слов Red, Green, Blue — красный, зелёный, синий) — аддитивная цветовая модель, описывающая способ синтеза цвета для цветовоспроизведения. Любой цвет, изображенный на Вашем мониторе можно представить в виде тройки (R,G,B), где каждая из компонент находится в диапазоне 0..255.


Смешение цветов в модели RGB:


Смешение цветов в модели RGB


В телевизорах и мониторах применяются три электронных пушки для красного, зелёного и синего каналов. Здесь мы рассмотрим, как разбить изображение на цветовые каналы и отобразим каждый слой.


Весь представленный ниже код написан на С++ под Visual Studio 2015 Community edition.


Функция разложения изображения на каналы


/*
Red, Green, Blue - двумерные массивы. Заполняем их значениями каналов для дальнейшего использования;
start_image - контейнер с начальным изображением (PictureBox);
red_channel, green_channel, blue_channel - контейнеры с изображениями, составленными из отдельных
каналов;
*/
void image_to_RGB(Byte **Red, Byte **Green, Byte **Blue){
    //создаем битмапы для работы с изображениями
    Bitmap^ pic = gcnew Bitmap(start_image->Image);
	Bitmap^ picR = gcnew Bitmap(pic);
	Bitmap^ picG = gcnew Bitmap(pic);
	Bitmap^ picB = gcnew Bitmap(pic);
    //чтобы изображение вписывалось в рамки PictureBox'ов, задаем PictureBoxSizeMode::Zoom
	red_channel->SizeMode = PictureBoxSizeMode::Zoom;
	green_channel->SizeMode = PictureBoxSizeMode::Zoom;
	blue_channel->SizeMode = PictureBoxSizeMode::Zoom;
    //задаем размеры массивов для каждого цвета
	Red = new Byte*[pic->Width];
	Green = new Byte*[pic->Width];
	Blue = new Byte*[pic->Width];
	for (int i = 0; i < pic->Width; i++)
	{
		Red[i] = new Byte[pic->Height];
		Green[i] = new Byte[pic->Height];
		Blue[i] = new Byte[pic->Height];
	}

	for (int i = 0; i < pic->Width; i++)
		for (int j = 0; j < pic->Height; j++)
		{
            //считываем цвет пикселя
			Color^ tempColor = pic->GetPixel(i, j);
            //разбиваем цвет на составляющие
			Red[i][j] = tempColor->R;
			Green[i][j] = tempColor->G;
			Blue[i][j] = tempColor->B;
            //записываем пиксель на соответствующий битмап
			picR->SetPixel(i, j, Color::FromArgb(Red[i][j], 0, 0));
			picG->SetPixel(i, j, Color::FromArgb(0, Green[i][j], 0));
			picB->SetPixel(i, j, Color::FromArgb(0, 0, Blue[i][j]));
		}
    //выводим изображения в PictureBox'ы
	red_channel->Image = picR;
	green_channel->Image = picG;
	blue_channel->Image = picB;
}
        

Результат:


Пример разложения на RGB


Яндекс.Метрика
Украина онлайн