`
wxw850227
  • 浏览: 68880 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

imagick 处理 gif 切割 或者是 缩放

    博客分类:
  • php
PHP 
阅读更多
对GIF动画进行缩小操作时,需要逐帧的缩小,这里会碰到几个比较麻烦的问题:
1、透明动画的问题
2、帧图片比显示尺寸小,并且有坐标控制的问题,直接缩小会似的动画完全乱掉

针对第一个问题,首先要建立一个透明的目标图片对象
$image = new Imagick();
$image->newImage($width,$height, $color, ‘gif’);
其中 $color = new ImagickPixel(”transparent”); 实际上是建立了一个透明色。

针对第二个问题,一开始我也是循环了GIF中每个图片对象,发现尺寸大小不一样,看API手册里只有 getImageWidth 和getImageHeight 这两个方法是和尺寸有关的,而没有关于获得坐标 position 的方法;只能一个一个的试,最后发现是用 getImagePage 获得的一个数组,里面包含了 width, height, x, y 这4个字段,其中width和height分别是图象的显示尺寸,并非图象的尺寸,而图象的尺寸是用getImageWidth和getImageHeight来获得,可能比图象的显示尺寸小;还有两个数据 x和y 分别是当前图象在显示区域内的坐标;不知道这个 Image Page 如何翻译,也许应该是层的概念;这个时候就可以计算出帧图片正确的显示内容。

<?php
ImagickResizeImage("E:\\images\\8.gif","D:\\ima\\8.gif",128,128,true);
/**
* 使用ImageMagick库缩放图片
*
* @param string $srcFile  源图片路径
* @param string $destFile 目标文件路径
* @param int $new_w 新的宽度
* @param int $new_h 新的高度
* @param bool $trim 是否切割图片
*
* @version 1.0
* @update 2007-04-03 23:09
* @author terry39
*
*/
function ImagickResizeImage($srcFile,$destFile,$new_w,$new_h, $trim=false)
{
if($new_w <= 0 || $new_h <= 0 || !file_exists($srcFile)) return false;
$src = new Imagick($srcFile);
$image_format = strtolower($src->getImageFormat());
if($image_format != 'jpeg' && $image_format != 'gif' && $image_format != 'png' && $image_format != 'jpg') return false;
 
$src_page = $src->getImagePage();
 
//如果是 bbsposts 目录里的图片文件,这加入水印
if(strpos($destFile, 'bbsposts') !== false){
 
//先算出最终缩略图的尺寸
$src_w = $src_page['width'];
$src_h = $src_page['height'];
 
$rate_w  = $new_w / $src_w;
$rate_h  = $new_h / $src_h;
 
$rate    = (!$trim && $rate_w < $rate_h) || ($trim && $rate_w > $rate_h) ? $rate_w : $rate_h;
$rate = $rate > 1 ? 1 : $rate;
$thumb_w = round($src_w * $rate);
$thumb_h = round($src_h * $rate);
 
//确定使用对应尺寸的水印图片
$watermask = true;
if($thumb_w >= 300 && $thumb_h >= 300){
$watermaskfile = "images/watermask/1.png";
}else if($thumb_w >= 100 && $thumb_h >= 100){
$watermaskfile = "images/watermask/2.png";
}else{
$watermask = false;
$watermaskfile = '';
}
if($watermask){
$water = new Imagick($watermaskfile);
$water_page = $water->getImagePage();
$water_w = $water_page['width'];
$water_h = $water_page['height'];
}
}
 
//如果是 jpg jpeg gif
if($image_format != 'gif'){
$dest = $src;
if(!$trim){
$dest->thumbnailImage($new_w, $new_h, true);
}else{
$dest->cropthumbnailImage($new_w, $new_h);
}
if($watermask) $dest->compositeImage($water, Imagick::COMPOSITE_OVER, $dest->getImageWidth() - $water_w, $dest->getImageHeight() - $water_h);
 
$dest->writeImage($destFile);
$dest->clear();

//gif需要以帧一帧的处理
}else{
$dest = new Imagick();
$color_transparent = new ImagickPixel("transparent"); //透明色
foreach($src as $img){
$page = $img->getImagePage();
$tmp = new Imagick();
$tmp->newImage($page['width'], $page['height'], $color_transparent, 'gif');
$tmp->compositeImage($img, Imagick::COMPOSITE_OVER, $page['x'], $page['y']);
if(!$trim){
$tmp->thumbnailImage($new_w, $new_h, true);
}else{
$tmp->cropthumbnailImage($new_w, $new_h);
}
if($watermask) $tmp->compositeImage($water, Imagick::COMPOSITE_OVER, $tmp->getImageWidth() - $water_w, $tmp->getImageHeight() - $water_h);
$dest->addImage($tmp);
$dest->setImagePage($tmp->getImageWidth(), $tmp->getImageHeight(), 0, 0);
$dest->setImageDelay($img->getImageDelay());
$dest->setImageDispose($img->getImageDispose());
 
}
$dest->coalesceImages();
$dest->writeImages($destFile, true);
 
$dest->clear();
}
}

?>
分享到:
评论
2 楼 jimzhao 2009-08-13  
有一个gif,按你的方法处理了一下,可以动画的时候,中间出现很多黑点,不知道是什么原因?
1 楼 bigplum 2009-07-17  
好东西   

相关推荐

    imagick 图片处理类

    imagick 图片处理类, imagick 优化图片, 修改大小,保存图片,添加水印

    PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF

    给骨头系统开发的图像库的 imagick 部分 ,支持 gif , 完美支持裁切、生成缩略图、添加水印 。 支持按方位生成缩略图像, 如: // 把左上角优先 $image-&gt;resize_to(100, 100, 'north_west'); // 右边优先 $image...

    php imagick 版本列表

    压缩包包含《imagick-2.1.0.tgz》、《imagick-2.1.1.tgz》、《imagick-2.1.1RC1.tgz》、《imagick-2.2.0.tgz》、《imagick-2.2.1.tgz》、《imagick-2.2.2.tgz》、《imagick-2.3.0.tgz》、《imagick-3.0.0.tgz》、...

    imagick函数作用.txt

    imagick函数作用,这是php—imagick函数的中文名称!有需要的朋友可以看看!

    php_imagick

    php_imagickphp_imagickphp_imagickphp_imagickphp_imagickphp_imagick64位

    windows下php配置imagick扩展

    【有文档,有两个安装软件等】php中的imagick扩展,主要实现对图片的操作与gd库都是对图片的操作的扩展,我当时用imagick的时候主要是想将格式为pdf的文件通过程序来转化成图片形式,经过一段时间的研究和探索最终...

    imagick-3.0.1.tgz

    imagick-3.0.1.tgz 源代码包

    imagick-2.3.0.tgz

    ImageMagick学习 imagick-2.3.0.tgz是php的imagick的扩展

    php_imagick-x86

    php_imagick-x86php_imagick-x86php_imagick-x86php_imagick-x86php_imagick-x86php_imagick-x86php_imagick-x86

    php使用imagick模块实现图片缩放、裁剪、压缩示例

    PHP 使用Imagick模块 缩放,裁剪,压缩图片 包括gif图片 缩放 裁剪 复制代码 代码如下:/** * 图片裁剪 * 裁剪规则: * 1. 高度为空或为零 按宽度缩放 高度自适应 * 2. 宽度为空或为零 按高度缩放 宽度自适应 ...

    imagick-3.5.1.tgz

    imagick-3.5.1.tgz 安装包linux版本

    imagick手册

    imagick的:: adaptiveBlurImage - 增加了自适应模糊滤镜图像 imagick的:: adaptiveResizeImage - 自适应调整图像数据依赖三角 imagick的:: adaptiveSharpenImage - 自适应锐化图像 imagick的:: ...

    php_imagick.dll

    php_imagick.dll扩展,支持php5.3+

    php_imagick扩展

    php_imagick-3.4.3-5.6-nts-vc11-x86.zip windows 32位版

    imagick-3.4.3.tgz

    imagick-3.4.3.tgz,最新版本的连接PHP和ImageMagick的通道

    imagick windows dll php

    pecl.php.net/package/imagick 也可以自己下载 . 不错的东西,测试过的。

    php5.6安装imagick所需文件

    php5.6安装imagick,一直找不到对应资源,版本对不上。终于这个可以用了备注上传。 php5.6+php_imagick.dll(3.4.1)+ImageMagick-6.9.3-7-Q16-x64-dll.exe

    php Imagick配置全攻略,v5.3,v5.4,配置,包括了NTS,TS模式

    php Imagick配置全攻略,v5.3,v5.4,配置,包括了NTS,TS模式。gif,处理模式扩展

Global site tag (gtag.js) - Google Analytics