免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2963 | 回复: 4
打印 上一主题 下一主题

Perl如何不使用ImageMagick把JPG转BMP呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-03 17:37 |只看该作者 |倒序浏览
ImageMagick太大了,以至于pp打包的时候很麻烦。
GD又不支持BMP。

CPAN上没找到相关模块。

Perl如何可以做到这件事呢?

论坛徽章:
0
2 [报告]
发表于 2010-02-03 17:52 |只看该作者
大的不是ImageMagick,而是JPEG的库。而没有JPEG库,你要自己读取JPEG文件,虽说可能,但工作量太大了。
BMP文件的格式比较简单,就是一个简单的文件头+三个字节一个点方式排在一起,自己操作都是非常容易的。

论坛徽章:
0
3 [报告]
发表于 2010-02-03 17:55 |只看该作者
有人写了个GD写BMP文件的代码。

  1. #! perl -slw
  2. use strict;
  3. use GD;

  4. my $img = GD::Image->newFromJpeg( $ARGV[ 0 ], 1 )
  5.     or die "$ARGV[ 0 ] : $!";

  6. my( $width, $height ) = $img->getBounds();

  7. ( my $bmpFile = $ARGV[ 0 ] ) =~ s[.jpg$][.bmp]i;
  8. open BMP, '>:raw', $bmpFile or die "$bmpFile : $!";
  9. binmode BMP;

  10. printf BMP '%s', pack 'A2ISSI', 'BM', $width * $height +54, 0, 0, 54;

  11. printf BMP '%s', pack 'IiiSSIIiiII',
  12.     40, $width, $height, 1, 24, 0, $width * $height, 11811, 11811, 0,
  13. +0;

  14. for my $y ( reverse 0 .. $height-1 ) {
  15.     for my $x ( 0 .. $width-1 ) {
  16.         printf BMP '%s', pack 'CCC', reverse $img->rgb( $img->getPixel
  17. +( $x, $y ) );
  18.     }
  19. }
  20. close BMP;
复制代码

评分

参与人数 1可用积分 +4 收起 理由
兰花仙子 + 4 nice~

查看全部评分

论坛徽章:
0
4 [报告]
发表于 2010-02-03 18:31 |只看该作者
高手就是不一样啊!拜谢!~
解决了。
这段代码可以用。

论坛徽章:
0
5 [报告]
发表于 2010-02-03 18:34 |只看该作者
不过这段代码的CPU的占用好高。
=。=
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP