用十六进制数据画出位图的问题,各位来看看,不够加分!(200分)

  • 主题发起人 主题发起人 fchyed
  • 开始时间 开始时间
F

fchyed

Unregistered / Unconfirmed
GUEST, unregistred user!
我所要解决的问题是将一个位图先转为十六进制数据,放在text文件里,然后把这些数据
通过串口传到另外一台机子上,在把这些十六进制数据还原(再画出来)成原来的位图。

下面有我请教的两位大侠的程序,各位看看能不能把转换的十六进制数据画出来?
一:把位图转为16进制数据:

来自:zw84611, 时间:2003-3-15 19:50:00, ID:1684610
faint,岂有此理...
可以用十六进制显示并存入txt文件,如下面的方法
但这绝对是一个愚蠢的主意。
-------------------------------------
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

const BUF_SIZE=1024;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
f:file of byte;
implementation

{$R *.DFM}

function Str2Hex(const data: array of byte; len: integer): string;
const
Hex:array[0..15] of char='0123456789ABCDEF';
var
i: Integer;
begin
setlength(result,length(data)*2);
for i := 0 to Len-1 do
begin
result[i*2+1]:=Hex[data shr 4];
result[i*2+2]:=Hex[data and $F];
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
NumRead:integer;
b:array[1..BUF_SIZE] of byte;
s: string;
begin

assignfile(f,'T0105.101');
Reset(f);
repeat
BlockRead(f,b,BUF_SIZE,NumRead);
if NumRead=0 then break;
s:=Str2Hex(b,NumRead); //将每个字节以16进制表示
Memo1.Lines.Add(s);
until (NumRead = 0);
closefile(f);

Memo1.Lines.SaveToFile('binfile.txt');

end;

end.
下面是雪鹰大侠的:

来自:雪鹰 时间:2002-4-3 9:56:00 ID:1019870

我的意思是说用pixel!给你那么多bitmapinfo信息,是告诉你自己封装很麻烦。
以下是我给的例子,你自己改改;
//图像长宽定义
Const MyImgHeight:=128;
MyImgWidth:=128;

//计算灰度颜色值
function Gray(x:Byte):ColorRef;begin
Result:=RGB(X,X,X);
end;

//获取i行,j列像素灰度值
function GetPixelValue(i,j:integer):Byte
begin
//自己实现,因为我不知道你的像素数组的定义,如果给出var...这样的定义,我就可以帮你写。
//转化的时候,注意0最黑,255最白,假设总共只有3种灰度值,则 256/3*0,256/3*1,256/3*2这样取整数。
end;

//画指纹图
Procedure DrawFingerImg;
var
i,j:integer;
begin
image1.Visible:=false; //显示的时候画图系统会不停paint,很慢,所以先invisble一下^_^;
for i:=1 to MyImgHeight do //逐行画
for j:=1 to MyImgwidth do //每行一个个像素画过去
image1.canvas.pixels[j,i]:=gray(GetPixelValue(j,i));
image1.Visible:=true;
end;

既然你这样说:ByteImage是Byte型指纹数组,,值为00-255.
也就是说你的byteimage这样定义:
Var
ByteImage:array[1.MyImgWidth,1..MyImgHeight] of Byte;
那么就这么做:
function TFrm_Main.GetPixelValue(i,j:integer):Byte;
begin
Result:=ByteImage[i,j]; //ByteImage是Byte型指纹数组,,值为00-255.
end;
如果值范围为00-08,那么就这样:
function TFrm_Main.GetPixelValue(i,j:integer):Byte;
begin
Result:=lo(round(256/8*ByteImage[i,j])); //自己调整吧,是256还是255,等细微地方自己看着办。
end;
你编译无法通过。是因为函数是Byte类型,你却给result赋extend类型,当然类型不匹配!!

如果还不行,把那个byteimage的var定义写出来!!!

大家看看雪鹰大侠的方法可不可以画出来?有个问题是:用这个方法我怎么读text的十六进制
数据??

兄第我学的时间不长,时断时续的。一时搞不明白,望各位指点迷津。分不成问题。





 
不就是二进制信息文本化吗!用Base64编码一下不就可以了
 
干吗得用16进制得Text,不能用流直接传过去吗?要不内存映射文件也行呀!
serversocket控件的socket.sendstream功能把流发出去,
客户端用clientsocket控件socket.receiveBuf接受
 
我已经决定用 base64编码了?delphi里面有这样的控件?嘛解码的?
 
直接传送就可以,为什么要多此一举?
 
我也覺得沒這個必要:)
不過一定要採用Base64編碼的話.Indy控件組中有現成的.可以直接使用,很簡單:)
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
492
import
I
后退
顶部