保存bmp

保存bmp
2010年10月24日
  ---------------------------------------------------------------
  在《VC技术内幕》上有个进行BMP操作的类。可以发给你。
  ---------------------------------------------------------------
  CFile cf;
  cf.Open( pszFilename,CFile::modeCreate | CFile::ModeWrite ) ;
  BITMAPFILEHEADER BFH;
  memset( &BFH, 0, sizeof( BITMAPFILEHEADER ) );
  BFH.bfType = 'MB';
  BFH.bfSize = sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER )
  +m_nPaletteEntries * sizeof( RGBQUAD )+m_dwDataSize;
  BFH.bfOffBits = sizeof( BITMAPFILEHEADER ) +
  sizeof( BITMAPINFOHEADER ) +
  m_nPaletteEntries * sizeof( RGBQUAD );
  cf.Write( &BFH, sizeof( BITMAPFILEHEADER ) );
  cf.Write( m_pBIH, sizeof( BITMAPINFOHEADER ) );
  cf.Write( m_pPalette, m_nPaletteEntries * sizeof( RGBQUAD ));
  cf.Write( m_pDibBits, m_dwDataSize );
  cf.Close();
  ---------------------------------------------------------------
  将BITMAPINFOHEADER位图信息m_pBIH变量中的宽度与高度设成你的.再写入文件.
  ---------------------------------------------------------------
  /*
  //功能如下:
  1. 8位位图仍然保存为8位位图
  2. 16位位图将被保存为24位位图.16位位图只用于16位增强显示模式, 不在不同的系统间进行传递.
  3. 24位位图仍然被保存为24位位图.
  4. 32位Ddb位图将被保存为24位位图.
  5. 对于16色即4位位图, 不作处理.
  */
  //将Ddb位图保存成Dib位图:被保存的区域由, x, y, nWidth, nHeight来定义
  int CDisplayModeView::SaveBmp(char *lpFilePath,int nWidth,int nHeight,int nType)
  {
  CDisplayModeDoc* pDoc = GetDocument();
  CDisplayModeApp *app=(CDisplayModeApp *)AfxGetApp();
  ASSERT_VALID(pDoc);
  if(m_nCountMathodm_DIB.GetBitCount() ==8)
  // dwSaveWidthBytes=((nWidth * 8 + 31) / 32) * 4;
  dwSaveWidthBytes=((nWidth * 24 + 31) / 32) * 4;
  else
  dwSaveWidthBytes=((nWidth * 24 + 31) / 32) * 4;
  //DIB位图数据大小, 以字节为单位
  DWORD dwDibBitsSize = dwSaveWidthBytes * nHeight;
  //计算整个Dib文件的大小dwFileSize
  DWORD dwFileSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwDibBitsSize;
  if(pDoc->m_DIB.GetBitCount() == 8) dwFileSize += (256 * sizeof(RGBQUAD));
  //计算位图信息到位图数据间的偏移量(字节)
  DWORD dwOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
  //if(m_nBitCount == 8)
  // if(pDoc->m_DIB.GetBitCount() ==8)
  // dwOffBits += (256 * sizeof(RGBQUAD));
  m_pBMI->bmiHeader.biBitCount=24;//位图的每个象素的为数,1位对应的颜色总数为2,4--16,8--256,24--16777216
  m_pBMI->bmiHeader.biClrImportant=0;//指定对于显示该位图比较重要的颜色索引个数,若值为0,则所有的颜色都是重要的。
  m_pBMI->bmiHeader.biClrImportant=0;//位图实际使用的颜色数
  m_pBMI->bmiHeader.biCompression=0;//压宿方式
  m_pBMI->bmiHeader.biClrUsed =0;
  m_pBMI->bmiHeader.biHeight=nHeight;
  m_pBMI->bmiHeader.biWidth=nWidth;
  m_pBMI->bmiHeader.biPlanes=1;//表示目标设备的位平面数
  m_pBMI->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
  m_pBMI->bmiHeader.biXPelsPerMeter=0;//表示目标设备的水平分辨率
  m_pBMI->bmiHeader.biYPelsPerMeter=0;//表示目标设备的垂直分辨率
  m_pBMI->bmiHeader.biSizeImage =0;//nWidth*nHeight*4;
  BITMAPFILEHEADER bmh;//位图文件头结构
  LPBITMAPINFOHEADER lpBl;//指向位图信息结构的指针
  RGBQUAD rgb[256];
  DWORD dwDibSize;
  lpBl=(LPBITMAPINFOHEADER)m_pBMI;
  if(lpBl==NULL)
  {
  delete[] m_pBMI;
  fclose(file);
  return -2;
  }
  dwDibSize=*(LPDWORD)lpBl+256*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER);
  DWORD dwBmBitsSize;//BMP文件信息结构所占的字节数
  dwBmBitsSize=nScanLine*nHeight;// lpBl->biWidth*lpBl->biHeight*4;//存储时位图所有象素所占的字节数
  dwDibSize+=dwBmBitsSize;
  lpBl->biSizeImage=dwBmBitsSize;//位图所有象素所占的字节总数
  //填充BITMAPFILEHEADER结构
  bmh.bfType=0x4d42;
  bmh.bfSize=dwFileSize;//+sizeof(BITMAPFILE
  出处:http://faq.youkuaiyun.com/read/13820.html
