单色位图格式(节选)

it2022-05-05  128

单色位图格式

如果您在处理小块单色图像,那么您不必把它们当成资源来建立。与彩色位图对象不同,单色位的格式相对简单一些,而且几乎能全部从您要建立的图像中分离出来。例如,假定您要建立下图所示的位图:

 您能写下一系列的位(0代表黑色,1代表白色),这些位直接对应于网格。从左到右读这些位,您能给每8字节配置一个十六进制元的字节值。如果位图的宽度不是16的倍数,在字节的右边用零填充,以得到偶数个字节:

0 1 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 0 1 = 51 77 10 00 0 1 0 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 0 1 = 57 77 50 00 0 0 0 1 0 0 1 1 0 1 1 1 0 1 1 1 0 1 0 1 = 13 77 50 00 0 1 0 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 0 1 = 57 77 50 00 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 = 51 11 10 00

图素宽为20,扫描线高为5,字节宽为4。您可以用下面的叙述来设定此位图的BITMAP结构:

static BITMAP bitmap = { 0, 20, 5, 4, 1, 1 } ;

并且可以将位储存在BYTE数组中:

static BYTE bits [] = { 0x51, 0x77, 0x10, 0x00, 0x57, 0x77, 0x50, 0x00, 0x13, 0x77, 0x50, 0x00, 0x57, 0x77, 0x50, 0x00, 0x51, 0x11, 0x10, 0x00 } ;

用CreateBitmapIndirect来建立位图需要下面两条叙述:

bitmap.bmBits = (PSTR) bits ; hBitmap = CreateBitmapIndirect (&bitmap) ;

另一种方法是:

hBitmap = CreateBitmapIndirect (&bitmap) ; SetBitmapBits (hBitmap, sizeof bits, bits) ;

您也可以用一道叙述来建立位图:

hBitmap = CreateBitmap (20, 5, 1, 1, bits) ;

#include "stdafx.h"LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int APIENTRY WinMain(HINSTANCE hInstance,                     HINSTANCE hPrevInstance,                     LPSTR     lpCmdLine,                     int       nCmdShow){ static TCHAR szAppName [] = TEXT ("Bricks2") ; HWND                          hwnd; MSG                        msg ; WNDCLASS                      wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc= WndProc ; wndclass.cbClsExtra                          = 0 ; wndclass.cbWndExtra                          = 0 ; wndclass.hInstance                           = hInstance ; wndclass.hIcon                               = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor                             = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground              = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName                = NULL ; wndclass.lpszClassName               = szAppName ; if (!RegisterClass (&wndclass)) {MessageBox (NULL, TEXT ("This program requires Windows NT!"),szAppName, MB_ICONERROR) ;      return 0 ;    } hwnd = CreateWindow (szAppName, TEXT ("CreateBitmap Demo"),WS_OVERLAPPEDWINDOW,  CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, nCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0))    {TranslateMessage (&msg) ; DispatchMessage (&msg) ;  }  return msg.wParam ;}LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)

{  static BITMAP Pbitmap = {   0, 20, 5, 4, 1, 1 } ; static BYTE  bits[20][5]={  0x51, 0x77, 0x10, 0x00,  0x57, 0x77, 0x50, 0x00,  0x13, 0x77, 0x50, 0x00,  0x57, 0x77, 0x50, 0x00,  0x51, 0x11, 0x10, 0x00 } ;

// static BYTE bits [8][2]={ 0xFF,0,0x0C,0,0x0C,0,0x0C,0,0xFF,0,0xC0,0,0xC0,0,0xC0,0 } ; static HBITMAP hBitmap ; static int cxClient, cyClient, cxSource, cySource ; HDC hdc, hdcMem ; int  x, y ; PAINTSTRUCT ps ; switch (message)    {case   WM_CREATE:  Pbitmap.bmBits = bits ;  hBitmap       = CreateBitmapIndirect (&Pbitmap) ;  cxSource      = Pbitmap.bmWidth ;  cySource      = Pbitmap.bmHeight ;  return 0 ; case   WM_SIZE:  cxClient = LOWORD (lParam) ;  cyClient = HIWORD (lParam) ;  return 0 ; case   WM_PAINT:  hdc = BeginPaint (hwnd, &ps) ;  hdcMem = CreateCompatibleDC (hdc) ;  SelectObject (hdcMem, hBitmap) ;  for (y = 0 ; y < 5 ; y += cySource)  for (x = 0 ; x < 20 ; x += cxSource)  {BitBlt (hdc, x, y, 200, 50, hdcMem, 0, 0, SRCCOPY) ;}  StretchBlt (hdc, 0, 0, cxClient, cyClient,hdcMem, 0, 0, cxSource, cySource, MERGECOPY);  DeleteDC (hdcMem) ;  EndPaint (hwnd, &ps) ;  return 0 ; case   WM_DESTROY:  DeleteObject (hBitmap) ;  PostQuitMessage (0) ;  return 0 ;   } return DefWindowProc (hwnd, message, wParam, lParam) ; }

转载于:https://www.cnblogs.com/kay_leo/archive/2010/09/13/1824979.html

相关资源:单色bmp图像数据提取程序

最新回复(0)