怎样将十六进制数据显示出来(100分)

  • 主题发起人 主题发起人 cslegend
  • 开始时间 开始时间
刚才又试了一下,如果label过大 导致memo所得2进制数行数不准 可通过定义TStings 解决
 
To:雪鹰
请问bmiColors: array[0..0] of TRGBQuad;怎么赋值?
我使用 MyRgb:Array [0..0] of TRGBQuad;
MyBit :TBitmapInfo
然后 MyBit.bmiColors:=MyRgb;
但是编译不能通过.
 
给你摘一段代码,这段代码也是获得指纹图像的,这里的图像是384x384的,256级灰度的,
比你要的大,不过原理是一样的,这里的pImage就是一个384x384的数组,采集仪过来的
数据被存储到这个数组中,然后就用了一个偷梁换柱的偷懒办法生成一个临时bmp文件,
当然显示bmp文件就不是什么问题了。我觉得这个办法效率低了一点,但是很巧妙,不涉及
到很复杂的结构。


procedure TForm1.Getimage(Sender:TObject;Image:TImage);
var
Temp_Memory : TMemoryStream;
BMPMemory: TMemoryStream;
pBMPHead: array[0..1078] of byte;//保存文件头
i,j:integer;
tmp: array[0..383] of byte;
pImage:array[0..383,0..383] of byte;//存储图像数据
begin

PUID_GetFingerImage(@pImage);//获得图像数据
......................................
Temp_Memory := TMemoryStream.create;
Temp_Memory.LoadFromFile('bm.bmp');//用来换头的文件,是384x384,256级灰度的
Temp_Memory.Seek(0,soFromBeginning);//定位到流的开始
Temp_Memory.Read(pBMPHead,1078);//读取文件头,1078字节,你自己可以算128x128的文件头有多大
..................................
BMPMemory:=TMemoryStream.Create;
BMPMemory.Seek(0,soFromBeginning);
BMPMemory.Write(pBMPHead, 1078);//写入文件头
BMPMemory.Write(pimage,384*384);//再写入我们读到的数据
BMPMemory.SavetoFile('tt.bmp');//马上就可以保存啦
Image.Picture.loadfromfile('tt.bmp');//显示当然没有问题

........................
Temp_Memory.free;
BMPMemory.free; //清理现场:)

end;
 
我的意思是说用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;
 
To:雪鹰,appcat
第一次做图象,很高兴的到你们的帮助,我再试下你们的方法,这个问题先结了吧,
如果解决我再开个贴子加分。
 
To:雪鹰
你这句话我不大明白://转化的时候,注意0最黑,255最白,假设总共只有3种灰度值,
则 256/3*0,256/3*1,256/3*2这样取整数
我这样写函数:
function TFrm_Main.GetPixelValue(i,j:integer):Byte;
begin
Result:=256/ByteImage[i,j]; //ByteImage是Byte型指纹数组,,值为00-255.
end;
还是:Result:=256/8*ByteImage[i,j]; //图像总共8级灰度
但是都无法编译通过。
 
既然你这样说: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定义写出来!!!
 
编译通过了,谢谢雪鹰,我再试下画图
 
TO:雪赢
图像画出来了,谢谢,我在图像版开个贴子,你过来拿分吧。
有点后悔以前上大富翁只看不答,搞的只有几百分。
 
后退
顶部