Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с пикселями. 
:(
    Опции темы
Atij
Дата 28.9.2008, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 13.4.2008

Репутация: нет
Всего: нет



Добрый день. Только начинаю работать с Builder C++, так что прошу сильно «по голове не стучать» за такие вопросы =)

Помогите пожалуйста сделать 2 вещи: 
1 – получить число в 10-ой системе счисления, соответствующее пикселю. (не уверен, что это корректная формулировка, но надеюсь вы меня поняли )  
2 – нарисовать пиксель соответствующий заданному числу. 
(картинки чёрно-белые, все числа лежат в диапазоне от 0 до 255 )

Большое спасибо =)

PM MAIL   Вверх
SVN74
Дата 28.9.2008, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL WWW   Вверх
Atij
Дата 3.10.2008, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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 );

Большое спасибо =)

PM MAIL   Вверх
SVN74
Дата 4.10.2008, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL WWW   Вверх
Atij
Дата 4.10.2008, 02:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 13.4.2008

Репутация: нет
Всего: нет



SVN74, Большое спасибо =)
PM MAIL   Вверх
helltemper
Дата 16.3.2009, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 24.2.2009

Репутация: нет
Всего: нет




Цитата

F = (R+G+B)/3;

Эт так, для общего развития: 

для того, чтобы перевести цветную картинку в черно-белую (тобиш брать во внимание лиш величину яркости (от 0 до 255)) нужно использовать формулу: 

Яркость = 0,59*Зеленый+0,3*Красный+0,11*Синий     smile 

данные коэфициенты связаны с чувствительностью зрения. 


PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0658 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.