对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();
}
}
?>
分享到:
相关推荐
ImageMagick是一个跨平台的开源软件,支持多种图像格式,如JPEG、PNG、GIF、BMP等,并能执行各种图像处理任务,包括缩放、旋转、裁剪、颜色校正、添加水印等。 1. **基本概念** - Imagick类:Imagick是PHP的扩展,...
在这个系统中,PHP接收到图片后,可以使用GD库或者Imagick扩展进行图像处理,比如切割和缩放。GD库是PHP内建的图像处理库,支持JPEG、PNG、GIF等多种格式,可以轻松完成图片尺寸调整、裁剪等操作。Imagick则提供了更...
在处理动态GIF时,Imagick可以处理每一帧,并确保处理结果正确无误。 描述中提到的“骨头系统开发的图像库的 imagick 部分”,暗示存在一个自定义的PHP类库,用于封装Imagick的功能。这个库特别强调了对GIF的支持,...
- **读取和写入图像**:通过Imagick对象的readImage()方法,可以读取各种格式的图像文件,如JPEG、PNG、GIF等。writeImage()方法则用于将处理后的图像保存到文件。 - **图像调整**:可以使用resizeImage()、...
Imagick是基于ImageMagick库的,ImageMagick是一个跨平台的开源图像处理软件,支持超过200种图像文件格式,如JPEG、PNG、GIF、TIFF等。Imagick库提供了超过1200个不同的命令,用于执行各种图像操作,包括但不限于: ...
一旦安装成功,你可以开始使用Imagick类进行图像处理。以下是一些基本操作: ```php $imagick = new \Imagick(); $imagick->readImage('image.jpg'); $imagick->resizeImage(800, 0, \Imagick::FILTER_LANCZOS, 1)...
2. `imagick-3.0.1`: 这个目录很可能是Imagick 3.0.1版本的源代码存放处,其中可能包括头文件、源代码文件、Makefile或者CMakeLists.txt这样的构建脚本,以及可能的测试案例和其他文档。 安装和使用Imagick扩展通常...
这个扩展使得开发者能够使用超过200种图像处理方法,包括创建、编辑和合成图像,支持多种图像格式如JPEG、PNG、GIF等。 Imagick库是基于ImageMagick,一个开源的跨平台命令行工具套件,用于在多种格式之间转换和...
PHP有强大的图像处理库GD和Imagick,可以实现图片的缩放、剪切、裁剪、旋转、水印添加等多种功能。PHP处理后的图片可以存储在服务器上,或者直接作为HTTP响应的一部分发送回客户端。 至于JSP(JavaServer Pages),...
安装和配置Imagick扩展时,需要确保这些DLL文件位于系统的PATH环境变量所包含的目录下,或者与PHP可执行文件放在一起,以确保PHP能够正确加载和使用它们。在Windows上,通常会将这些文件放在PHP的extension目录下,...
php_imagick扩展还提供了许多高级功能,如颜色空间转换、图像滤波、添加文本水印、读取和写入多帧图像(如GIF动画)等。这些功能使得开发者能够灵活地处理图像,满足各种复杂的业务需求。 总结起来,...
《PHP Imagick扩展在PHP 5.3环境下的应用与详解》 PHP Imagick扩展是PHP语言中用于处理图像的强大工具,它提供了对ImageMagick库的接口,...正确安装和合理使用Imagick,能够提升图像处理效率,满足多样化的项目需求。
- Imagick能够处理GIF动画,你可以使用`readImages()`方法读取整个动画,并通过`animateImages()`方法播放。以下是一个简单的例子: ```php $imagick = new Imagick(); $imagick->readImages('animation.gif')...
4. **颜色与通道处理**:Imagick支持对图像的颜色通道进行操作,比如提取特定颜色通道,或者对颜色进行替换。`colorizeImage()`可以将图像着色,`floodfillPaintImage()`则用于填充指定颜色。 5. **文字与注释**:...
它支持超过200种图像文件格式,如JPEG、PNG、GIF、TIFF等。 - PHP Imagick扩展是PHP与ImageMagick之间的桥梁,允许PHP脚本直接调用ImageMagick的功能。 2. **安装与配置** - 在64位系统上安装PHP Imagick,首先...
Imagick是一款强大的图像处理库,它为PHP提供了一个接口,可以用来处理各种图像操作,如裁剪、缩放、旋转、颜色调整等。在PHP环境中配置Imagick,特别是对于64位系统且需要Thread Safety(TS)支持的版本,有一些...
ImageMagick是一个强大的开源跨平台图像处理库,它支持多种图像格式,并提供了丰富的API供开发者在各种编程语言中调用,如PHP中的imagick扩展。这个"imagick-2.3.0.tgz"文件正是PHP与ImageMagick交互的重要桥梁,它...
2. **imagick-3.1.2**:这可能是源代码文件、编译后的二进制文件,或者是安装包。具体用途取决于文件类型,如果是源代码,需要编译才能在系统上使用;如果是二进制文件,可以直接安装到PHP环境中。 使用Imagick前,...
首先要实现PHP使用php_imagick_st-Q8.dll类库,把JPG图片连接生成GIF动画图片,需要事先下载好php_imagick_st-Q8.dll动态链接库文件,并配置php.ini文件,启用php_imagick_st-Q8.dll。 二、配置方法如下: 1、将下载...