Приветствую всех. Часть программы должна выводить сложные регионы. Для осуществления этого решил использовать функцию ExCreateRegion (она будет в данном случае намного удобнее чем CreatePolyPolygonRgn), третьим параметром которой является указатель на структуру RGNDATA. Ее член Buffer состоит из массива структур RECT, которые содержат координаты и размеры прямоугольников, из которых и будет образовываться регион. Чтобы создать такой массив, необходимо обработать bitmap. Для этого нужно написать программу (назовем ее "RGN Creator"). Я бы с удовольствием ее написал, но практически не работал с bitmap'ами. Можно, конечно, обрабатывать bitmap как файл со всеми структурами (BITMAPFILEHEADER,BITMAPINFOHEADER и т.д. и т.п.), но, я думаю, было бы проще работать с картинкой, отображенной в память (это возможно?) Кто что подскажет?
Если формат всегда будет BMP. Проще будет не на много. В BMP и так всё предельно просто. Вы хотите из HBITMAP достать все пиксели? Ламерский способ: грузить картинку в DC и вызывать GetPixel. Продвинутый способ: использовать GetDIBits. Пример для цветной картинки (с ч/б ещё проще): Код (Text): // Возможные значения: 8,16,24 o 32 #define BITCOUNT 24 // *** BITMAPINFOHEADER bih={0}; BITMAP bmp; HDC hDC; unsigned char* pBmpBytes; // *** // hBMP - это HBITMAP нашей картинки GetObject(hBMP,sizeof(BITMAP),&bmp); hDC = GetDC(0); bih.biSize = sizeof(BITMAPINFOHEADER); bih.biBitCount = BITCOUNT; bih.biCompression = BI_RGB; bih.biHeight = bmp.bmHeight; bih.biPlanes = 1; bih.biWidth = bmp.bmWidth; // Тут нужно выравнивание учесть bmp.bmWidth = (bmp.bmWidth + 3) & -4; pBmpBytes = (unsigned char*)GlobalAlloc(0,bmp.bmWidth*bmp.bmHeight*BITCOUNT/8); GetDIBits(hDC,hBMP,0,bmp.bmHeight,pBmpBytes,(BITMAPINFO*)&bih,DIB_RGB_COLORS); // *** // Теперь pBmpBytes указывает на массив пикселей. // Картинка в массиве хранится вверх ногами. // Ширина каждой scan-line кратно выравниванию. // *** GlobalFree(pBmpBytes); ReleaseDC(0,hDC);
Quantum Не понял. Ан нет. Ну, проигнорируем сжатие *.bmp (по-моему для приложений это не катит). 1) Первый ряд пекселей в картинке - последний ряд в файле. 2) От глубины цвета тоже многое зависит (4 байта или один бит на пиксель - большая разница, не правда-ли?). Так и хотел . Но это медленно. Не пробовал. Попробуйте объяснить.
dr_dred Если захочется хранить картинку в другом формате: GIF, JPG, PNG... Их запросто можно разжать в памяти и получить HBITMAP. Это единственный плюс чтения картинки из памяти, IMHO. RLE? Зачем его игнорировать, когда его так просто воплотить в код? Правильно. В памяти тоже самое. IMHO, это тоже никак не усложняет задачу. Вы хотите чтоб всегда было 4-байтное RGB? Это расточительно, но дело ваше... Добавил пример в предыдущий пост.
Помнится мне, где-то был такой компонентик для делфей аж, который по имиджу строил некую маску, а маску потом применял к окну и получалось окно точно в должной форме. Если еще есть желание - могу попробовать поискать оный.
aSL Спасибо, но пока что не надо. Да и вообще мне Delphi не нравится. pas Там я и нашел CreatePolyPolygonRgn. Вот там-то и нужна будет подобная программа. Для создания *.rgn файла там используется RGN Generator, но приятнее подобную программу написать самому. Quantum Вовсе нет. Просто если бы Вы не сказали про GetDIBits, я начал бы обрабатывать файл как цепочку битов, байтов, слов и т.п. Т.е. для рисунков с разной глубиной цвета - своя обработка => только размер кода увеличивается. Ухожу разбираться в Вашем примере 6