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

  • 主题发起人 主题发起人 cslegend
  • 开始时间 开始时间
C

cslegend

Unregistered / Unconfirmed
GUEST, unregistred user!
我通过串口从单片机上读取了大小为4000H的十六进制指纹数据,
由于我是第一次做图像不知道怎么下手。现在要将它显示为一副图像,
我打算用Panel将它显示出来(Image也可以)。好象是使用StretchDIBits函数
但是不知道它的两个参数
CONST VOID *lpBits, // address of bitmap bits
CONST BITMAPINFO *lpBitsInfo, // address of bitmap data
怎么会事情,希望哪位大侠帮忙。
不用这种方法用其他的也可以。
 
分少可以加,我可以另开一个贴子.
 
我以前只是读Image的2进制数,再转成16进制用~
能不能逆向,16进制----> 2进制 再画Image呢? (纯属个人意见) [:D]
 
To:bowl
是怎么画了?好象是首先将数据转换为.Bmp文件,我现在不知道怎么转换。
 
因为没试过,所以我也不能乱讲~
得看看关于image和canvas的资料了,一起研究吧
 
To:bowl
看帮助好象使用StretchDIBits函数,开始要定义一个HDC:Panel.Handle用来显示图象,
但是关于位图结构参数:CONST BITMAPINFO *lpBitsInfo 我不知道怎么搞。
 
用image的canvas画
 
To:yt_wyb
怎么画?能给段代码吗?
 
没人回答吗?
 
卷版主去那了?
 
Image1.Canvas.TextOut(0,0,'读取的字符串');
Image1.Picture.Graphic.SaveToFile('c:/a.bmp');
 
读到的数据放到流里
Image1.LoadFromStream(TmpStream);
 
用循环 把2进制数画在image.canvas的(x,y)
判断2进制数的每行 为1画黑点 为0画白点行吗? 可能图象会有问题 我试试
 
To::bubble,LGXing,bowl
我试下你的方法。

 
To::bubble
我要做的是将数据显示为图像,不是将这些数据显示出来。你误解我的意思了。
 
什么叫做显示为图像??
Image1.Picture.Graphic.SaveToFile('c:/a.bmp');
这样不是可以存成bmp格式的图像么??
然后用Image2.picture.loadformfile读出来就是了。
特殊效果可以自己处理。Image能处理的效果不少。
呵呵,看来是我的理解有问题。
 
用这个方法吧:
位图长宽你自己知道,每位置的值这样赋值:
form1.Canvas.Pixels.Color:=RGB(red,green,blue);
如果是黑白的,则red=green=blue=你的灰度值。
16进制转化为二进制?????
无论什么进制,在计算机里面处理都是二进制的!!!
比如10H这是16进制,16D是10进制,10000B是二进制,内部处理他们都是一样对待!!!

Charles Petzold 的programming windows fifth edition 有你要的那个函数的详细讲解,
讲得很清楚。不过我觉得用那个很麻烦!

这个函数主要用来处理设备无关位图DIB
(主要是bitmap文件)的显示。
CONST BITMAPINFO *lpBitsInfo, // address of bitmap data
显示未图数据的一些基本信息,是一个结构,大概像这样子,但位图版本不同好像结构也不大同:
typedef struct tagBITMAPINFOHEADER // bmih
{
DWORD biSize ; // size of the structure = 40
LONG biWidth ; // width of the image in pixels
LONG biHeight ; // height of the image in pixels
WORD biPlanes ; // = 1
WORD biBitCount ; // bits per pixel (1, 4, 8, 16, 24, or 32)
DWORD biCompression ; // compression code
DWORD biSizeImage ; // number of bytes in image
LONG biXPelsPerMeter ; // horizontal resolution
LONG biYPelsPerMeter ; // vertical resolution
DWORD biClrUsed ; // number of colors used
DWORD biClrImportant ; // number of important colors
}
BITMAPINFOHEADER, * PBITMAPINFOHEADER ;




CONST VOID *lpBits, // address of bitmap bits
这是一个指针,指向一序列Byte,那些byte代表位图每一个pixel的RGB值,位图
的色彩数不同byte表示法不同,比较复杂,可以讲很长!!!!查书。
strech
 
我看例子调用都是直接读bmp文件,然后从文件偏移获取bitmapinfo等信息,然后调用
stretchdibitmaps.
当然,应该也可以你自己填写bitmapinfo。


delphi的原型如下:

function StretchDIBits(DC: HDC; DestX, DestY, DestWidth, DestHegiht, SrcX,
SrcY, SrcWidth, SrcHeight: Integer; Bits: Pointer; var BitsInfo: TBitmapInfo;
Usage: UINT; Rop: DWORD): Integer; stdcall;

TBitmapInfo = tagBITMAPINFO;
tagBITMAPINFO = packed record
bmiHeader: TBitmapInfoHeader;
bmiColors: array[0..0] of TRGBQuad;
end;
TBitmapInfoHeader = tagBITMAPINFOHEADER;
tagBITMAPINFOHEADER = packed record
biSize: DWORD;
biWidth: Longint;
biHeight: Longint;
biPlanes: Word;
biBitCount: Word;
biCompression: DWORD;
biSizeImage: DWORD;
biXPelsPerMeter: Longint;
biYPelsPerMeter: Longint;
biClrUsed: DWORD;
biClrImportant: DWORD;
end;
TRGBQuad = tagRGBQUAD;
tagRGBQUAD = packed record
rgbBlue: Byte;
rgbGreen: Byte;
rgbRed: Byte;
rgbReserved: Byte;
end;



 
To:雪鹰
谢谢指点,我的图像数据总长度是16384,是128*128,8级灰度的。
我先试下,成功后我另开个贴子给分。
 
受雪鹰Pixels[x,y]的启发 我写了这么个程序:
procedure TForm1.Button1Click(Sender: TObject);
var ss:string;
x,y,i:integer;
begin
for y:=0 to label1.Height do
begin
ss:='';
for x:=0 to label1.Width do
begin
if label1.Canvas.Pixels[x,y]=clwhite then
ss:=ss+'0'
else
ss:=ss+'1';
end;
memo1.lines.add(ss);
end;
image1.Height:= memo1.Lines.Count;
image1.Width:= length(memo1.lines[0]);
for y:=0 to memo1.Lines.Count-1 do
begin
for x:=0 to length(memo1.lines[0])-1 do
if copy(memo1.lines[y],x+1,1)='0' then
image1.Canvas.Pixels[x,y]:=RGB(255,255,255)
else
image1.Canvas.Pixels[x,y]:=RGB(6,14,21);
end;
end;
end.
 
后退
顶部