亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2466 | 回復(fù): 0
打印 上一主題 下一主題

使用Imagick來”resize” 和 “crop” GIF動畫 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2009-08-20 22:51 |只看該作者 |倒序瀏覽

對GIF動畫進行縮小操作時,需要逐幀的縮小,這里會碰到幾個比較麻煩的問題:
1、透明動畫的問題
2、幀圖片比顯示尺寸小,并且有坐標控制的問題,直接縮小會似的動畫完全亂掉
針對第一個問題,首先要建立一個透明的目標圖片對象
$image = new Imagick();
$image->newImage($width,$height, $color, ‘gif’);
其中 $color = new ImagickPixel(”transparent”); 實際上是建立了一個透明色。
針對第二個問題,一開始我也是循環(huán)了GIF中每個圖片對象,發(fā)現(xiàn)尺寸大小不一樣,看API手冊里只有 getImageWidth 和getImageHeight 這兩個方法是和尺寸有關(guān)的,而沒有關(guān)于獲得坐標 position 的方法;只能一個一個的試,最后發(fā)現(xiàn)是用 getImagePage 獲得的一個數(shù)組,里面包含了 width, height, x, y 這4個字段,其中width和height分別是圖象的顯示尺寸,并非圖象的尺寸,而圖象的尺寸是用getImageWidth和getImageHeight來獲得,可能比圖象的顯示尺寸小;還有兩個數(shù)據(jù) x和y 分別是當前圖象在顯示區(qū)域內(nèi)的坐標;不知道這個 Image Page 如何翻譯,也許應(yīng)該是層的概念;這個時候就可以計算出幀圖片正確的顯示內(nèi)容。
這里給出ImagickResizeImage函數(shù)

?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);
//確定使用對應(yīng)尺寸的水印圖片
$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();
}
}
?>


本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u3/103498/showart_2033258.html
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP