Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с графикой 
:(
    Опции темы
en-horror
Дата 28.12.2007, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У меня возникло несколько вопросов, по рылался на форумах но ничего толком не нашел!
1 - как преобразовать цвет пикселя в RGB
2 - В дальнешем отрегулировать яркость и контрастность!
PM MAIL   Вверх
Lazin
Дата 28.12.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(en-horror @  28.12.2007,  15:54 Найти цитируемый пост)
1 - как преобразовать цвет пикселя в RGB

0x000000FF - маска для выделения красного, 0x0000FF00  - зеленого, 0x00FF0000  - голубого
Код

TColor с = ....->Canvas->Pixels[x][y];
int red = с & 0x000000FF;
int blue = (с & 0x00FF0000) >> 16;
int green = (с & 0x0000FF00) >> 8;

Цитата(en-horror @  28.12.2007,  15:54 Найти цитируемый пост)
2 - В дальнешем отрегулировать яркость и контрастность! 

для того что-бы отрегулировать яркость, нужно прибавить к интенсивности цвета каждого канала константу
Код

red += Brightness;
red = red > 0xff ? 0xFF : red;
..... 

для изменения контрастности нужно умножить интенсивность каждого канала пиксела на число.
Цитата(en-horror @  28.12.2007,  15:54 Найти цитируемый пост)
по рылался на форумах но ничего толком не нашел!

а справкой билдера пользоваться не пробовал?
набери в строке поиска Graphics и будет тебе счастье))) в этом модуле даже ф-я есть для получения составляющих RGB


Это сообщение отредактировал(а) Lazin - 28.12.2007, 16:21
PM MAIL Skype GTalk   Вверх
artsb
Дата 28.12.2007, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Цитата(en-horror @  28.12.2007,  15:54 Найти цитируемый пост)
2 - В дальнешем отрегулировать яркость и контрастность! 

Посмотри здесь. Можно перевести RGB в HSV, изменить значение V(яркость)(если нужно ярче, то в большую сторону), перевести обратно в RGB.



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Lazin
Дата 28.12.2007, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



еще осталось добавить, что самый оптимальный способ обрабатывать изображения (по скорости) - это низкоуровневый доступ, через ф-ю ScanLine, в этом случае можно для быстрой обработки задействовать simd расширения процессора (технология mmx например).
PM MAIL Skype GTalk   Вверх
en-horror
Дата 28.12.2007, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Lazin огромное спасибо, реально выручил!

Код

typedef struct    
{
    BYTE B,
            G,
            R;
}TCol;

TCol *col;
   Image1->Picture->Bitmap->PixelFormat = pf24bit;
   for(int i=0;i<Image1->Picture->Bitmap->Height;i++)
   {
       col=(TCol*)(Image1->Picture->Bitmap->ScanLine[i]);
        for(int j=0;j<Image1->Picture->Bitmap->Width;j++)
            {
 
                col[j].R=  ...;
                col[j].G=  ...;
                col[j].B=  ...;

            }
   }


я вот так вот сделал
только так и не разобрался как яркость и контрастность регулировать!  smile 
PM MAIL   Вверх
en-horror
Дата 30.12.2007, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вобщем я сделал так

Код

TForm1 *Form1;
byte R;
byte G;
byte B;
byte C;
byte M;
byte Y;
byte K;

Graphics::TBitmap *Bitmap = new Graphics::TBitmap;

typedef struct
{
    BYTE B,
            G,
            R;
}TCol;

//-----------------------------------------------
void RGBTOCMYK(byte R,
byte G,
byte B)
{
C = 255 - R;
M = 255 - G;
Y = 255 - B;
if (C < M)
K = C;
else
K = M;
if (Y < K)
K= Y;
if (K> 0)
{
C = C - K;
M = M- K;
Y = Y- K;
}

}

