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的十六进制
数据??
兄第我学的时间不长,时断时续的。一时搞不明白,望各位指点迷津。分不成问题。
通过串口传到另外一台机子上,在把这些十六进制数据还原(再画出来)成原来的位图。
下面有我请教的两位大侠的程序,各位看看能不能把转换的十六进制数据画出来?
一:把位图转为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的十六进制
数据??
兄第我学的时间不长,时断时续的。一时搞不明白,望各位指点迷津。分不成问题。