led显示屏模拟软件十几分钟才有图象并显示模拟怎么办

502 Bad Gateway
502 Bad Gateway
nginx/1.8.1模拟显示屏_模拟显示屏价格_优质模拟显示屏批发/采购 - 阿里巴巴
您是不是在找:
共14页到页
阿里巴巴为您找到790条模拟显示屏产品的详细参数,实时报价,价格行情,优质批发/供应等信息。您还可以找7寸显示屏,4.3寸显示屏,电脑显示屏,车载显示屏,户外显示屏等产品信息。
感兴趣的产品
感兴趣的厂家
感兴趣的内容
48小时发货
48小时发货Led控件(2)——Led显示屏模拟 - hoodlum1980 - 博客园
这里延续讲Led控件的第三种,即高分辨率的Led显示屏,它是由很多密集的发光二极管组成的阵列,和显示器的像素显示的原理类似。(显示器的像素是一种RGB蜂窝状密集排列)。
类似的例子,例如vs.net里面的图片,光标设计器,可以看到它可以把图片像素放大成密集网格显示。效果如下图所示:
这个控件的实现原理是很直观的,简单描述一下绘制的方法。即首先我们需要准备一个真实的图片作为复制源,称为源图(src bitmap),我们把它复制到led显示屏图片(dest bitmap)中,每个像素被我们放大成一个网格(cell),大小为(cellsize * cellsize),这些网格的间距是celldistance。一个cell对应的就是一个pixel。在cell的间隙之间,可能是背景色,或者是Grid线。
复制源图的每个像素到一个cell中,我们可以使用bitmap的getpixel,setpixel方法,但是这样做显然效率会非常低下。这种针对精确到像素的操作应该使用指针直接操作内存,首先我们需要获取在内存中的位图数据(BitmapData对象),并将它锁定,亦即告诉操作系统在现在不要移动这块内存。在处理前我们必须理解,位图数据在内存中是一块地址连续的存储区域。
解释一下BitmapData对象提供的两个最重要属性:
1.IntPtr Scan0:这是一个指针,指向数据的第一个像素的第一个通道,也就是说从这向后数,都是像素内容。通道的顺序是BGR,BGR,BGR,...,你必须记住通道的顺序,不要搞错。
2.int Stride:它称为扫描行宽度,这是一个非常关键的概念,它告诉你图片中的每一行在这块内存中占据的字节长度。请注意,基于bitmap的存储方式,这个数字一定是4的倍数,也就是说,一个扫描行需要凑成4字节的整数倍,因此可能在末尾具有一些补0的冗余字节。
因此扫描行宽度可以描述为下面的等式:
stride(字节)=Bitmap.Width(像素)*bpp/8+行尾补0字节数&
(其中bpp为色深度,bits per pixel, 位/像素)
对RGB图像,具有三个通道,每个通道占据1个字节,可理解为:
&stride=Bitmap.Width*3+行尾补0字节数
则行尾补0字节数=4-(Bitmap.Width*3)%4;&
因此了解了以上概念,我们就可以用下面的代码操作像素了,对于一个位于(i,j)位置的像素,它的RGB可以按照如下的下标访问:
//像素(i,j)
byte*&p=(byte*)(void*)bmData.Scan0;
p[&stride*j&+&i*<span style="color: #&]=(byte);//Blue&channel
p[&stride*j&+&i*<span style="color: #&+<span style="color: #&]=(byte);//Green&channel
p[&stride*j&+&i*<span style="color: #&+<span style="color: #&]=(byte);//Red&channel
在处理完成以后,必须将bitmapData解锁内存。
由于以上操作需要使用unsafe代码,所以必须在项目属性中设置允许执行不安全代码。否则会编译出错。
现在,可以看一下绘制LedScreen Bitmap的函数:
&1/**////&&summary&
&2///&创建一个Led显示屏位图
&3///&&/summary&
&4///&&param&name="srcBitmap"&贴图的源图&/param&
&5///&&param&name="nWidth"&显示屏宽度&/param&
&6///&&param&name="nHeight"&显示屏高度&/param&
&7///&&param&name="drawGrid"&是否绘制网格&/param&
&8///&&param&name="srcX"&源图起始坐标x&/param&
&9///&&param&name="srcY"&源图起始坐标y&/param&
<span style="color: #///&&param&name="cellsize"&像素格大小&/param&
<span style="color: #///&&param&name="celldistance"&像素格间距&/param&
<span style="color: #///&&returns&&/returns&
<span style="color: #public&static&Bitmap&CreateLedBitmap(Bitmap&srcBitmap,int&nWidth,int&nHeight,bool&drawGrid,int&srcX,int&srcY,int&cellsize,int&celldistance)
<span style="color: #{
<span style="color: #&&&&Bitmap&bm=new&Bitmap(nWidth,nHeight);
<span style="color: #&&&&//这是bm全是黑色的。(都被设置为0)
<span style="color: #&&&&//获得图片的内存
<span style="color: #&&&&BitmapData&bmData=bm.LockBits(
<span style="color: #&&&&&&&&new&Rectangle(<span style="color: #,<span style="color: #,bm.Width,bm.Height),
<span style="color: #&&&&&&&&ImageLockMode.ReadWrite,
<span style="color: #&&&&&&&&PixelFormat.Format24bppRgb);
<span style="color: #&&&&//扫描行宽度
<span style="color: #&&&&int&stride=bmData.S
<span style="color: #
<span style="color: #&&&&//获取源图的bmdata
<span style="color: #&&&&BitmapData&srcData=srcBitmap.LockBits(
<span style="color: #&&&&&&&&new&Rectangle(<span style="color: #,<span style="color: #,srcBitmap.Width,srcBitmap.Height),
<span style="color: #&&&&&&&&ImageLockMode.ReadOnly,
<span style="color: #&&&&&&&&PixelFormat.Format24bppRgb
<span style="color: #&&&&&&&&);
<span style="color: #
<span style="color: #&&&&int&strideSrc=srcData.S&&&&//源图的行长度
<span style="color: #&&&&//操作内存的不安全代码段
<span style="color: #&&&&unsafe
<span style="color: #&&&&{
<span style="color: #&&&&&&&&byte*&p=(byte*)(void*)bmData.Scan0;
<span style="color: #&&&&&&&&byte*&pSrc=(byte*)(void*)srcData.Scan0;&&&&//源图
<span style="color: #
<span style="color: #&&&&&&&&for(int&j=srcY;j&srcBitmap.Hj++)
<span style="color: #&&&&&&&&{
<span style="color: #&&&&&&&&&&&&for(int&i=srcX;i&srcBitmap.Wi++)
<span style="color: #&&&&&&&&&&&&{
<span style="color: #&&&&&&&&&&&&&&&&int&nmin=(cellsize+celldistance)*(j-srcY);
<span style="color: #&&&&&&&&&&&&&&&&int&nmax=nmin+
<span style="color: #&&&&&&&&&&&&&&&&int&mmin=(cellsize+celldistance)*(i-srcX);
<span style="color: #&&&&&&&&&&&&&&&&int&mmax=mmin+
<span style="color: #&&&&&&&&&&&&&&&&//源图i,j位置的像素复制给一个目标图的一个cell块!
<span style="color: #&&&&&&&&&&&&&&&&for(int&n=(n&nmax&&&&n&bm.Height);n++)
<span style="color: #&&&&&&&&&&&&&&&&{
<span style="color: #&&&&&&&&&&&&&&&&&&&&for(int&m=(m&mmax&&&&m&bm.Width);m++)
<span style="color: #&&&&&&&&&&&&&&&&&&&&{
<span style="color: #&&&&&&&&&&&&&&&&&&&&&&&&p[&stride*n&+&m*<span style="color: #&]=pSrc[&strideSrc*j&+&i*<span style="color: #];&&&&&&&&//B
<span style="color: #&&&&&&&&&&&&&&&&&&&&&&&&p[&stride*n&+&m*<span style="color: #&+<span style="color: #&]=pSrc[&strideSrc*j&+&i*<span style="color: #+<span style="color: #];&&&&//G
<span style="color: #&&&&&&&&&&&&&&&&&&&&&&&&p[&stride*n&+&m*<span style="color: #&+<span style="color: #&]=pSrc[&strideSrc*j&+&i*<span style="color: #+<span style="color: #];&&&&//R
<span style="color: #&&&&&&&&&&&&&&&&&&&&}
<span style="color: #&&&&&&&&&&&&&&&&}
<span style="color: #&&&&&&&&&&&&}
<span style="color: #&&&&&&&&}//&&&&&/for&i&
<span style="color: #&&&&}//&&&&&/unsafe&
<span style="color: #&&&&srcBitmap.UnlockBits(srcData);
<span style="color: #&&&&bm.UnlockBits(bmData);
<span style="color: #&&&&return&
<span style="color: #}
在上面的函数中,暂时忽略了DrawGrid这个参数。并且我们给出了srcX,srcY,这是源图复制的起始点。这两个参数主要是基于实现ledscreen滚动字幕效果的考虑。例如不断递增srcX,并更新位图,可以实现水平方向的字幕滚动。
下面为demo中的代码,临时创建了一个图片,并把生成的led screen图片显示在一个picurebox中:
<span style="color: #Bitmap&bm=new&Bitmap(<span style="color: #0,<span style="color: #);
<span style="color: #Graphics&g=Graphics.FromImage(bm);
<span style="color: #g.FillRectangle(Brushes.DarkGreen,<span style="color: #,<span style="color: #,bm.Width,bm.Height);
<span style="color: #SolidBrush&brush=new&SolidBrush(Color.FromArgb(<span style="color: #,<span style="color: #5,<span style="color: #));
<span style="color: #g.DrawString("hello&cnblogs!",new&Font("Arial",9f),brush,<span style="color: #,<span style="color: #);
<span style="color: #g.Dispose();
<span style="color: #Bitmap&bm2=FigFactory.CreateLedBitmap(bm,<span style="color: #0,<span style="color: #0,false,<span style="color: #,<span style="color: #,<span style="color: #,<span style="color: #);
<span style="color: #this.pictureBox1.Image=bm2;
对于vs.net中的图片编辑器来说,它相当于celldistance=1的情况,并且在cell的间隔之间绘制了Grid,我发现这些grid线是由两种颜色交替而组成的,因此这可以保证Grid线不会被任何颜色遮盖住。
下面是源代码的下载链接。我原来以为这个代码直接复制就可以用了,但是考虑到一些朋友还是向我提出一些问题。我把原来项目的代码上传并发在这里。这个里面不仅有这个led&#8220;走马灯&#8221;效果,也包含我一些分形图形有关的代码。
(源代码下载):Retina 鏄剧ず灞忎笅 @2x 鍥剧墖鐨勬ā鎷

我要回帖

更多关于 模拟显示屏 的文章

 

随机推荐