在C#中,有多种方法可以实现保存BMP图像的功能,以下是几种常见的实现方式: ### 保存Panel内容为BMP图像 可以将`Panel`里面的内容保存BMP图像文件,示例代码如下: ```csharp Bitmap bmp = new Bitmap(panel1.Width, panel1.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); panel1.DrawToBitmap(bmp, new Rectangle(0, 0, panel1.Width, panel1.Height)); bmp.Save("led.bmp", System.Drawing.Imaging.ImageFormat.Bmp); ``` 这段代码首先创建了一个与`Panel`大小相同的`Bitmap`对象,然后使用`DrawToBitmap`方法将`Panel`的内容绘制到`Bitmap`上,最后将`Bitmap`保存BMP格式的文件[^1]。 ### 保存旋转180度后的BMP图像 若要保存旋转180度后的BMP图像,可先读取原始图像,创建相同尺寸的新图像,通过循环遍历每个像素,将原始图像中的像素按照旋转180度的规则放置到新图像中,最后保存为新的BMP文件。示例代码虽然未给出具体实现,但实现步骤如下: ```csharp // 读取原始图像 Bitmap originalImage = new Bitmap("input.bmp"); // 创建相同尺寸的新图像 Bitmap rotatedImage = new Bitmap(originalImage.Width, originalImage.Height); // 旋转像素 for (int x = 0; x < originalImage.Width; x++) { for (int y = 0; y < originalImage.Height; y++) { Color pixelColor = originalImage.GetPixel(x, y); rotatedImage.SetPixel(originalImage.Width - 1 - x, originalImage.Height - 1 - y, pixelColor); } } // 保存旋转后的图像 rotatedImage.Save("rotated.bmp", System.Drawing.Imaging.ImageFormat.Bmp); ``` 需要将`input.bmp`替换为自己的图像文件路径[^2]。 ### 结合VisionPro实现图像保存功能 可以创建一个简单的测试程序来调用图像保存功能,示例代码如下: ```csharp public class Program { public static async Task Main(string[] args) { ImageSaver imageSaver = new ImageSaver(); ICogImage testImage = new CogImage8Grey(new Bitmap("test_image.bmp")); await imageSaver.SaveImageAsync(testImage, "TestImage", @"C:\ImagePath"); Console.WriteLine("Image save operation completed."); } } ``` 此代码通过`ImageSaver`类的`SaveImageAsync`方法将图像保存到指定路径,并输出保存完成的提示信息[^4]。 ### 指定位图压缩情况保存BMP文件 在读写BMP文件时,可以指定位图是否压缩,一般使用不压缩的情况(`biCompression`为`BI_RGB`),不过这里未给出具体保存代码,但可参考常规的`Bitmap`保存方式,示例如下: ```csharp Bitmap bmp = new Bitmap(100, 100); // 创建示例位图 bmp.Save("example.bmp", System.Drawing.Imaging.ImageFormat.Bmp); ``` 这里创建了一个100x100的`Bitmap`对象并保存BMP文件,默认是不压缩的情况(符合`BI_RGB`)[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值