求jpg和bmp图片转成点阵数据方法和代码 一个jpg和bmp图片转成点阵数据方法和代码,不知道这个点阵数据和图片的流文件有什么关联没有谢谢大家 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 图片文件中的数据,本身就是点阵。比如bmp格式的文件头偏移12h~15h是宽度,偏移16h~19h是高度,图像部分的数据,就是按这尺寸记录着每个像素点...。建议装个UltraEdit工具,对文件的结构进行分析,或在网上搜搜关于图像数据结构方面的资料,自然,你就对图片的数据心中了然的了。 bmp的结构,可参考http://wendang.baidu.com/view/b7882721192e45361066f5b6.html 就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. 图片,AVI,FLASH等转换为exe文件,这类软件的原理是什么? 双引号、斜杠和反斜杠问题 再放分表示感谢! Borland.com上注册会员要钱吗? 知道一个窗体的句柄,如何在该窗体建立鼠标钩子 ***** 在线等待,如何得到 进程的路径?**** 最近有人问了我一个问题 商品无限极分类问题 请问WEBBROKER是什么?怎么定义WEB的虚拟目录? 熟悉ActionToolbar的帮帮我! TidHttpServer接收二进制文件应如何解析? DBGridEh显示小数位数 delphi FTP 上传文件时如何判断服务器上是否有相同的文件
建议装个UltraEdit工具,对文件的结构进行分析,或在网上搜搜关于图像数据结构方面的资料,自然,你就对图片的数据心中了然的了。
新建一个工程、用下面代码覆盖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.