网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Delphi
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.Delphi编程技巧十则.
.在DELPHI程序中使用ADO对象存取O.
.在Delphi中通过函数获取GUID.
.Delphi+Word解决方案参考.
.用Delphi在工业控制和自动化实现.
.如何把数据库的内容写入到Word文.
.Delphi编码规范.
.用Delphi编写VxD设备驱动程序.
.防止全局hook入侵Delphi版,2000.
.动态建表(示例).
.《delphi高手突破》节选一.
.Delphi中建议使用的语句.
.让窗体在执行了“显示桌面”以后.
.fileStream.
.资源文件的应用.
.在TDBGrid控件中为作修改过的记录.
.Delphi中用于读写(I/O)的三种文件.
.怎样用delphi制作一个IPhunter(独.
.Delphi2005学习笔记3——数组参数.
.编辑框和位图按钮的特殊结合.

黑白图像的缩小灰度级显示算法的编写

发表日期:2006-2-4


 

大家都知道,黑白图像是0,1二值的,缩小显示的时候由于n个点转化成1个点会导致图像局部细节信息丢失,比如一条宽度一个象素的细线由于缩小可能就会没有显示,而使用灰度级显示正是能解决这个缩小显示的问题,Windows自带的Eastman Software提供的的图像处理可以在你缩小黑白图片的时候使用灰度级来显示,下面我们就来深入研究一下这个算法是如何实现的吧。

基本约定:

1.  灰度级缩小显示只正对黑白或者灰度影像,经过算法变换可用于彩色影像

2.  只有在显示<100%的时候灰度级显示才生效

3.  灰度级缩小算法是基于原始图像来运算

具体算法:

1.  缩小算法

按照与原图比例1n来对原图nXn个点生成1个点(n可以是浮点数),考虑到效率可以使用灰度级变换,从0-255 取中间点127大于该值显示白小于改值显示黑色。

2.  灰度级显示算法

结合缩小算法nXn个点生成一个点的原则,在原图上按照每个点的权值和颜色相乘再除以n来得到生成点的颜色值。

例如:

a1  a2   a3  a4  a5  a6   a7  a8  a9 a10

|-----|---*-|-----|-*---|-----|*----|-----*-----|-----|-----|

 

|---------|---------|----------|----------|----------|---------|--

b1    b2     b3     b4     b5     b6

经过变换后

b1 = (1.0*a1+0.8*a2)/1.8

b2 = (0.2*a2+a3+0.6*a3)/1.8

……

 

这是一维坐标,扩展到二维空间算法相同。

具体实现方法:

1.  计算出缩小后的位图点阵大小(nXm)

比如原图100X100,缩放90%之后就是90X90点阵

2.  循环点阵,为每个点的颜色赋值

赋值方法取相关点颜色乘以相应权值累加除以权值和

 

原图


缩放为66.6%


计算每点值

Delphi代码如下

 

var

  i,j:integer;

  tmpColorR,tmpColorG,tmpColorB:dWord;

  x,y:integer;

  ScaleRate,ScaleRateX,ScaleRateY:real;

begin

       //combobox1.text为缩放%

  ScaleRate:=100/strtoFloatDef(combobox1.text,100);

//循环生成图像的点阵

  for i:=0 to  trunc(image1.Picture.Width/ScaleRate) do

    for j:=0 to  trunc(image1.Picture.height/ScaleRate) do

      begin

        tmpColorR:=0;

        tmpColorG:=0;

        tmpColorB:=0;

              //为每个点累加相关节点的颜色

        for x:=trunc(i*ScaleRate) to  ceil(((i+1)*ScaleRate)-1) do

          begin

            for y:=trunc(j*ScaleRate) to ceil(((j+1)*ScaleRate)-1) do

              begin

                ScaleRateX:=Min(x+1,(i+1)*ScaleRate) - Max(x,i*ScaleRate);

                ScaleRateY:=Min(y+1,(j+1)*ScaleRate) - Max(y,j*ScaleRate);

              //取每个点的RGB(如果是黑白或者灰度,只需要取得一位)

                tmpColorR:=tmpColorR+trunc(ScaleRateX*ScaleRateY*(GetRValue(Image1.Canvas.Pixels[x,y])));

                tmpColorG:=tmpColorG+trunc(ScaleRateX*ScaleRateY*(GetGValue(Image1.Canvas.Pixels[x,y])));

                tmpColorB:=tmpColorB+trunc(ScaleRateX*ScaleRateY*(GetBValue(Image1.Canvas.Pixels[x,y])));

              end;

          end;

//为点赋值颜色

        image2.Canvas.Pixels[i,j]:=RGB(trunc(tmpColorR/(ScaleRate*ScaleRate)),trunc(tmpColorG/(ScaleRate*ScaleRate)),trunc(tmpColorB/(ScaleRate*ScaleRate)));

      end;


这个算法是我写的第一版本,还有很多优化余地,比如如果是黑白图像就不需要计算R G B,因为256级灰度全部是相同的
另外for循环中的表达式可能影像速度,还有用整数运算会比浮点快,等等。

上一篇:如何在DBGRID或者STRINGGRID中实现用滚轮进行翻页的功能,就象浏览网页一样 人气:4426
下一篇:在DElphi中的DataGrid怎样使它显示的行间隔改变颜色 人气:4623
浏览全部Delphi的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