`

使用Imagick来”resize” 和 “crop” GIF动画

    博客分类:
  • php
阅读更多
http://www.cnblogs.com/analyzer/articles/1726147.html



转自:http://blog.terry39.com/?p=51

对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 如何翻译,也许应该是层的概念;这个时候就可以计算出帧图片正确的显示内容。

原图效果

缩小或切割后


这里给出ImagickResizeImage函数
<?php

/**
* 使用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();
}
}
?>
分享到:
评论

相关推荐

    php制作gif动画

    在这个过程中,我们需要使用PHP的GD库或Imagick扩展来创建、编辑和组合多帧图像,最终生成一个连续播放的GIF动画。下面将详细介绍如何实现这个功能。 首先,你需要确保你的PHP环境已经安装了GD库或Imagick扩展。GD...

    imagick 图片处理类

    Imagick是PHP中用于图像处理的一个强大库,它提供了对ImageMagick底层库的接口,使得在PHP环境中可以...通过这些知识点,开发者可以使用Imagick在PHP中进行复杂的图像处理工作,为网站或应用增加图像美化和优化的功能。

    php7.1 nts imagick 插件使用

    7. **组合图像**:你可以使用Imagick的`compositeImage()`方法来合成多张图像。 ```php $background = new Imagick('background.jpg'); $overlay = new Imagick('overlay.png'); $background-&gt;compositeImage($...

    php-imagick-2.2.1

    总结来说,PHP Imagick是PHP中强大的图像处理工具,其丰富的功能使得开发者能够方便地实现各种图像操作和特效,极大地提升了PHP在图像处理领域的应用能力。了解并熟练使用PHP Imagick,对于提升网站或应用的用户体验...

    php_imagick.dll

    - **读取和写入图像**:通过Imagick对象的readImage()方法,可以读取各种格式的图像文件,如JPEG、PNG、GIF等。writeImage()方法则用于将处理后的图像保存到文件。 - **图像调整**:可以使用resizeImage()、...

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

    Imagick的使用不局限于简单的操作,还可以通过设置不同的参数来实现复杂的效果,例如在裁切和缩放时,可以根据参数的不同来控制图像的处理方式和最终效果。 最后,需要提及的是,本文中还涉及到了一个名为`imagick....

    resize-crop-image

    "resize-crop-image"项目可能使用了其中之一,或者自定义了算法来实现所需功能。 文件名列表中的"resize-crop-image-master"通常表示这是一个Git仓库的主分支,其中可能包含如下结构: 1. `index.php` - 主要的PHP...

    php_imagick,支持php5.2以上版本

    8. **动画处理**:对于GIF动画,Imagick可以方便地进行编辑和创建。 **三、性能比较** 相比于PHP内置的GD库,Imagick在功能和性能上都有明显优势。GD库虽然轻量且易于使用,但处理复杂图像和大量操作时可能效率较...

    php_imagick

    - 使用Imagick时,注意防止恶意用户通过上传含有恶意代码的图像文件进行攻击,如利用ImageMagick的`-write`选项执行任意命令。 - 限制ImageMagick的Policy配置,比如设置最大内存和磁盘使用,避免资源耗尽。 7. *...

    imagick-3.4.2.tgz

    这个扩展使得开发者能够使用超过200种图像处理方法,包括创建、编辑和合成图像,支持多种图像格式如JPEG、PNG、GIF等。 Imagick库是基于ImageMagick,一个开源的跨平台命令行工具套件,用于在多种格式之间转换和...

    php_imagick扩展

    $imagick-&gt;resizeImage(800, 0, \Imagick::FILTER_LANCZOS, 1); // 调整图像大小 $imagick-&gt;writeImage('resized_image.jpg'); // 保存处理后的图像 ?&gt; ``` 4. **高级特性** 除了基础操作,Imagick还支持更高级的...

    php_imagick扩展 php 5.3

    在开发过程中,通过Imagick类和其方法,如`Imagick::readImage()`, `Imagick::resizeImage()`, `Imagick::writeImage()`, `Imagick::compositeImage()`等,可以轻松地实现上述功能。需要注意的是,为了确保性能和...

    php_imagick_st-Q16.dll

    4. **动画处理**:Imagick还可以处理GIF动画,通过`readImages()` 加载多帧,然后用`animateImages()` 播放。 总的来说,PHP Imagick扩展提供了强大的图像处理能力,无论是基本的尺寸调整、水印添加,还是复杂的...

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

    - Imagick能够处理GIF动画,你可以使用`readImages()`方法读取整个动画,并通过`animateImages()`方法播放。以下是一个简单的例子: ```php $imagick = new Imagick(); $imagick-&gt;readImages('animation.gif')...

    Go-imagick-Go绑定至ImageMagick的MagickWandCAPI

    `MagickWand`提供了许多方法用于图像处理,如`ResizeImage`(调整大小)、`RotateImage`(旋转)、`CropImage`(裁剪)等。例如,旋转90度: ```go degrees := imagick.NewPixelWand() degrees.SetColor("white...

    php_imagick.dll For PHP 5.2

    php_imagick扩展还提供了许多高级功能,如颜色空间转换、图像滤波、添加文本水印、读取和写入多帧图像(如GIF动画)等。这些功能使得开发者能够灵活地处理图像,满足各种复杂的业务需求。 总结起来,...

    imagick-3.0.1.tgz

    安装和使用Imagick扩展通常涉及以下步骤: 1. **解压**:首先,你需要使用命令行工具(如Linux的`tar`或Windows的7-Zip)解压缩文件,将其内容释放到一个工作目录。 2. **配置**:进入解压后的目录,运行配置脚本...

    imagick-3.5.1.tgz

    在了解如何使用这个安装包之前,我们先来深入了解一下Imagick的核心功能。Imagick是基于ImageMagick库的,ImageMagick是一个跨平台的开源图像处理软件,支持超过200种图像文件格式,如JPEG、PNG、GIF、TIFF等。...

    imagick-2.3.0.tgz

    使用ImageMagick和imagick扩展时,需要注意以下几点: 1. **系统依赖**:确保系统已经安装了ImageMagick库,因为PHP的imagick扩展是基于此库构建的。通常在Linux系统中,可以使用`apt-get`或`yum`命令来安装。 2. ...

Global site tag (gtag.js) - Google Analytics