Regions

Тема в разделе "WASM.WIN32", создана пользователем dr_dred, 1 июн 2005.

  1. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Приветствую всех.

    Часть программы должна выводить сложные регионы. Для осуществления этого решил использовать функцию ExCreateRegion (она будет в данном случае намного удобнее чем CreatePolyPolygonRgn), третьим параметром которой является указатель на структуру RGNDATA. Ее член Buffer состоит из массива структур RECT, которые содержат координаты и размеры прямоугольников, из которых и будет образовываться регион. Чтобы создать такой массив, необходимо обработать bitmap. Для этого нужно написать программу (назовем ее "RGN Creator"). Я бы с удовольствием ее написал, но практически не работал с bitmap'ами.

    Можно, конечно, обрабатывать bitmap как файл со всеми структурами (BITMAPFILEHEADER,BITMAPINFOHEADER и т.д. и т.п.), но, я думаю, было бы проще работать с картинкой, отображенной в память (это возможно?)



    Кто что подскажет?
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine


    Если формат всегда будет BMP.





    Проще будет не на много. В BMP и так всё предельно просто.





    Вы хотите из HBITMAP достать все пиксели? Ламерский способ: грузить картинку в DC и вызывать GetPixel. Продвинутый способ: использовать GetDIBits.



    Пример для цветной картинки (с ч/б ещё проще):
    Код (Text):
    1. // Возможные значения: 8,16,24 o 32
    2. #define BITCOUNT 24
    3.  
    4. // ***
    5. BITMAPINFOHEADER bih={0};
    6. BITMAP bmp;
    7. HDC hDC;
    8. unsigned char* pBmpBytes;
    9. // ***
    10.  
    11. // hBMP - это HBITMAP нашей картинки
    12. GetObject(hBMP,sizeof(BITMAP),&bmp);
    13. hDC = GetDC(0);
    14. bih.biSize = sizeof(BITMAPINFOHEADER);
    15. bih.biBitCount = BITCOUNT;
    16. bih.biCompression = BI_RGB;
    17. bih.biHeight = bmp.bmHeight;
    18. bih.biPlanes = 1;
    19. bih.biWidth = bmp.bmWidth;
    20. // Тут нужно выравнивание учесть
    21. bmp.bmWidth = (bmp.bmWidth + 3) & -4;
    22. pBmpBytes = (unsigned char*)GlobalAlloc(0,bmp.bmWidth*bmp.bmHeight*BITCOUNT/8);
    23. GetDIBits(hDC,hBMP,0,bmp.bmHeight,pBmpBytes,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
    24. // ***
    25. // Теперь pBmpBytes указывает на массив пикселей.
    26. // Картинка в массиве хранится вверх ногами.
    27. // Ширина каждой scan-line кратно выравниванию.
    28. // ***
    29. GlobalFree(pBmpBytes);
    30. ReleaseDC(0,hDC);
     
  3. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Quantum



    Не понял.





    Ан нет. Ну, проигнорируем сжатие *.bmp (по-моему для приложений это не катит).

    1) Первый ряд пекселей в картинке - последний ряд в файле.

    2) От глубины цвета тоже многое зависит (4 байта или один бит на пиксель - большая разница, не правда-ли?).





    Так и хотел :). Но это медленно.





    Не пробовал. Попробуйте объяснить.
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    dr_dred



    Если захочется хранить картинку в другом формате: GIF, JPG, PNG... Их запросто можно разжать в памяти и получить HBITMAP. Это единственный плюс чтения картинки из памяти, IMHO.





    RLE? Зачем его игнорировать, когда его так просто воплотить в код?





    Правильно. В памяти тоже самое. IMHO, это тоже никак не усложняет задачу.





    Вы хотите чтоб всегда было 4-байтное RGB? Это расточительно, но дело ваше...





    Добавил пример в предыдущий пост.
     
  5. aSL

    aSL New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2003
    Сообщения:
    43
    Адрес:
    Russia
    Помнится мне, где-то был такой компонентик для делфей аж, который по имиджу строил некую маску, а маску потом применял к окну и получалось окно точно в должной форме. ;)



    Если еще есть желание - могу попробовать поискать оный.
     
  6. pas

    pas New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2003
    Сообщения:
    330
    Адрес:
    Russia
    dr_dred

    masm32\EXAMPLE8\MOB\CWS

    Возможно то что Вам нужно?
     
  7. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    aSL

    Спасибо, но пока что не надо. Да и вообще мне Delphi не нравится.



    pas

    Там я и нашел CreatePolyPolygonRgn. Вот там-то и нужна будет подобная программа. Для создания *.rgn файла там используется RGN Generator, но приятнее подобную программу написать самому.



    Quantum



    Вовсе нет. Просто если бы Вы не сказали про GetDIBits, я начал бы обрабатывать файл как цепочку битов, байтов, слов и т.п. Т.е. для рисунков с разной глубиной цвета - своя обработка => только размер кода увеличивается.



    Ухожу разбираться в Вашем примере 6 :)