//------------------------------------------------
void CMYKTORGB(byte C,
byte M,
byte Y,
byte K)
{
if ((Integer(C) + Integer(K)) < 255)
R = 255 - (C + K); else
R = 0;
if ((Integer(M) + Integer(K)) < 255)
G = 255 - (M + K); else
G = 0;
if ((Integer(Y) + Integer(K)) < 255)
B = 255 - (Y + K); else
B = 0;

}

//-------------------------------------------------
void ColorCorrectCMYK(byte C,
byte M,
byte Y,
byte K)
{
byte MinColor;
if (C < M)
MinColor= C; else
MinColor= M;
if (Y < MinColor)
MinColor = Y;
if (MinColor + K > 255)
MinColor = 255 - K;
C = C - MinColor;
M = M - MinColor;
Y = Y - MinColor;
K = K + MinColor;


}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{

}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button3Click(TObject *Sender)
{

TCol *col;

   Image1->Picture->Bitmap->PixelFormat = pf24bit;
   for(int i=0;i<Image1->Picture->Bitmap->Height;i++)
   {

       col=(TCol*)(Image1->Picture->Bitmap->ScanLine[i]);

        for(int j=0;j<Image1->Picture->Bitmap->Width;j++)

            {
                RGBTOCMYK(col[j].R,col[j].G, col[j].B);
                C = C + 2;
                M = M + 2;
                Y = Y + 2;
                ColorCorrectCMYK(C, M, Y, K);
                CMYKTORGB(C, M, Y, K);
                col[j].R= R;
                col[j].G= G;
                col[j].B= B;
               
            }
   }

                Bitmap->Assign(Image1->Picture);
                Image1->Picture->Assign(Bitmap);
}
//---------------------------------------------------------------------------



PM MAIL   Вверх
en-horror
Дата 30.12.2007, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Блин по этой схеме получаеться затемнять, но не получаеться осветлять, если я делаю вот так вот то получаеться какая то фигня
Код

RGBTOCMYK(col[j].R,col[j].G, col[j].B);    
                C = C - 2;    
                M = M - 2;    
                Y = Y - 2;    
                ColorCorrectCMYK(C, M, Y, K);    
                CMYKTORGB(C, M, Y, K);    
                col[j].R= R;    
                col[j].G= G;    
                col[j].B= B;


 =( может кто знает в чем проблем
PM MAIL   Вверх
586
Дата 30.12.2007, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Во-первых выстави выравнивание в структуре TCol равное одному байту, либо используй структуру RGBTRIPLE.
Во-вторых, проверяй выход за пределы допустимых значений цветовых компонент и не подускай переполнения, т.е. 0<=x<=255
В-третьих - глобальные переменные R,G,B,C,M,Y,K - жесть

Код
#pragma pack (push, 1)
typedef struct
{
    BYTE B, G, R;
}TCol;
#pragma pack (pop)

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   Image1->Picture->Bitmap->PixelFormat = pf24bit;
   for(int i=0;i<Image1->Picture->Bitmap->Height;i++)
   {
        unsigned char *p = (unsigned char*)Image1->Picture->Bitmap->ScanLine[i];

        for(int j=0; j<Image1->Picture->Bitmap->Width*3; ++j)
        {
            signed int t = p[j];
            t -= 20;
            if (t < 0) t = 0;
            if (t > 255) t = 255;
            p[j] = t;
        }
   }

   Bitmap->Assign(Image1->Picture);
   Image1->Picture->Assign(Bitmap);

}


Код
RGBTOCMYK(col[j].R,col[j].G, col[j].B);    
                C = C - 2;
                if(C<0) C=0;   // !!!
                M = M - 2;
                if(M<0) M=0;   // !!!
                Y = Y - 2;
                if(Y<0) Y=0;   // !!!
                ColorCorrectCMYK(C, M, Y, K);
                CMYKTORGB(C, M, Y, K);
                col[j].R= R;
                col[j].G= G;
                col[j].B= B;

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

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

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

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

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


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

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


 




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


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

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