//*****************************************
// 函数: 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 ;
// 函数: 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中的那个