256 градаций серого?????
Код:
HDC image_dc
????
Цитата:
Originally posted by DissDoc
Как мне перевести цветное изображение в 256 градаций серого, если у меня есть только контекст картинки
????
Как мне перевести цветное изображение в 256 градаций серого, если у меня есть только контекст картинки
Код:
HDC image_dc
????
Попробуй для каждой точки брать среднее значения RGB.
Код:
DWORD med=(GetRValue(color)+GetGValue(color)+GetBValue(color))/3;
color=RGB(med,med,med);
color=RGB(med,med,med);
Цитата:
Originally posted by lord Kelvin
Попробуй для каждой точки брать среднее значения RGB.
Попробуй для каждой точки брать среднее значения RGB.
Код:
DWORD med=(GetRValue(color)+GetGValue(color)+GetBValue(color))/3;
color=RGB(med,med,med);
color=RGB(med,med,med);
это-то я знаю... но вопрос в том, КАК мне связать [COLOR=red]HDC[/COLOR] c палитрой?
Цитата:
Originally posted by DissDoc
это-то я знаю... но вопрос в том, КАК мне связать [COLOR=red]HDC[/COLOR] c палитрой?
это-то я знаю... но вопрос в том, КАК мне связать [COLOR=red]HDC[/COLOR] c палитрой?
Я вот тут нашел, что можно 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 цветов, что ли?
Цитата:
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) );
}
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) );
}
Вообще можно попробовать загрузить картинку в память, а там уже посчитать быстренько... Увы, не помню как именно.=(
Че это значит?
Цитата:
Originally posted by DissDoc
Хм... у меня ошибка после перевода из цветного изображения в 256 градаций серого такого характера [COLOR=red]"Run-Time Check Failure #3 - The variable 'y' is being used without being defined."[/COLOR] .............
Че это значит?
Хм... у меня ошибка после перевода из цветного изображения в 256 градаций серого такого характера [COLOR=red]"Run-Time Check Failure #3 - The variable 'y' is being used without being defined."[/COLOR] .............
Че это значит?
Все! Я разобрался!!! Это из-за того что я x и y запихнул в глобальные переменные. Все работает
Цитата:
Originally posted by DissDoc
Как мне перевести цветное изображение в 256 градаций серого, если у меня есть только контекст картинки
????
Как мне перевести цветное изображение в 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);
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);
Вот собственно и все.