文章分类 | 推荐文章 | 最新文章 | 热点文章 | 最新软件 | 精品软件 | 下载排行 | 推荐下载 | 免费看大片 | WPS | 杀毒软件
清风网络
首 页 软件下载 网络学院 数码学院
QQ 电脑入门 游戏 操作系统 图形处理 办公软件 媒体动画 精文荟萃 工具软件 网络编程 程序开发 网络技术 认证考试 网站建设 文章专栏
当前位置:清风网络学院程序开发其他语言一种位图缩放的快速算法&PSD格式的开发&PSD格式文件的读取
精品推荐
特别推荐
·控制面板知多少
·给你十条学习Ruby语言的理由
·分页管理机制
·Perl 语言的重要价值体现
·经验技巧:分享两条Delphi开发经验
·Java编程思想:面向对象的逻辑思维方法
·Samba系统简介
热点TOP10
·程序八卦:胡子决定编程语言运势
·EZ-USB 68013A开发指南
·AIX 5L 学习大纲/简易教程(3)(未经许可,请勿COPY)
·Static和Final修饰类属性变量及初始化
·Servlet和Filter的url匹配url-pattern
·Flex挑战Java和.NET Adobe能否再度崛起?
·Java编程思想:面向对象的逻辑思维方法
·How to cross-compile OpenSSL for ARM
·在Pocket PC上编写游戏之十
·设计Pocket PC短消息服务简介

一种位图缩放的快速算法&PSD格式的开发&PSD格式文件的读取

日期:2008年6月25日 作者: 查看:[大字体 中字体 小字体]


一种位图缩放的快速算法&PSD格式的开发&PSD格式文件的读取

一种位图缩放的快速算法 

  给定一个位图,如何将它缩放至任意尺寸?很明显,唯一的方法是:放大时,在像素中间添加一些重复像素,使图像拉宽;缩小时,把部分像素删除掉,使图像收缩。但是如何确定哪些像素该重复,哪些像素该删除呢?下面的方法是我自已想的,如果你有更好的方法,请告诉我。我们只考虑水平方向(垂直方向跟水平方向是同样的道理)。下面先从简单的例子来说,最后再推出一个通用的算法:

若要放大1倍,应将每一个像素都重复一次,N个像素变成了2N个像素,图像放大为2倍。这个不难;

若要缩小1/2,应该每隔一个像素删除一个像素,2N个像素变成了N个像素,图像缩小一半。这个也不难;

若要放大1.5倍,怎么办?假设原有2N个像素,现在欲变成3N个像素,须添加N个像素,所以应对原图每隔一个像素添加一个重复像素: 

若要缩小1/3,就是C的逆过程:每隔两个像素删除一个像素。 
  上面四个例子都是比较容易的特例。现在来考虑通用的算法。在四个例子的缩放过程可以这样理解。假设欲将长度为N1的像素列变成长度为N2的像素列,首先,设立两个指针,一个作为源指针,指向原来的像素列,读取源像素,另一个作为目的指针,指向变换后的像素列,写入读取到的像素。然后,以拉伸后像素列的长度为循环次数,循环N2次,每次循环中由源指针处COPY一个像素到目的指针处,然后目的指针加一,源指针根据每次循环的不同需要增加一定步长(放大时步长是零或一,缩小时步长大于等于一)。
  算法的框架解决了,但是中心内容仍没有解决:如何确定每次循环里源指针增加的步长?或者说,每次循环里如何更新源指针的位置?容易看出,通过浮点运算很容易解决这个问题:设立一个初值为零的浮点变量,每次循环中,把这个浮点变量加上N1/N2,并将其结果的整数部分作为源指针距离起始位置的偏移量;这样,经过N2次循环,浮点变量的值恰好达到N1,源指针也恰好“走”到原像素列的末尾。
  这个方法可行,但是太慢。如果能将浮点运算转化成整数运算就快多了。那么如何转化呢?我们可以设立一个值域为N1*N2的整数计数器,每次循环递增N1,并且规定,计数器每增加N2,源指针就前进一个像素。这样,经过N2次循环,计数器共增加了N1*N2,源指针则增加了N1个单元,恰好“走”完全程。实际编程中,我们是用一个值域为N2的整数计数器,超出值域部分取模处理。算法大致如下:

  void StrechPixels(int N1, int N2, PIXEL src_pixels[], PIXEL dest_pixels[])
  {
    ASSERT(N1 <= N2);  // N1 must <= N2
    int p1 = 0, count = 0;
    for (int p2 = 0; p2 < N2; p2++)
    {
      dest_pixels[p2] = src_pixels[p1];
      count += N1;
      while (count >= N2)
      {
        count -= N2;
        p1++;
      }
    }
  }

  上面算法只是水平缩放单行像素,对垂直方向也采用同样的算法,便实现了任意比例的位图缩放。经过以上算法的处理,放大时图像出现马赛克,缩小时图像出现闪砾。若要获得高质量的缩放图形,须采用插值、过滤等技术。但是因为这些技术所需计算量太大,在游戏中通常靠硬件加速来实现,不宜软件解决。  


