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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
object Image1: TImage
    Left = 536
    Top = 24
    Width = 105
    Height = 105
    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的例子,其他格式的图片转换都基本类似:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
uses pngimage;
 
{从 png 图片到十六进制字符串}
function Png2Hex(png: TPngImage): string;
var
  stream: TMemoryStream;
begin
  stream := TMemoryStream.Create;
  png.SaveToStream(stream);
  SetLength(Result, stream.Size * 2);
  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 2);
  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(0, 0, png);
  png.Free;
end;

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
BtnImg1 := TBitmap.Create;
MS1 := TMemoryStream.Create;
MSHexdata1 :=
    '424D660200000000000036000000280000000500'+
    '000023000000010018000000000030020000C40E0000C40E0000000000000000'+
    '0001CE8505CE8505CE8505CE8505CE850500CE8505CE8505CE8505CE8505CE85'+
    '0500EDAA34EDAA34EDAA34EDAA34EDAA3400EDAA35EDAA35EDAA35EDAA35EDAA'+
    '3500EDAA35EDAA35EDAA35EDAA35EDAA3500EEAB36EEAB36EEAB36EEAB36EEAB'+
    '3600EEAB36EEAB36EEAB36EEAB36EEAB3600EEAC37EEAC37EEAC37EEAC37EEAC'+
    '3700EFAC37EFAC37EFAC37EFAC37EFAC3700EFAD38EFAD38EFAD38EFAD38EFAD'+
    '3800F0AD38F0AD38F0AD38F0AD38F0AD3800F0AE39F0AE39F0AE39F0AE39F0AE'+
    '3900F0AE39F0AE39F0AE39F0AE39F0AE3900F1AF3AF1AF3AF1AF3AF1AF3AF1AF'+
    '3A00F2B03AF2B03AF2B03AF2B03AF2B03A00F2B03AF2B03AF2B03AF2B03AF2B0'+
    '3A00F3B13CF3B13CF3B13CF3B13CF3B13C00F3B13CF3B13CF3B13CF3B13CF3B1'+
    '3C00F4B23DF4B23DF4B23DF4B23DF4B23D00F5B33EF5B33EF5B33EF5B33EF5B3'+
    '3E00F5B33EF5B33EF5B33EF5B33EF5B33E00F6B43FF6B43FF6B43FF6B43FF6B4'+
    '3F00F6B43FF6B43FF6B43FF6B43FF6B43F00F7B540F7B540F7B540F7B540F7B5'+
    '4000F7B641F7B641F7B641F7B641F7B64100F8B641F8B641F8B641F8B641F8B6'+
    '4100F8B742F8B742F8B742F8B742F8B74200F9B742F9B742F9B742F9B742F9B7'+
    '4200F9B843F9B843F9B843F9B843F9B84300F9B843F9B843F9B843F9B843F9B8'+
    '4300FAB844FAB844FAB844FAB844FAB84400FAB944FAB944FAB944FAB944FAB9'+
    '4400FAB944FAB944FAB944FAB944FAB94400FBBF53FBBF53FBBF53FBBF53FBBF'+
    '5300FCCA6FFCCA6FFCCA6FFCCA6FFCCA6F00';
MS1.SetSize(Length(MSHexdata1) div 2);
HexToBin(PChar(MSHexdata1),MS1.Memory,MS1.Size);
MS1.SaveToFile('c:\1.bmp');
BtnImg1.LoadFromStream(MS1);

MSHexdata1 的值就是直接从Form源代码中粘贴出来的,需要注意的是:
粘贴的时候,要去掉开头的一小段类信息:

如本例中就已经去掉了开头的“07544269746D61703E040000”,这段信息转换成ASCII如下图:

并不是图像信息的一部分,而是delphi的标记,因此需要去掉,否则生成的图像将无法显示。

Delphi下16进制位图数据转位图的更多相关文章

  1. 太有用了,所以转:Delphi下16进制位图数据转位图

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

  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. 【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 ...

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

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

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

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

  9. QT 串口通信 数据16进制发送

    在QT中进行串口通信时,很多情况要用到发送16进制的数据.从网上找来了一段代码测试能用: static QByteArray QString2Hex(QString str) { QByteArray ...

随机推荐

  1. AWS 搭建 VPN 服务(PPTP & L2TP) 整理

    只为记录和整理在AWS上假设VPN服务器帮助过我的资料,环境使用AWS EC2 东京区域, OS为ubuntu, PPTP和L2TP各自建立一个, 从speed test上看, 下载有2mbps左右, ...

  2. 0512 Scrum 项目3.0

    SCRUM 流程的步骤2: Spring 计划 1. 确保product backlog井然有序.(参考示例图1) 2. Sprint周期,一个冲刺周期,长度定为两周,本学期还有三个冲刺周期. 3. ...

  3. Js获取后台集合List的值并操作html

    功能:将后台传到前端JSP的List中的float型数值转换为百分比显示 HTML代码: <s:iterator value="colorConfigList" status ...

  4. 如果重新设计网络,有没有可能合并IP地址跟MAC地址?

    前阵子看网络基础相关的书籍,冒过一个疑问,为什么要有MAC地址跟IP地址?两者可否合二为一?   现在的逻辑是这样子:在数据传输过程中,路由器查看这个数据包的IP地址,跟路由表中记录的“IP集合:下一 ...

  5. iOS开发网络篇—监测网络状态

    iOS开发网络篇—监测网络状态 一.说明 在网络应用中,需要对用户设备的网络状态进行实时监控,有两个目的: (1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能) (2)根据用户的网络状态进行 ...

  6. ubuntu+php5.6+redis+mysql5.5+nginx

    thinkphp : location / {                if (!-e $request_filename) {                        rewrite ^ ...

  7. 自动装配Bean

    Spring提供了几种技巧,可以减少XML的配置数量: 自动装配(autowiring):可以减少<property>(setter注入)和<constructor-arg>( ...

  8. androidd 程序默认安装位置和数据存储位置(公用和私用)

    默认安装位置: android App 安装到外置SD卡中,缓解手机内置内存的压力: <manifest xmlns:android="http://schemas.android.c ...

  9. Python开发入门与实战10-事务

    1. 事务 本章我们将通过一个例子来简要的说明“事务”,这个开发实战里经常遇到的名词.事务是如何体现在一个具体的业务和系统的实现里. 事务是通过将一组相关操作组合为一个,要么全部成功要么全部失败的单元 ...

  10. Activity之间数据传递(一)(简单传递,数据包Bundle,传递对象)

    一,简单传递(简单的字符串) 第一个activity通过putExtra()将字符串传入i protected void onCreate(Bundle savedInstanceState) { s ...