如果我们在Form中拖入一个Image控件,并设置好picture后,Alt+F12就可以看到Form的源代码中已经将图片转成了16进制字符串,如下:

object Image1: TImage
Left =
Top =
Width =
Height =
Picture.Data = {
07544269746D61703E040000424D3E0400000000000036000000280000000700
00002B000000010018000000000008040000C40E0000C40E0000000000000000
0001BBE7F4BCE8F5BDE9F6BBE7F4BDE9F6BFEBF8BEEAF7000000B0E9F2B0E9F2
B0E9F2B0E9F2B1EAF3B2EBF4B1EAF3000000ADE5F8ADE5F8ACE4F7ADE5F8ACE4
F7AAE2F5ABE3F60000009DE4F89DE4F89DE4F89DE4F89DE4F89DE4F89DE4F800
00009DE4F89DE4F89DE4F89DE4F89DE4F89DE4F89DE4F80000009BE4F89BE4F8
9BE4F89BE4F89BE4F89BE4F89BE4F80000009BE4F89BE4F89BE4F89BE4F89BE4
F89BE4F89BE4F80000009BE4F89BE4F89BE4F89BE4F89BE4F89BE4F89BE4F800
00009EE5F99EE5F99EE5F99EE5F99EE5F99EE5F99EE5F9000000A0E5F9A0E5F9
A0E5F9A0E5F9A0E5F9A0E5F9A0E5F9000000A1E4F9A1E4F9A1E4F9A1E4F9A1E4
F9A1E4F9A1E4F9000000A1E6F9A1E6F9A1E6F9A1E6F9A1E6F9A1E6F9A1E6F900
0000A2E6F9A2E6F9A2E6F9A2E6F9A2E6F9A2E6F9A2E6F9000000A2E6F9A2E6F9
A2E6F9A2E6F9A2E6F9A2E6F9A2E6F9000000A5E6FBA5E6FBA5E6FBA5E6FBA5E6
FBA5E6FBA5E6FB000000A8E7FBA8E7FBA8E7FBA8E7FBA8E7FBA8E7FBA8E7FB00
0000AAE7FBAAE7FBAAE7FBAAE7FBAAE7FBAAE7FBAAE7FB000000AAE8FAAAE8FA
AAE8FAAAE8FAAAE8FAAAE8FAAAE8FA000000ABE9F9ABE9F9ABE9F9ABE9F9ABE9
F9ABE9F9ABE9F9000000AEE9F9AEE9F9AEE9F9AEE9F9AEE9F9AEE9F9AEE9F900
0000B1E9FAB1E9FAB1E9FAB1E9FAB1E9FAB1E9FAB1E9FA000000B1E9FAB1E9FA
B1E9FAB1E9FAB1E9FAB1E9FAB1E9FA000000B4EAFBB4EAFBB4EAFBB4EAFBB4EA
FBB4EAFBB4EAFB000000B7EBFBB7EBFBB7EBFBB7EBFBB7EBFBB7EBFBB7EBFB00
0000B9ECFCB9ECFCB9ECFCB9ECFCB9ECFCB9ECFCB9ECFC000000B9ECFCB9ECFC
B9ECFCB9ECFCB9ECFCB9ECFCB9ECFC000000B9ECFCB9ECFCB9ECFCB9ECFCB9EC
FCB9ECFCB9ECFC000000C0EDFBC0EDFBC0EDFBC0EDFBC0EDFBC0EDFBC0EDFB00
0000C0EDFBC0EDFBC0EDFBC0EDFBC0EDFBC0EDFBC0EDFB000000C2EEFBC2EEFB
C2EEFBC2EEFBC2EEFBC2EEFBC2EEFB000000C3EFFCC3EFFCC3EFFCC3EFFCC3EF
FCC3EFFCC3EFFC000000C5EFFBC5EFFBC5EFFBC5EFFBC5EFFBC5EFFBC5EFFB00
0000C8F0FCC8F0FCC8F0FCC8F0FCC8F0FCC8F0FCC8F0FC000000CAF1FACAF1FA
CAF1FACAF1FACAF1FACAF1FACAF1FA000000CBF2FBCBF2FBCBF2FBCBF2FBCBF2
FBCBF2FBCBF2FB000000CEF1FBCEF1FBCEF1FBCEF1FBCEF1FBCEF1FBCEF1FB00
0000CEF1FBCEF1FBCEF1FBCEF1FBCEF1FBCEF1FBCEF1FB000000CFF2FCCFF2FC
CFF2FCCFF2FCCFF2FCCFF2FCCFF2FC000000D2F2FDD2F2FDD2F2FDD2F2FDD2F2
FDD2F2FDD2F2FD000000D2F3FCD2F3FCD2F3FCD2F3FCD2F3FCD2F3FCD2F3FC00
0000D4F3FCD4F3FCD4F3FCD4F3FCD4F3FCD4F3FCD4F3FC000000D4F3FCD4F3FC
D4F3FCD4F3FCD4F3FCD4F3FCD4F3FC000000D4F3FCD4F3FCD4F3FCD4F3FCD4F3
FCD4F3FCD4F3FC000000}
end