================================================================
PSD格式的开发 



  我在做游戏时,因为要用到将PSD格式转换成BMP或者JPG格式的程序,而且,在转换时,要将PSD中的空格转成游戏中约定的透明色,这样的程序,只能自己去写了。所以,我在网上搜了一阵子,找到了“中国游戏开发者”的网站,看到了一篇关于PSD格式的文章(这也是我开始向这个网站投稿的原因,也许这就叫缘)。
  本来是想偷点懒,省去了自己研究之苦,可以抄一抄别人现在的代码,再自己改改,又能省时间,又能学到东西,何乐而不为呢?可是,在抄下这篇文章的代码之后,发现其运行居然是不能通过的。看来天下没有免费的午餐,我还是得自己研究。一个多小时的苦战之后,终于发现了问题所在,也许这并不是一个问题,只是对于没有这个经验人来说,这确实是个大问题。我现在将这篇文章的一些地方进行改正,望各位朋友在开发PSD格式的读取问题上,不再有麻烦。原文《PSD格式文件的读取》在这里http://cgd.pages.com.cn/cgd/develop/effect/200109/ReadPSD.htm,各位可以看看。我只将我的改正部分写在下面: 

  1)文件头是4个字节,只能读4个字节。
  2)Photoshop的PSD格式用的是LIT格式存储。

  这个LIT格式我以前只是听说过,没想到会被PSD用上。这个格式是将数据的高低位码交换了的,如果直接用ReadFile或者fread函数将其读出来,它的高低位码是被交换了的。例如:640的16进制值是1E0,用DWORD方式存在硬盘里是0001E000,用读文件的函数读出来以后,将变成:00E00100。所以,其高低位码被交换了,解决的方法是用转换函数,代码如下:

[1] [2] [3] [4] [5] [6] 下一页 




上一篇:[分形]DLA团簇模型的摸拟

下一篇:Windows XP 超级140个技巧

相关文章:
·dll文件下载
·轻轻松松教你另一种网赚方法
·转换MP4/3GP格式的至尊法宝---MP4/RM转换专家
·局域网文件共享详解
·快速找回QQ密码的新方法
·利用word将PDF转换DOC文件的方法
·java做的比较完善的FTP连接上传下载文件
·快速利用135端口入侵个人电脑
·MPEG、RM、WMV电影文件格式转换指南
·从视频文件中提取声音的方法
相关软件:
·中国少年儿童智力开发百科全书(上中下)高清PDF全彩图书
·孙鑫VC++从入门到精通开发详解视频教程FLASH版
·保证你快速致富的七个步骤
·最强文件加密锁2007
·硬盘分区与格式化详解
·Ultra RM Converter(Real文件转换分割,合并)V3.3.0916 汉化版
·西门子plc软件及教程 文件类型 其它介绍
·文件夹加密器V9.6
·新会计准则之下的报表格式
·全能格式转换(Konvertor) V3.45.1 汉化版

特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
[打印本页] [关闭窗口] 转载请注明来源:http://www.viphot.com
| 帮助(?) | 版权声明 | 友情连接 | 关于我们 | 信息发布
Copyright 2007 www.viphot.com All Rights Reserved. 鄂ICP备05000083号Powered by:viphot