Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C++ Builder > Работа с пикселями. |
Автор: Atij 28.9.2008, 11:16 |
Добрый день. Только начинаю работать с Builder C++, так что прошу сильно «по голове не стучать» за такие вопросы =) Помогите пожалуйста сделать 2 вещи: 1 – получить число в 10-ой системе счисления, соответствующее пикселю. (не уверен, что это корректная формулировка, но надеюсь вы меня поняли ) 2 – нарисовать пиксель соответствующий заданному числу. (картинки чёрно-белые, все числа лежат в диапазоне от 0 до 255 ) Большое спасибо =) |
Автор: SVN74 28.9.2008, 23:18 |
В пикселе три цвета R G B -> каждый по одному байту (0-255) где 0 = цвета нет и 255 = максимальное свечение цвета, ну и где разнобойность возможных цветов (глубина) составляет 256 * 256 * 256 = 16 777 216 количество возможных цветов (24 бит) + (255) -> Альфа канал = (32 бит). А у черно белого цвета всего 255 оттенков ( Х = 0-255) R=X; G=X; B=X; ////////////////////////////////////////////////// int R = 128; int G = 128; Так, как для всех цветов задано одно значение (цвет будет просто серый); int B = 128; HDC MyDC= GetDC(0); // Будет использоваться (как экран) рабочий стол COLORREF crColor = RGB(R,G,B); SetPixel( MyDC, // Устройство вывода int X, // Координата на экране по Х int Y, // Координата на экране по У crColor); ////////////////////////////////////////////////// ПРИМЕР: Скопирует изображение с одной части экрана в другую HDC MyDC= GetDC(0); for(int y=0;y<250;y++) { for(int x=0;x<250;x++) { SetPixel(MyDC,x,y,GetPixel(MyDC,x+300,y)); } } ///////////////////////////////////////////////// Получить также можна число назад из RGB. К примеру : R = 21; G = 126; B = 201; COLORREF crColor = RGB(R,G,B); а теперь наоборот: Rx = GetRValue(crColor); // присвоит 21 Gx = GetGValue(crColor); // присвоит 126 Bx = GetBValue(crColor); // присвоит 201 (библиотека GDI) надеюсь я по теме ответил |
Автор: Atij 3.10.2008, 19:29 |
Большое спасибо за внимание, SVN74, дурацкий общажный инет подвёл, простите что не смог отписаться. Итак: У меня есть три image на форме, OpenPictureDialog для загрузки чёрно-белового изображения в image1 . И 3 кнопки. Первая кнопка отвечает за загрузку изображения в image1. Теперь самое важно, я хочу чтобы при нажатие второй кнопки переменная “A” получала число в диапазоне от 0 до 255, это число соответствует цвету левого верхнего пикселя загруженной картинки (я понимаю, что за цвет отвечают 3 параметра R,G,B, но ведь они все равны, если мы работаем с оттенками чёрно-белового цвета, или не так? Мне необходимо одно число от 0 до 255 соответствующее цвету, его возможно получить? ). А в переменную «B» сгенерировать число от 0 до 128 и присвоить левому верхнему пикселю image2 соответствующий цвет (я так понимаю, что скажем если сгенерировалось 11, то цвет будет (11,11,11), получиться ведь чёрно-белый пиксель, правильно?). А при нажатие на третью кнопку, мы получаем среднее арифметическое между “А” и “B”, записываем в переменную «С», и выводим соответствующий полученному числу пиксель, в левый верхний угол image3. Теперь как я понимаю реализацию сего вопроса: 1 – загружаю картинку в image1 if (OpenPictureDialog1->Execute()) Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName); 2 – хочу получить число соответствует цвету левого верхнего пикселя загруженной картинки HDC MyDC = Image1->Canvas; А = GetPixel(MyDC,0,0); // Я понимаю, что это не верно, объясните пожалуйста, как правильно. 3 – Генерирую число, скажем поулчил 11. B=random(255); 4 – Пытаюсь присвоить его левому верхнему пикселю image2. HDC MyDC = Image2->Canvas; COLORREF crColor = RGB(B,B,B); SetPixel( MyDC, 0 ,0 ); 5 - мы получаем среднее арифметическое между “А” и “B”, записываем в переменную «С», и выводим соответствующий полученному числу пиксель, в левый верхний угол image3. С = (A+B)/2; HDC MyDC = Image3->Canvas; COLORREF crColor = RGB(С,С,С); SetPixel( MyDC, 0 ,0 ); Большое спасибо =) |
Автор: SVN74 4.10.2008, 00:05 |
Вставьте этот кусок кода в обработчик кнопки и попробуйте, - изображение будет переведено в черно-белое... я думаю вам это надо? HDC MyDC= GetDC(0); int R,G,B; COLORREF crColor; int F; for(int y=0;y<250;y++) for(int x=0;x<250;x++) { crColor = GetPixel(MyDC,x+300,y); R=GetRValue(crColor); G=GetGValue(crColor); B=GetBValue(crColor); F = (R+G+B)/3; SetPixel(MyDC,x,y,RGB(F,F,F)); } ................................................ а вот готовое решение для Image int R,G,B; COLORREF crColor; int F; for(int y=0;y<250;y++) // только надо (250) поменять на размер Image(а) for(int x=0;x<250;x++) { crColor = (COLORREF) Image1->Canvas->Pixels[x][y]; R=GetRValue(crColor); G=GetGValue(crColor); B=GetBValue(crColor); F = (R+G+B)/3; Image1->Canvas->Pixels[x][y] = (TColor) RGB(F,F,F); } |
Автор: Atij 4.10.2008, 02:38 |
SVN74, Большое спасибо =) |
Автор: helltemper 16.3.2009, 23:28 | ||
Эт так, для общего развития: для того, чтобы перевести цветную картинку в черно-белую (тобиш брать во внимание лиш величину яркости (от 0 до 255)) нужно использовать формулу: Яркость = 0,59*Зеленый+0,3*Красный+0,11*Синий ![]() данные коэфициенты связаны с чувствительностью зрения. |