алгоритм получения монохромного изобр.

Тема в разделе "WASM.A&O", создана пользователем Avoidik, 11 мар 2006.

  1. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    всем привет, пытаюсь получить из цветной картинки монохромное, но вот беда, получается красное, помогите найти ошибку, спасибо (hdc содержит 32-битный битмап)


    Код (Text):
    1.  
    2. void _grayscale(HDC hDC,UINT hWidth,UINT hHeight)
    3. {
    4.     DWORD   hColor;
    5.     UINT    x;
    6.     byte    hRed,hGreen,hBlue;
    7.  
    8.     while(hHeight--)
    9.     {
    10.         x=hWidth;
    11.         while(x--)
    12.         {
    13.             hColor=GetPixel(hDC,x,hHeight);
    14.  
    15.             hRed=(byte)(hColor & 0x0FF);
    16.             hGreen=(byte)((hColor >> 8) & 0x0FF);
    17.             hBlue=(byte)((hColor >> 16) & 0x0FF);
    18.  
    19.             //grayValue = 0.299*redValue + 0.587*greenValue + 0.114*blueValue
    20.            
    21.             // красное изображение, вместо монохромного
    22.             hColor=(DWORD)(0.299*hRed + 0.587*hGreen + 0.114*hBlue);
    23.             // также красное изображение, вместо монохромного
    24.             //hColor=(hRed+hGreen+hBlue)/3;
    25.            
    26.             SetPixel(hDC,x,hHeight,hColor);
    27.         }
    28.     }
    29. }
    30.  
     
  2. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    делай

    BYTE cl = (hRed+hGreen+hBlue)/3;

    hColor = RGB(cl, cl, cl);
     
  3. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев


    ес-но оно у тебя красное будет, кроме красной составляющей кто остальные заполнять будет? К тому же юзать GetPixel - не сильно долго?
     
  4. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    не сильно долго?



    masquer, как лучше тогда сделать? через dib?



    спасибо за ответы, понял в чём ошибка, всё-таки буду использовать не среднее арифметическое, а вот эту формулу: grayValue = 0.299*redValue + 0.587*greenValue + 0.114*blueValue, всё таки она более точное значение выдаёт
     
  5. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев


    да, оно и проще, имхо





    для некоторых изображений другие константы могут быть более оптимальными.