关于十六进制(图片转为十六进制)恢复为图片文件问题!!

hon_yu88 2009-11-25 12:54:33
请问:十六进制(图片转为十六进制)如何恢复为图片文件!!
...全文
736 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hon_yu88 2009-12-02
  • 打赏
  • 举报
回复
谢谢大家的关注!!!!
贝隆 2009-11-28
  • 打赏
  • 举报
回复
可以使用ADO的Stream来操图片
wzwcn 2009-11-25
  • 打赏
  • 举报
回复
给你粘一个以前写测试的文件转十六进制,又还原回来的例子吧,也是用hextobin和bintohex两函数的:
procedure TForm1.Button1Click(Sender: TObject);
const BufSize=1024;
var FStrem:TFileStream;
filename:string;
Buf,Buf2:pchar;
//str:string;
ReadSize:Integer;
begin
if OpenDialog1.Execute then
begin
Memo1.Clear;
filename:=OpenDialog1.FileName;
FStrem:=TFileStream.Create(filename,fmOpenRead);
Memo1.Lines.BeginUpdate;
try
FStrem.Position:=0;
ProgressBar1.Max:=FStrem.Size;
while FStrem.Position<FStrem.Size do
begin
application.ProcessMessages;
if BufSize<=(FStrem.Size-FStrem.Position) then
ReadSize:=BufSize
else ReadSize:=FStrem.Size-FStrem.Position;
getmem(Buf,ReadSize+1);
fillchar(Buf^,ReadSize+1,0);
getmem(Buf2,ReadSize*2+1);//因为一个字节用两个十六进制表示,所以乘2
fillchar(Buf2^,ReadSize*2+1,0);
FStrem.Read(Buf^,ReadSize);
ProgressBar1.Position:=FStrem.Position;
BinToHex(Buf,Buf2,ReadSize);
if Memo1.text='' then//把结果赋给memo1,不过文件大的时候内容很多,memo1刷新很慢,程序也会变得很慢
Memo1.text:=Buf2
else Memo1.text:=Memo1.text+Buf2;
freeMem(Buf);
freeMem(Buf2);
end;
finally
FStrem.Free;
ProgressBar1.Position:=0;
Memo1.Lines.EndUpdate;
end;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
const BufSize=1024;
var FileName:string;
FStream:TFileStream;
str,SubStr:String;
strLen:integer;
Buf:Pchar;
begin
if SaveDialog1.Execute then
begin
FileName:=SaveDialog1.FileName;
str:=self.Memo1.Text;//LowerCase
FStream:=TFileStream.Create(FileName,fmCreate); // or fmOpenWrite
try
repeat
application.ProcessMessages;
if length(str)>BufSize then
strLen:=BufSize
else strLen:=Length(str);
SubStr:=copy(str,1,strLen);
delete(str,1,strLen);
GetMem(Buf,(StrLen div 2)+1);//因为两个十六进制转成一个字节,所以要除2
try
Fillchar(buf^,(StrLen div 2)+1,0);
HexToBin(pchar(SubStr),Buf,(StrLen div 2));
FStream.Write(Buf^,(StrLen div 2));
finally
FreeMem(Buf);
end;
until str='';
finally
FStream.Free;
end;
end;
end;

不过,转成十六进制后,结果比原来大多了(大了一倍),所以,如果不是特别要求,只是为了把图片转成字符串,那可以用Base64编码,Base64只会比原来大大绝三分之一.Delphi自常Base64的编码和解码的函数,请看EncdDecd单元,而且那几个函数调用十分简单
lhy 2009-11-25
  • 打赏
  • 举报
回复
没看见图
也不明白你什么意思
hon_yu88 2009-11-25
  • 打赏
  • 举报
回复
请各位高手帮帮忙
hon_yu88 2009-11-25
  • 打赏
  • 举报
回复

我想将上图十六进制转为图片
hon_yu88 2009-11-25
  • 打赏
  • 举报
回复
谢谢大家关注
hjkto 2009-11-25
  • 打赏
  • 举报
回复
记号
gyk120 2009-11-25
  • 打赏
  • 举报
回复
TFileStream读取你的hex文件,然后保存为图片文件,就是一个逆运算
starluck 2009-11-25
  • 打赏
  • 举报
回复
再用流重写回去就行了.
wzwcn 2009-11-25
  • 打赏
  • 举报
回复
自己看BinToHex和HexToBin函数

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