![]() |
|
![]() ![]() ![]() |
|
Atij |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 13.4.2008 Репутация: нет Всего: нет |
Добрый день. Только начинаю работать с Builder C++, так что прошу сильно «по голове не стучать» за такие вопросы =)
Помогите пожалуйста сделать 2 вещи: 1 – получить число в 10-ой системе счисления, соответствующее пикселю. (не уверен, что это корректная формулировка, но надеюсь вы меня поняли ) 2 – нарисовать пиксель соответствующий заданному числу. (картинки чёрно-белые, все числа лежат в диапазоне от 0 до 255 ) Большое спасибо =) |
|||
|
||||
SVN74 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 11 Всего: 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) надеюсь я по теме ответил Это сообщение отредактировал(а) SVN74 - 29.9.2008, 00:00 |
|||
|
||||
Atij |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 13.4.2008 Репутация: нет Всего: нет |
Большое спасибо за внимание, 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 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 11 Всего: 18 |
Вставьте этот кусок кода в обработчик кнопки и попробуйте, - изображение будет переведено в черно-белое...
я думаю вам это надо? 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); } Это сообщение отредактировал(а) SVN74 - 4.10.2008, 16:24 |
|||
|
||||
Atij |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 13.4.2008 Репутация: нет Всего: нет |
SVN74, Большое спасибо =)
|
|||
|
||||
helltemper |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 24.2.2009 Репутация: нет Всего: нет |
Эт так, для общего развития: для того, чтобы перевести цветную картинку в черно-белую (тобиш брать во внимание лиш величину яркости (от 0 до 255)) нужно использовать формулу: Яркость = 0,59*Зеленый+0,3*Красный+0,11*Синий ![]() данные коэфициенты связаны с чувствительностью зрения. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |