Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

256 градаций серого?????

249
12 марта 2005 года
DissDoc
639 / / 01.10.2004
Как мне перевести цветное изображение в 256 градаций серого, если у меня есть только контекст картинки
 
Код:
HDC image_dc


????
301
12 марта 2005 года
lord Kelvin
897 / / 08.11.2004
Цитата:
Originally posted by DissDoc
Как мне перевести цветное изображение в 256 градаций серого, если у меня есть только контекст картинки
 
Код:
HDC image_dc


????


Попробуй для каждой точки брать среднее значения RGB.

 
Код:
DWORD med=(GetRValue(color)+GetGValue(color)+GetBValue(color))/3;
color=RGB(med,med,med);
249
12 марта 2005 года
DissDoc
639 / / 01.10.2004
Цитата:
Originally posted by lord Kelvin

Попробуй для каждой точки брать среднее значения RGB.
 
Код:
DWORD med=(GetRValue(color)+GetGValue(color)+GetBValue(color))/3;
color=RGB(med,med,med);



это-то я знаю... но вопрос в том, КАК мне связать [COLOR=red]HDC[/COLOR] c палитрой?

249
12 марта 2005 года
DissDoc
639 / / 01.10.2004
Цитата:
Originally posted by DissDoc


это-то я знаю... но вопрос в том, КАК мне связать [COLOR=red]HDC[/COLOR] c палитрой?



Я вот тут нашел, что можно GetPixel использовать... Но как его использовать никак не пойму

301
12 марта 2005 года
lord Kelvin
897 / / 08.11.2004
GetPixel
The GetPixel function retrieves the red, green, blue (RGB) color value of the pixel at the specified coordinates.

COLORREF GetPixel(
HDC hdc, // handle to DC
int nXPos, // x-coordinate of pixel
int nYPos // y-coordinate of pixel
);
Parameters
hdc
[in] Handle to the device context.
nXPos
[in] Specifies the x-coordinate, in logical units, of the pixel to be examined.
nYPos
[in] Specifies the y-coordinate, in logical units, of the pixel to be examined.
Return Values
The return value is the RGB value of the pixel. If the pixel is outside of the current clipping region, the return value is CLR_INVALID.

Параметры - HDC места, откуда берешь пиксель, координаты. Возвращает цвет. Вот. Все.
А зачем тебе палитра - ты используешь 256 цветов, что ли?
249
13 марта 2005 года
DissDoc
639 / / 01.10.2004
Цитата:
Originally posted by lord Kelvin



Спасибо тебе, lord Kelvin ! Это ПОЧТИ то, что я хотел...
Вот я сообразил + нашел (правда работает медленно [COLOR=firebrick]=([/COLOR] )

 
Код:
for (int x = 0; x < bmpWidth; x++)
    for (int y = 0; y < bmpHeight; y++)
        {
            DWORD color = GetPixel(bmpDC, x, y);
            DWORD gray = GetRValue(color) * 0.3 + GetGValue(color) * 0.59 + GetBValue(color)  * 0.11;
            SetPixel ( bmpDC, x, y, RGB(gray, gray, gray) );
        }
301
13 марта 2005 года
lord Kelvin
897 / / 08.11.2004
Вообще можно попробовать загрузить картинку в память, а там уже посчитать быстренько... Увы, не помню как именно.=(
249
13 марта 2005 года
DissDoc
639 / / 01.10.2004
Хм... у меня ошибка после перевода из цветного изображения в 256 градаций серого такого характера [COLOR=red]"Run-Time Check Failure #3 - The variable 'y' is being used without being defined."[/COLOR] .............
Че это значит?
249
13 марта 2005 года
DissDoc
639 / / 01.10.2004
Цитата:
Originally posted by DissDoc
Хм... у меня ошибка после перевода из цветного изображения в 256 градаций серого такого характера [COLOR=red]"Run-Time Check Failure #3 - The variable 'y' is being used without being defined."[/COLOR] .............
Че это значит?



Все! Я разобрался!!! Это из-за того что я x и y запихнул в глобальные переменные. Все работает

487
13 марта 2005 года
ddnh_bc
301 / / 16.09.2003
Цитата:
Originally posted by DissDoc
Как мне перевести цветное изображение в 256 градаций серого, если у меня есть только контекст картинки
 
Код:
HDC image_dc


????



Можно сделать так:

Код:
HDC image_dc; // Типа оно уже есть
HDC memDC;
void *dib_bits;
HBITMAP grayBMP;
HBITMAP rgbBMP;
BITMAPINFO bmInfo;
BITMAP rgbBMPinfo;
RGBQUAD grayscale[0x100];

// берем текущую битмапу в image_dc
rgbBMP=(HBITMAP)GetCurrentObject(image_dc,OBJ_BITMAP);
// получаем ее параметры
GetObject(rgbBMP,&rgbBMPinfo,sizeof(BITMAP));
// Генерируем grayscale палитру
for (int i=0;i<0x100;i++)
{
  memset(&grayscale,i,3);
}
// Создаем контекст
memDC=CreateCompatibleDC(image_dc);
memset(&bmInfo,0,sizeof(BITMAPINFO));
bmInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmInfo.bmiHeader.biWidth=rgbBMPinfo.bmWidth;
bmInfo.bmiHeader.biHeight=rgbBMPinfo.bmHeight;
bmInfo.bmiHeader.biPlanes=1;
bmInfo.bmiHeader.biBitCount=8;
bmInfo.bmiHeader.biCompression=BI_RGB;
// Создаем 8-битную диб секцию
grayBMP=CreateDIBSection(memDC,&bmInfo,DIB_PAL_COLORS,&dib_bits,NULL,0);
SelectObject(memDC,grayBMP);
// Устанавливаем grayscale палитру
SetDIBColorTable(memDC,0,0x100,grayscale);
// Рисуем в grayscale битмапу оригинальную битмапу
BitBlt(memDC,0,0,rgbBMPinfo.bmWidth,rgbBMPinfo.bmHeight,image_dc,0,0,SRCCOPY);


Вот собственно и все.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог