Delphi下16进制位图数据转位图
如果我们在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进制位图数据转位图的更多相关文章
- 太有用了,所以转:Delphi下16进制位图数据转位图
如果我们在Form中拖入一个Image控件,并设置好picture后,Alt+F12就可以看到Form的源代码中已经将图片转成了16进制字符串,如下: object Image1: TImage Le ...
- C# 发送16进制串口数据
一个困扰两天的问题:需要通过串口向设备发送的数据:0A010 7e 08 00 11 00 00 7e 76 7f我先将每个16进制字符转换成10进制,再将其转换成ASCII码对应的字符. /// & ...
- Delphi 实现16进制转字符串及字符串(中文)转16进制
//-----------------------------------------------//16进制字符转整数,16进制字符与字符串转换中间函数//--------------------- ...
- linux shell下16进制 “\uxxxx” unicode to UTF-8中文
问题出现背景: 项目中有个通过ip获取归属地城市需求,我是直接通过新浪的ip归属查询接口来获取的.我使用的是shell脚本调用 RESULT=$(curl -s 'http://int.dpool.s ...
- C#下16进制和BCD码转换代码
private static Byte[] ConvertFrom(string strTemp) { try { if (Convert.ToBoolean(strTemp.Length & ...
- 【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 ...
- 华为交换机Stelnet ssh/rsa验证模式下16进制公钥生成方法
1.生成秘钥 需要在你自己电脑上生成 执行下面命令,默认生成位置是~/.ssh ssh-keygen -t rsa -b 1024 -f yourkeyname -C "备注" 参 ...
- delphi 中字符串与16进制、10进制转换函数
//字符串转成16进制代码function strToHexStr(str:string):string;varc:char;ss:string;i:integer;beginwhile str& ...
- QT 串口通信 数据16进制发送
在QT中进行串口通信时,很多情况要用到发送16进制的数据.从网上找来了一段代码测试能用: static QByteArray QString2Hex(QString str) { QByteArray ...
随机推荐
- Redis + php扩展的安装与配置(windows)
-->安装Redis服务 下载redis安装包 http://pan.baidu.com/s/1pJiVFHx 下载后解压 把解压后文件夹里面的文件(根据自己的系统位数选择32位或者64位)拷贝 ...
- oracle job create table insert into
create or replace procedure proc_tzyj is begin insert into t_trade_activity@dw3_link.regress.rdbms.d ...
- iframe 内显示的网页 只显示改网页的某一部分!
使用iframe调用指定网页的特定位置(显示目标网页某区域的我想要的内容) 有些时候我们并不需要显示iframe标签属性src指定的目标网页的所有内容,往往只需要显示某一特定区域.现有两种实现方法提供 ...
- HTML 水平线<hr/>标签
定义和用法: <hr/>标签在HTML页面中创建一条水平线. 水平分隔线(horizontal rule)可以在视觉上将文档分隔成各个部分. HTML 与 XHTML 之间的差异 在 HT ...
- Objective-C( Foundation框架 一 数组(NSMutableArray))
NSMutableArray:可变数组 NSMutableArray是NSArray的子类 创建NSMutableArray数组对象 添加数组元素: // 创建数组 NSMutableArray *a ...
- EMS问题
如果EMS启动后在运行时报出 JMS error: "Not allowed to create destination这个错误,可能就是你启动方式的问题了 进入到EMS的安装目录的bin目 ...
- android快速入门
1.安装环境(jre java 运行环境,jdk java 开发工具包) 2.android studio 一.快捷键的使用 1. To open any class in the editor q ...
- java中的传值与传引用
java函数中的传值和传引用问题一直是个比较“邪门”的问题,其实java函数中的参数都是传递值的,所不同的是对于基本数据类型传递的是参数的一份拷贝,对于类类型传递的是该类参数的引用的拷贝,当在函数体中 ...
- Sql获取第一天、最后一天
昨天面试一家公司,上机题目中要求获取每月最后一笔订单.用到了日期的选择性查询,回来在ITeye上找到了这篇文章. 原文: http://new-fighter.iteye.com/blog/17587 ...
- 转 纯CSS设置Checkbox复选框控件的样式
Checkbox复选框是一个可能每一个网站都在使用的HTML元素,但大多数人并不给它们设置样式,所以在绝大多数网站它们看起来是一样的.为什么不把你的网站中的Checkbox设置一个与众不同的样式,甚至 ...