Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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

Цитата

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

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

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

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

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


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)