那么在实际的应用中如何实现把图片转16进制呢,可以参考以下转换PNG的例子,其他格式的图片转换都基本类似:

uses pngimage;

{从 png 图片到十六进制字符串}
function Png2Hex(png: TPngImage): string;
var
stream: TMemoryStream;
begin
stream := TMemoryStream.Create;
png.SaveToStream(stream);
SetLength(Result, stream.Size * );
BinToHex(stream.Memory, PChar(Result), stream.Size);
stream.Free;
end; {从十六进制字符串恢复 png 图片}
procedure Hex2Png(str: string; out png: TPngImage);
var
stream: TMemoryStream;
begin
if not Assigned(png) then png := TPngImage.Create;
stream := TMemoryStream.Create;
stream.SetSize(Length(str) div );
HexToBin(PChar(str), stream.Memory, stream.Size);
png.LoadFromStream(stream);
stream.Free;
end; {测试}
procedure TForm1.Button1Click(Sender: TObject);
var
png: TPngImage;
begin
png := TPngImage.Create;
png.LoadFromFile('c:\temp\test.png');
Memo1.Text := Png2Hex(png);
png.Free;
end; procedure TForm1.Button2Click(Sender: TObject);
var
png: TPngImage;
begin
png := TPngImage.Create;
Hex2Png(Memo1.Text, png);
Canvas.Draw(, , png);
png.Free;
end;

请注意,这点特别重要:

在个别时候,可能需要解析From源代码中生成的16进制图片,可以参考以下代码:


粘贴的时候,要去掉开头的一小段类信息:具体要看自己保存出来的图片字符串

由于我采用的pngimage控件中未找到TPngImage类,我通过修改改成一下代码

在我的代码中,我加载到TImage控件中的代码为:

{从 png 图片到十六进制字符串}
function Png2Hex(png: TPngObject): string;
var
stream: TMemoryStream;
begin
stream := TMemoryStream.Create;
png.SaveToStream(stream);
SetLength(Result, stream.Size * );
BinToHex(stream.Memory, PChar(Result), stream.Size);
stream.Free;
end; {从十六进制字符串恢复 png 图片}
procedure Hex2Png(str: string; out png: TPngObject);
var
stream: TMemoryStream;
begin
if not Assigned(png) then png := TPngObject.Create;
stream := TMemoryStream.Create;
stream.SetSize(Length(str) div );
HexToBin(PChar(str), stream.Memory, stream.Size);
png.LoadFromStream(stream);
stream.Free;
end;
procedure TForm1.Button4Click(Sender: TObject);
var
png: TPngObject;
begin
//通过Image图片获取字符串
png := TPngObject.Create;
try
png.Assign(Image1.Picture.Graphic);
Memo1.Text:=Png2Hex(png);
finally
png.Free;
end;
end; procedure TForm1.Button5Click(Sender: TObject);
var
png: TPngObject;
begin
//通过字符串显示到Image图片
png := TPngObject.Create;
try
Hex2Png(Memo1.Text,png); Image1.Picture.Graphic.Assign(png);
finally
png.Free;
end;
end;

