一个jpg和bmp图片转成点阵数据方法和代码,
不知道这个点阵数据和图片的流文件有什么关联没有谢谢大家

解决方案 »

  1.   

    图片文件中的数据,本身就是点阵。比如bmp格式的文件头偏移12h~15h是宽度,偏移16h~19h是高度,图像部分的数据,就是按这尺寸记录着每个像素点...。
    建议装个UltraEdit工具,对文件的结构进行分析,或在网上搜搜关于图像数据结构方面的资料,自然,你就对图片的数据心中了然的了。
      

  2.   

    bmp的结构,可参考http://wendang.baidu.com/view/b7882721192e45361066f5b6.html
      

  3.   

    就http://wendang.baidu.com/view/b7882721192e45361066f5b6.html所举例的图片,以下代码即可实现用“led”点阵来显示该图片(原文有误,根据图片的数据,图片应该是个8*8的图像,而不是像所述那样16*16)。
    新建一个工程、用下面代码覆盖unit1的代码,并将代码中的两个事件关联到窗体相应的事件去:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormShow(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation
    {$R *.dfm}
    var led:array[0..255]of TPanel;
        image1:Timage;procedure TForm1.FormCreate(Sender: TObject);
    var i:integer;
    begin
      //设置窗体:
      Height:=200;
      Width:=250;
      Color:=cl3DDkShadow;
      Position:=poScreenCenter;
      //生成图像控件,并按拉伸显示:
      image1:=Timage.Create(self);
      image1.Parent:=Form1;
      image1.Left:=23;
      image1.Top:=30;
      image1.Height:=56;
      image1.Width:=56;
      image1.Stretch:=true;
      //用 TPanel 仿一个 16*16 点阵的 led 显示屏:
      for i:=0 to 255 do begin
        led[i]:=TPanel.Create(self);
        led[i].Parent:=Form1;
        led[i].BevelOuter:=bvNone;
        led[i].Width:=6;
        led[i].Height:=6;
        led[i].Top:=i div 16 * 7 +30;
        led[i].Left:=i mod 16 * 7 + 100;
        led[i].Color:=clWindowText;
      end;
    end;procedure TForm1.FormShow(Sender: TObject);
    const
      ledWidth=16;
      filestr='424DF600000000000000360000002800'
             +'00000800000008000000010018000000'
             +'0000C000000000000000000000000000'
             +'0000000000000000FF0000FF0000FF00'
             +'00FF0000FF0000FF0000FF0000FF0000'
             +'FFC4C4C4C4C4C4C4C4C4C4C4C4C4C4C4'
             +'C4C4C40000FF0000FFC4C4C4C4C4C4C4'
             +'C4C4C4C4C4C4C4C4C4C4C40000FF0000'
             +'FFC4C4C4C4C4C4C4C4C4C4C4C4C4C4C4'
             +'C4C4C40000FF0000FFC4C4C4C4C4C4C4'
             +'C4C4C4C4C4C4C4C4C4C4C40000FF0000'
             +'FFC4C4C4C4C4C4C4C4C4C4C4C4C4C4C4'
             +'C4C4C40000FF0000FFC4C4C4C4C4C4C4'
             +'C4C4C4C4C4C4C4C4C4C4C40000FF0000'
             +'FF0000FF0000FF0000FF0000FF0000FF'
             +'0000FF0000FF';//图片内容,来自http://wendang.baidu.com/view/b7882721192e45361066f5b6.html举的例
    var ms: TMemoryStream;
        index,i:integer;
        Width,start,a,b,c,y:byte;
    begin
      ms:= TMemoryStream.Create;
      try  //将图片内容写入流(如果是从文件直接加载,可免去此段代码):
        //根据文件大小,定义流的长度:
        ms.SetSize($F6);//图片最后一个像素的偏移值为$F5,所以,文件的长度就是$F6了
        i:=1;
        while i<=$F6*2 do begin
          y:=strtoint('$'+filestr[i]+filestr[i+1]);
          ms.Write(y,1);
          inc(i,2);
        end;
    //    ms.LoadFromFile('c:\test.bmp');//从文件直接加载图片
        ms.Position:=0;
        image1.Picture.Bitmap.LoadFromStream(ms);//将图片加载到 image1
        //读取像素点的开始位置:
        ms.Position:=$0A;
        ms.Read(start,1);
        //读取图像宽度:
        ms.Position:=$12;
        ms.Read(Width,1);
        index:=0;//像素点索引为 0 ,即从第一个像素点开始显示
        ms.Position:=start;//将内存流指针移到图像的第一个像素点的位置
        while ms.Position < ms.Size do begin //从第一个像素起,读取每个像素的颜色值
          ms.Read(a,1);//蓝
          ms.Read(b,1);//绿
          ms.Read(c,1);//红
          led[index].Color:=a*$10000+b*$100+c;//将读取到的颜色赋值给显示像素点
          inc(index);//显示像素索引递增一
          if index mod Width = 0 then index := index + ledWidth - Width;//按图像宽度对应显示像素点
        end;
      finally
        ms.Free;
      end;
    end;end.