GDI+ 保存图片

郑重提示:本代码是一个DLL供C#调用,使用CLI编写,但是原理是一样的。 

         首先获取到图片数据Buffer(不包含文件头和图片头),然后将之写入图片文件

// 这是主 DLL 文件。

#include "stdafx.h"

using namespace System;
using namespace System::Runtime::InteropServices;

namespace testSave
	{
	 public ref class Save
		 {
		 public:
		  bool	 SaveBitmapToFile(array<byte>^ BmpData,int bmpWidth,int bmpHeight,int biBitCount)
			 {
			 
			  //
			  int lineByte=(bmpWidth * biBitCount/8+3)/4*4;
			  FILE *fp1=fopen("Save.bmp","wb+");
			  if (fp1==0) {return false;};
			  BITMAPFILEHEADER file;

			  //
			  //  位图大小
			  DWORD dwBmSize = 0;
			  RGBQUAD *pColorTable;
			  file.bfType/*[0] */= 0x4D42;//bmp类型
			  //bfSize是图像文件4个组成部分之和
			  int colorTablesize=0;
			  file.bfReserved1 = 0;
			  file.bfReserved2 = 0;
			  //bfOffBits是图像文件前3个部分所需空间之和
			  file.bfOffBits=/*54+sizeof(RGBQUAD)*256*/sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 0;
			  //file.bfOffBits=54+colorTablesize;
			  //file.bfSize=bmpHeight*bmpWidth*24+file.bfOffBits;
			  //  计算位图图素数据区大小 
			  dwBmSize = 4 * ((bmpWidth * biBitCount + 31) / 32) * bmpHeight;
			  //  计算调色板大小
			  colorTablesize = 0 * sizeof(RGBQUAD);
			  int m=sizeof(BITMAPINFOHEADER);
			  file.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTablesize+dwBmSize/*+lineByte*bmpHeight*/;
			  //写文件头进文件
			  fwrite(&file, sizeof(BITMAPFILEHEADER),1, fp1);
			  //申请位图信息头结构变量,填写信息头信息
			  BITMAPINFOHEADER head1; 
			  head1.biBitCount=biBitCount;
			  head1.biClrImportant=0;
			  head1.biClrUsed=0;
			  head1.biCompression=0;
			  head1.biHeight=bmpHeight;
			  head1.biPlanes=1;
			  head1.biSize=40;
			  head1.biSizeImage=lineByte*bmpHeight;
			  head1.biWidth=bmpWidth;
			  head1.biXPelsPerMeter=0;
			  head1.biYPelsPerMeter=0;
			  //写位图信息头进内存
			  fwrite(&head1, sizeof(BITMAPINFOHEADER),1, fp1);

			  //写位图数据进文件
                          Byte *p=(Byte*)malloc(bmpHeight*lineByte);
			  Marshal::Copy(BmpData,0,(IntPtr)p,bmpHeight*lineByte);
			  fwrite(p, bmpHeight*lineByte, 1, fp1);
			  //关闭文件
			  fclose(fp1);
			 }
		 };
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值