首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

怎么可以保存为图片

2012-02-13 
如何可以保存为图片?C代码:char *BitResource BitInBitmap()BITMAPFILEHEADER*pBitHeader (BITMAPFIL

如何可以保存为图片?
C代码:
char *BitResource = BitInBitmap();  
BITMAPFILEHEADER*pBitHeader = (BITMAPFILEHEADER*) BitResource;
int BitSize = pBitHeader->bfSize;  
file.open("D:\\Bit.bmp");  
file.write(BitResource, BitSize); 
file.close();

---------------------
function BitInBitmap() : pchar //这个是动态库函数
-------------------------------------------------------

var
pBitHeader : ^BITMAPFILEHEADER;
cBitInBit : pchar;
begin
cBitInBit := BitInBitmap();
pBitHeader := @(cBitInBit^); 

获取到pBitHeader以后如何存为文件?后面该怎么写.请帮忙.

[解决办法]
procedure TForm1.FormCreate(Sender: TObject);
var
fileheader:tbitmapfileheader; //位图的文件头
infoheader:tbitmapinfoheader; //位图的信息头
stream:tfilestream;//文件流对象
localbmp:tbitmap; //位图对象
linelen:integer; //每一行像素长度
clipleft,cliptop,clipwidth,clipheight,bytecount:integer;
i:integer;
//j:integer; //位图倒立显示,变量
begin
form1.Width:=screen.Width;
form1.Height:=screen.Height;
form1.Top:=0;
form1.Left:=0;
self.DoubleBuffered:=true; //建立双缓冲
cliptop:=0;
clipwidth:=image1.Width;
clipheight:=image1.Height;
//将位图加载到文件流中
stream:=tfilestream.Create('2.bmp',fmopenread or fmsharedenywrite);
localbmp:=tbitmap.Create;//创建位图实例
stream.Read(fileheader,sizeof(tbitmapfileheader));//读取文件头数据
stream.Read(infoheader,sizeof(tbitmapinfoheader));//读取信息头数据
localbmp.Width:=clipwidth;
localbmp.Height:=clipheight;
localbmp.PixelFormat:=pf24bit;//设置为24位位图
bytecount:=3;
clipleft:=0;
//j:=clipheight-1;//位图倒立显示,变量
linelen:=(bytecount*infoheader.biWidth+3) shr 2 shl 2;
for i:=cliptop to cliptop + clipheight -1 do
begin
//设置新的指针位置
stream.Position :=integer(fileheader.bfOffBits) + linelen * (infoheader.biHeight-1-i) + bytecount * clipleft;
//stream.Read(localbmp.scanline[j-i]^,clipwidth * bytecount); //位图倒立显示
//将新的数据读进文件流中
stream.Read(localbmp.scanline[i-cliptop]^,clipwidth * bytecount);//位图正常显示
end;
image1.Picture.Bitmap.Assign(localbmp);
end;

end.
c不懂,看看这段d的代码,能不能有参考作用!
[解决办法]

Delphi(Pascal) code
var   pBitHeader : ^BITMAPFILEHEADER;   cBitInBit : pchar;   bitSize : integer;   aFile:TFileStream;begin   cBitInBit := BitInBitmap();   pBitHeader := @(cBitInBit^);   bitSize := pBitHeader.bfSize   aFile:=TFileStream.Create('D:\aBmp.bmp');  aFile.Write(pBitHeader,BitSize);  //  或aFile.Write(pBitHeader^,BitSize);  //  楼主可分别试验一下这两条哪个能够成功  aFile.free;
[解决办法]
Delphi(Pascal) code
//*****************************************//函数: SaveHBmpToStream//作者: 不得闲//功能:通过Bitmap句柄保存为二进制流数据//*****************************************procedure SaveHBmpToStream(const bmpHandle: HBITMAP;Stream: TStream);var  ds: TDIBSection;  BmpFileHeader:  TBitmapFileHeader;  NumberOfColors,BitCount: Integer;  Bm: tagBITMAP;  Bytes: integer;begin  if Stream = nil then    raise Exception.Create('Stream无效');  Stream.Size := 0;  Bytes := GetObject(bmpHandle,SizeOf(ds),@ds); //获得有关DIBSECTION结构中的点阵图资讯  if Bytes = 0 then    raise Exception.Create('无效的位图文件');  Bytes := GetObject(bmpHandle,SizeOf(bm),@Bm);//获得tagBITMAP结构  if Bytes = 0 then    raise Exception.Create('无效的位图文件');  NumberOfColors := ds.dsBmih.biClrUsed;//获得调色板中实际使用的颜色数  BitCount := ds.dsBmih.biBitCount;//位图位数  if (NumberOfColors = 0) and (BitCount <= 8) then     NumberOfColors := 1 shl BitCount;  With BmpFileHeader do  begin    bfType := $4D42;  // 'BM'位图标记    bfReserved1 := 0;    bfReserved2 := 0;    bfOffBits := SizeOf(TBitmapFileHeader)       +                 SizeOf(TBitmapInfoHeader)       +                 NumberOfColors*SizeOf(TRGBQuad); //获得信息头大小    bfSize := bfOffBits + ds.dsBmih.biSizeImage; //获得文件大小  end;  Stream.Write(BmpFileHeader,sizeof(BITMAPFILEHEADER));  Stream.Write(ds.dsBmih,sizeof(TBITMAPINFOHEADER));  stream.Write(Bm.bmBits^, ds.dsBmih.biSizeImage);  Stream.Seek(0,soFromBeginning);end; 

热点排行