关于位图(Bitmap)

本文介绍了位图(Bitmap)的概念,引用了MSDN的定义,指出位图是一种用于创建、操作(缩放、滚动、旋转和绘画)及存储图像到磁盘的图形对象。文章概述了位图类和位图操作,包括如何创建内存DC和位图对象(HBITMAP),以及如何将位图对象保存到文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MSDN定义:https://msdn.microsoft.com/en-us/library/dd183377(v=vs.85).aspx


Bitmaps

bitmap is a graphical object used to create, manipulate (scale, scroll, rotate, and paint), and store images as files on a disk. This overview describes the bitmap classes and bitmap operations.


位图的操作


1. 创建内存DC和位图对象(HBITMAP)

	bool startBitMapPage()
	{
		HBITMAP hBitmap = NULL;
		HDC hdcMem = NULL;
		hdcMem = CreateCompatibleDC(getPrimaryDC());
		UT_return_val_if_fail(hdcMem, false);

		hBitmap = CreateCompatibleBitmap(getPrimaryDC(), page_rect.top - page_rect.bottom, page_rect.left - page_rect.right);
		UT_return_val_if_fail(hBitmap, false);

		SelectObject(hdcMem, hBitmap);

		GR_Win32AllocInfo ai(hdcMem, m_pDocInfo, NULL);
		m_pGraphics = (GR_Win32Graphics *)XAP_App::getApp()->newGraphics(ai);

		return true;
	}
这样就讲内存DC和位图对象进行了绑定,接下来可以直接对hdcMem执行各种GDI操作



2. 保存位图对象到文件

转自blog: 

http://blog.youkuaiyun.com/desow/article/details/4558776

BOOL SaveBmp(HBITMAP hBitmap, CString FileName)     
  {     
  HDC   hDC;     
  //当前分辨率下每象素所占字节数     
  int   iBits;     
  //位图中每象素所占字节数     
  WORD  wBitCount;     
  //定义调色板大小,位图中像素字节大小,位图文件大小,写入文件字节数  
  DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;       
  //位图属性结构       
  BITMAP   Bitmap;         
  //位图文件头结构     
  BITMAPFILEHEADER   bmfHdr;         
  //位图信息头结构       
  BITMAPINFOHEADER   bi;         
  //指向位图信息头结构         
  LPBITMAPINFOHEADER lpbi;         
  //定义文件,分配内存句柄,调色板句柄       
  HANDLE  fh, hDib, hPal, hOldPal=NULL;       
      
  //计算位图文件每个像素所占字节数       
  hDC   = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);     
  iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);       
  DeleteDC(hDC);       
  if (iBits <= 1)wBitCount = 1;       
  else if (iBits <= 4) wBitCount = 4;       
  else if (iBits <= 8) wBitCount = 8;       
  else wBitCount = 24;       
      
  GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);     
  bi.biSize = sizeof(BITMAPINFOHEADER);     
  bi.biWidth = Bitmap.bmWidth;     
  bi.biHeight = Bitmap.bmHeight;     
  bi.biPlanes = 1;     
  bi.biBitCount = wBitCount;     
  bi.biCompression = BI_RGB;     
  bi.biSizeImage = 0;     
  bi.biXPelsPerMeter = 0;     
  bi.biYPelsPerMeter = 0;     
  bi.biClrImportant = 0;     
  bi.biClrUsed = 0;     
      
  dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;     
      
  //   为位图内容分配内存       
  hDib  = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));       
  lpbi  = (LPBITMAPINFOHEADER)GlobalLock(hDib);       
  *lpbi = bi;       
      
  //   处理调色板         
  hPal  = GetStockObject(DEFAULT_PALETTE);       
  if   (hPal)       
  {       
      hDC = ::GetDC(NULL);       
      //hDC   =   m_pDc->GetSafeHdc();     
      hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);       
      RealizePalette(hDC);       
  }     
  //   获取该调色板下新的像素值       
  GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)       
                                            +dwPaletteSize,(BITMAPINFO *)lpbi, DIB_RGB_COLORS);       
      
  //   恢复调色板         
  if (hOldPal)  
  {  
      ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);   
      RealizePalette(hDC);  
      ::ReleaseDC(NULL, hDC);  
  }      
      
  //   创建位图文件         
  fh = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,  
                                FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL);  
      
  if (fh == INVALID_HANDLE_VALUE)   
      return FALSE;  
      
  //   设置位图文件头       
  bmfHdr.bfType = 0x4D42;   //   ;BM;  
  dwDIBSize   = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;  
  bmfHdr.bfSize   = dwDIBSize;  
  bmfHdr.bfReserved1 = 0;  
  bmfHdr.bfReserved2 = 0;  
  bmfHdr.bfOffBits   = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;  
  //   写入位图文件头  
  WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);  
  //   写入位图文件其余内容  
  WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);  
  //   清除  
  GlobalUnlock(hDib);  
  GlobalFree(hDib);  
  CloseHandle(fh);  
      
  return TRUE;  
  } 





位图Bitmap)是一种用于表示图像的数据结构,也是图形图像处理的基础。它是由像素点(Pixel)组成的矩阵,每个像素点用二进制数表示其对应的颜色,通常一个像素点占用一个或多个字节的存储空间。 在Java中,可以通过java.awt.image.BufferedImage类实现位图的创建和编辑。下面是一个简单的Java代码示例,用于创建一张黑色背景、红色前景的位图,并将其保存为文件: ```java import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; public class BitmapExample { public static void main(String[] args) { int width = 256; int height = 256; BufferedImage bitmap = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics g = bitmap.getGraphics(); g.setColor(Color.BLACK); g.fillRect(0, 0, width, height); g.setColor(Color.RED); g.fillOval(64, 64, 128, 128); g.dispose(); try { ImageIO.write(bitmap, "bmp", new File("example.bmp")); } catch (Exception e) { e.printStackTrace(); } } } ``` 在上面的代码中,我们首先创建了一个宽度和高度均为256像素的位图,然后使用Graphics对象绘制了一个黑色背景和一个红色的圆形。最后,我们将位图保存为一个bmp格式的文件,以便在其他应用程序中使用。 除了BufferedImage类外,还有许多其他的Java图像处理库和工具,如ImageJ、JAI、JavaFX等,它们都提供了不同程度的位图编辑和处理功能,可以根据具体需求选择适合自己的工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值