看到有人在帖子中问,BMP和16进制相互转化的问题,其实在很早之前,偶就写过相关的东西,那就是关于向Ini文件中写入流数据的那篇帖子:
http://www.52delphi.com/dispbbs.asp?boardid=18&Id=32
大概没怎么在意到吧!
不过既然有人提出来,哪么我就专门实现一个相互转化的东西吧!
希望大家指教:
//***************************************** //函数: BmpToHex //作者: 不得闲 //QQ: 75492895 //email: appleak46@yahoo.com.cn //功能:通过Bitmap句柄将位图转换为16进制 //请大家尊重作者劳动成果,转载请保留作者信息,谢谢 //***************************************** function BmpToHex(BmpHandle: HBITMAP): string; var ds: TDIBSection; BmpFileHeader: TBitmapFileHeader; NumberOfColors,BitCount: Integer; Bm: tagBITMAP; Bytes: integer; begin 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; Result := PointToHex(@BmpFileHeader,SizeOf(BmpFileHeader)) + PointToHex(@ds.dsBmih,SizeOf(ds.dsBmih)) + PointToHex(bm.bmBits,ds.dsBmih.biSizeImage); end; //***************************************** //函数: BmpHexToBmp //作者: 不得闲 //QQ: 75492895 //email: appleak46@yahoo.com.cn //功能:通过BmpToHex的16进制串转化成位图数据 //请大家尊重作者劳动成果,转载请保留作者信息,谢谢 //***************************************** procedure BmpHexToBmp(const HexStr: string;bmp: TBitmap); var Stream: TMemoryStream; begin if bmp = nil then raise Exception.Create('位图不能为空'); Stream := TMemoryStream.Create; Stream.SetSize(Length(HexStr)div 2); Classes.HexToBin(Pchar(HexStr),Pchar(Integer(Stream.Memory)),Stream.Size); Stream.Seek(0,soFromBeginning); bmp.LoadFromStream(Stream); Stream.Free; end; |
请看以前的文章PointToHex
HexToBin,如果偶写的那个不行(可能需要修改一下),请换成Classes中的那个