太有用了,所以转:Delphi下16进制位图数据转位图的更多相关文章

  1. Delphi下16进制位图数据转位图

    如果我们在Form中拖入一个Image控件,并设置好picture后,Alt+F12就可以看到Form的源代码中已经将图片转成了16进制字符串,如下: ? 1 2 3 4 5 6 7 8 9 10 1 ...

  2. C# 发送16进制串口数据

    一个困扰两天的问题:需要通过串口向设备发送的数据:0A010 7e 08 00 11 00 00 7e 76 7f我先将每个16进制字符转换成10进制,再将其转换成ASCII码对应的字符. /// & ...

  3. Delphi 实现16进制转字符串及字符串(中文)转16进制

    //-----------------------------------------------//16进制字符转整数,16进制字符与字符串转换中间函数//--------------------- ...

  4. linux shell下16进制 “\uxxxx” unicode to UTF-8中文

    问题出现背景: 项目中有个通过ip获取归属地城市需求,我是直接通过新浪的ip归属查询接口来获取的.我使用的是shell脚本调用 RESULT=$(curl -s 'http://int.dpool.s ...

  5. C#下16进制和BCD码转换代码

        private static Byte[] ConvertFrom(string strTemp) { try { if (Convert.ToBoolean(strTemp.Length & ...

  6. 华为交换机Stelnet ssh/rsa验证模式下16进制公钥生成方法

    1.生成秘钥 需要在你自己电脑上生成 执行下面命令,默认生成位置是~/.ssh ssh-keygen -t rsa -b 1024 -f yourkeyname -C "备注" 参 ...

  7. 【CCS仿真】用matlab把CCS保存的32位16进制的数据转换为十进制的数

    2013-12-04 16:37:28 使用fscanf函数即可完成. 例如,CCS保存的.dat文件Copy_of_forward_i_f.dat如下: 1651 1 81008800 0 4000 ...

  8. delphi 中字符串与16进制、10进制转换函数

      //字符串转成16进制代码function strToHexStr(str:string):string;varc:char;ss:string;i:integer;beginwhile str& ...

  9. C# 进制转换 在什么情况下使用16进制,字节数组,字符串

    C# 进制转换 Admin2013年9月18日 名人名言:从工作里爱了生命,就是通彻了生命最深的秘密.——纪伯伦 1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制Con ...

随机推荐

  1. python spark

    http://blog.jobbole.com/86232/ 1. 安装lib 材料: spark : http://spark.apache.org/downloads.html hadoop :  ...

  2. Java多线程系列 面试题

    1. https://blog.csdn.net/jjj19891128/article/details/24393661  多线程经典面试题 2. https://blog.csdn.net/ll6 ...

  3. Python 3 软件开发规范

    Python 3 软件开发规范 参考链接 http://www.cnblogs.com/linhaifeng/articles/6379069.html#_label14 对每个目录,文件介绍. #= ...

  4. 总结:iview(基于vue.js的开源ui组件)学习的一些坑

    1.要改变组件的样式 找到这个组件的class名,然后覆盖样式. 举例:修改select框,显示圆角.只需给找到类名并写样 .ivu-select-selection{ border-radius:1 ...

  5. POJ 2492 并查集 A Bug's Life

    #include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> ...

  6. 各种IoC框架下实现AOP

    .Net AOP(五) 各种IoC框架下实现AOP 利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率 主要功能 日志记录,性 ...

  7. Nexus4_换电池

    1.参考帖子:http://tieba.baidu.com/p/2444904362 ([图片]直播nexus4拆机换电池,勿插_nexus4吧_百度贴吧.html) 主要的内容是: (1).(5楼) ...

  8. for循环中删除map中的元素,valgrind检测提示error:Invalid read of size 8

    #include <iostream> #include <map> using namespace std; class A { public: typedef std::m ...

  9. (转)java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明)

    java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明);部分资料参考网络资源 1. java向MySQL插入当前时间的四种方式 第一种:将java.util.Date ...

  10. poj-1379 Run Away(模拟退火算法)

    题目链接: Run Away Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 7982   Accepted: 2391 De ...