Как получить указатель на сами байты изображения в битмапе (т.е. массив r,g,b - значений). Когда-то делал изменение этих данных, хоть убей не могу вспомнить как Пробовал через поля BITMAP->bmBits, BITMAPINFO->bmiColors, безуспешно.
Код (Text): BitmapBits = offsetBitmapFIle + sizeof.BITMAPFILEHEADER + sizeof.BITMAPINFOHEADER if(BitmapInfoHeader.BitCount < 16){BitmapBits += (CountOfColors*4)} На http://www.wotsit.org есть хорошое описание BMP, если нужно у меня есть переведённые(самопальные) структуры для FASM
Same У меня битмап не в файле, я его сам создаю, и рисую в нем рисунок попиксельно. Примерно так сделал: Код (Text): BitmapProc proc uses ebx LOCAL bi :BITMAPINFO LOCAL hBmp :DWORD LOCAL hDC :DWORD LOCAL mDC :DWORD LOCAL pBits :DWORD .data bBytes db 30000 dup(0) ;100x100x3 .code invoke CreateCompatibleDC, NULL mov mDC,eax mov bi.bmiHeader.biSize,sizeof BITMAPINFOHEADER mov bi.bmiHeader.biWidth, 100 mov bi.bmiHeader.biHeight,100 mov bi.bmiHeader.biPlanes,1 mov bi.bmiHeader.biBitCount,24 mov bi.bmiHeader.biCompression,BI_RGB invoke CreateDIBSection, mDC, addr bi, DIB_RGB_COLORS, addr pBits, NULL, NULL mov hBmp,eax invoke SelectObject, mDC, hBmp xor ecx,ecx @@: mov byte ptr[bBytes+ecx+0],cl ;b mov byte ptr[bBytes+ecx+1],cl ;g mov byte ptr[bBytes+ecx+2],cl ;r add ecx,3 cmp ecx,30000 jl @B invoke GetDC,hWnd mov hDC,eax invoke SetDIBitsToDevice, hDC, 440, 200, bi.bmiHeader.biWidth, \ bi.bmiHeader.biHeight, 0, 0, 0, bi.bmiHeader.biHeight, addr bBytes, \ addr bi, DIB_RGB_COLORS invoke DeleteDC, mDC invoke ReleaseDC, hWnd, hDC invoke DeleteObject, hBmp ret BitmapProc endp
SDragon Я тоже сначала прилепил GetDIBits в процедуру из предыдущего поста, а потом подумал, что это ни к чему, если битмап никуда не сохраняется. Полноценный битмап мне не нужен, а для вывода на экран SetDIBitsToDevice справляется и с простым массивом байт. P.S. Я наверное неправильно сформулировал вопрос Нужно было программно состряпать картинку и вывести на hDC. Первоначально подумал, что надо грузить битмап и править его биты, оказалось можно проще, непосредственно биты в hDC отправить.
Выводит набор бит, организованный в девайс индепендент битмап (DIB) в hDC. Подробности тут: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/b itmaps_8e5h.asp
Создаешь массив bBytes (возможно, динамический). Создаешь битмап, выбираешь его в HDC. Заполняешь структуру BITMAPINFOHEADER и делаешь SetDIBits: Код (Text): hBMP = CreateCompatibleBitmap(hdc, width, height); holdBMP = SelectObject(hdc, hBMP); bi.biSize = sizeof(BITMAPINFOHEADER); bi.biPlanes = 1; bi.biBitCount = 32; bi.biCompression = BI_RGB; bi.biWidth = width; bi.biHeight = height; bi.biSizeImage = bi.biWidth * bi.biHeight * 4; SetDIBits(hdc, hBMP, 0, bi.biHeight, bBytes, (BITMAPINFO*)&bi, DIB_RGB_COLORS);
cresta CreateDIBSection записывает указатель на область памяти выделенную для BITMAP'а, по адресу переданному в четвёртом параметре. Через него я записывал пиксели вполне успешно. Или я чего-то не понял в вопросе?
Black_mirror Мне этот указатель не нужен. Как впрочем, и операции CreateCompatibleDC CreateCompatibleBitmap SelectObject CreateDIBSection Есть кусок памяти, в котором определенным образом расставляю байты (в соответствии с маской). Этот кусок передаю для непосредственного вывода на hDC в SetDIBitsToDevice, вместе со структурой BITMAPINFO, в которой указаны ширина, высота, глубина цвета и т.д. Тут пример как это делаю (в аттаче). Алфавит неполный, только цифры 0-5, и еще заполнение надо проверить,а то при нечетном количестве символов выводит с наклоном. Но принцип виден. _561642571__BitmapProc.asm
Готовый пример рисования без CreateCompatibleDC CreateCompatibleBitmap SelectObject CreateDIBSection BitBlt DrawText e.t.c. 461862212__Draw.zip