- 浏览: 230432 次
- 性别:
- 来自: 西安
-
文章分类
- 全部博客 (143)
- java (13)
- mongodb (15)
- linux (31)
- mysql (2)
- cache (1)
- Android (3)
- lucene (2)
- javascript (9)
- php (13)
- 人生 (2)
- solr (7)
- 跨域iframe (1)
- 统计学 (1)
- redis (0)
- amazon aws (2)
- 国内比较便宜的vps (1)
- nginx (5)
- sns api应用 (1)
- api (1)
- postfix (1)
- nodejs (1)
- gitlab (1)
- myeclipse (1)
- matlab (3)
- ubuntu (2)
- stardict (1)
- cdn (1)
- lajp (1)
- workerman (1)
- tensorflow (1)
- 协同推荐算法 (3)
- html5 (1)
- extensions (3)
- Rome (1)
- 正则 (1)
- EBS (1)
- python (5)
- https (1)
- iptables (1)
- facebook (0)
- ImageMagick (0)
- elasticsearch (1)
- Flask (1)
- wordpress (0)
- kubernetes (0)
最新评论
-
三尺寒冰:
怎么实现排序的?分析一下
php mongodb 实现group 并按照某字段排序
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();
}
}
?>
转自: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();
}
}
?>
发表评论
-
workerman PHP socket 服务器框架
2015-12-17 14:25 887http://www.workerman.net/ wor ... -
CentOS6.5 下编译安装php-5.6.3.tar.gz
2015-09-15 15:54 2179一、安装相关依赖库 yum -y install gc ... -
php 添加mongodb扩展
2014-04-30 17:03 826PHP MongoDB 扩展安装 [root@a5139 ~] ... -
nginx添加php basic验证
2014-07-16 10:37 681几种方式: 1.命令 http://www.centos.b ... -
使用PHP 给网站 生成快照图片和缩略图
2012-06-07 10:21 2062使用PHP 给网站 生成快� ... -
HTML5 修改浏览器url而不刷新页面
2012-04-05 17:54 2319<?php if(!isset($_REQUEST['p ... -
php bmp图片格式转化png
2012-03-21 13:38 1737有gd库不支持bmp格式的图片缩放,裁剪,所以可以通过改变图片 ... -
php 截取固定图片大小
2012-03-14 18:19 24221.创建iamge处理类 <?php include_ ... -
crontab执行不了php的解决方法
2012-03-12 18:26 3654用crontab跑php程序时,如 ... -
php mongodb 实现group 并按照某字段排序
2012-02-27 17:13 7834require_once ('../Config.class. ... -
php 国际化
2012-02-16 18:47 1480PHP的gettext用法 gettext ... -
php报错启动配置
2011-10-13 13:32 2249PHP 报错信息 2008年11月22 ...
相关推荐
Imagick的使用不局限于简单的操作,还可以通过设置不同的参数来实现复杂的效果,例如在裁切和缩放时,可以根据参数的不同来控制图像的处理方式和最终效果。 最后,需要提及的是,本文中还涉及到了一个名为`imagick....
8. **动画处理**:对于GIF动画,Imagick可以方便地进行编辑和创建。 **三、性能比较** 相比于PHP内置的GD库,Imagick在功能和性能上都有明显优势。GD库虽然轻量且易于使用,但处理复杂图像和大量操作时可能效率较...
在缩放过程中,如果处理的是GIF图片,函数会调用`_resizeGif`私有方法,这个方法是专门针对GIF动画每一帧进行缩放处理的。对于非GIF图片,会使用`thumbnailImage`方法来完成缩放。 接下来,`thumbnailImage`方法...
`resize_and_crop.php`很可能是处理图片裁剪和大小调整的脚本,可能使用PHP的GD库或Imagick扩展。这个脚本接收上传的图片,进行必要的裁剪和缩放,然后保存到服务器的特定目录。 6. **doajaxfileupload.php**:这是...
CLI允许用户通过简单的命令行指令执行图像操作,例如`convert`命令可以用来进行图像转换,`composite`用于图像合成,`resize`可以调整图像大小,而`crop`则用于裁剪图像。这些命令都支持丰富的参数选项,可以实现...