php5 用magickwand 固定大小製作縮略圖
早期tc在做圖片上傳時,使用最早magickwand寫的縮略圖類,按照比例等比縮放。圖片不會變形,但查看圖片時會因為圖片的尺寸不一樣,窗口會忽大忽小改變。想從網上找一個現成的,發現所有的代碼幾乎都出自于一個地方,連註釋都沒有變,唯一變的就是作者,並且還是第一人稱。
花了點時間,自己寫了一個,放在這裡供參考!如果有問題歡迎指出。
- /**
- * 按照固定比率切圖
- *
- * @param string $r_src_img
- * @param string $r_dest_img
- * @param int $r_dest_width
- * @param int $r_dest_height
- * @param float $r_rate
- *
- * @return bool
- */
- public function zoomImageFixed($r_src_img,$r_dest_img,$r_dest_width = 480,$r_dest_height = 360,$r_rate = 0.8)
- {
- // 對原始圖片壓縮50%
- $_rate_img = self::cutThumbImage($r_src_img,$r_rate);
- if (MagickWriteImage($_rate_img,$r_dest_img)) {
- // 計算裁切圖片的比例
- $_dest_rate_WH = round($r_dest_width / $r_dest_height,3);
- // 原始圖片的寬高比
- $_src_width = self::getImageWidth($r_dest_img);
- $_src_height = self::getImageHeight($r_dest_img);
- $_src_rate_WH = round($_src_width / $_src_height,3);
- if ($_src_width <= $r_dest_width &amp;amp;amp;&amp;amp;amp; $_src_height <= $r_dest_height) {
- // 比縮略圖小的圖片不裁切
- $_height = $_src_height;
- $_width = $_src_width;
- $_thumb_height = $_src_height;
- $_thumb_width = $_src_width;
- $_position_X = ceil(abs($_src_width – $r_dest_width) / 2);
- $_position_Y = ceil(abs($_src_height – $r_dest_height) / 2);
- $_composite_position_X = $_position_X;
- $_composite_position_Y = $_position_Y;
- } else if ($_src_rate_WH > $_dest_rate_WH) {
- // 按照高度比切圖片寬度
- if ($_src_height <= $r_dest_height) {
- $_height = $_src_height;
- $_width = $r_dest_width;
- $_thumb_height = $_height;
- $_thumb_width = $_width;
- $_position_X = ceil(abs($_src_width – $r_dest_width) / 2);
- $_position_Y = 0;
- $_composite_position_X = 0;
- $_composite_position_Y = ceil(abs($_src_height – $r_dest_height) / 2);
- } else {
- $_rate_h = round($r_dest_height / $_src_height,3);
- // 如果高度過小,則不拉伸圖片,以空白填充
- $_height = $r_dest_height;
- $_width = $r_dest_width;
- // 縮圖
- $_thumb_height = $_height;
- $_thumb_width = ceil($_src_width * $_rate_h);
- // 裁切開始位置
- $_position_X = ceil(abs($_thumb_width – $r_dest_width) / 2);
- $_position_Y = 0;
- $_composite_position_X = 0;
- $_composite_position_Y = 0;
- }
- } else if ($_src_rate_WH < $_dest_rate_WH) {
- // 按照寬度比切圖片高度
- if ($_src_width <= $r_dest_width) {
- $_width = $_src_width;
- $_height = $r_dest_width;
- // 縮圖的寬高
- $_thumb_width = $_width;
- $_thumb_height = $_height;
- // 縮圖時使用的座標
- $_position_X = 0;
- $_position_Y = ceil(abs($_src_height – $r_dest_height) / 2);
- $_composite_position_X = ceil(abs($_src_width – $r_dest_width) / 2);
- $_composite_position_Y = 0;
- } else {
- $_rate_w = round($r_dest_width / $_src_width,3);
- $_width = $r_dest_width;
- $_height = $r_dest_height;
- // 縮圖
- $_thumb_width = $_width;
- $_thumb_height = ceil($_src_height * $_rate_w);
- // 裁切開始位置
- $_position_X = 0;
- $_position_Y = ceil(abs($_thumb_height – $r_dest_height) / 2);
- $_composite_position_X = 0;
- $_composite_position_Y = 0;
- }
- } else {
- $_width = $r_dest_width;
- $_height = $r_dest_height;
- $_thumb_height = $_src_height;
- $_thumb_width = $_src_width;
- $_position_X = 0;
- $_position_Y = 0;
- $_composite_position_X = 0;
- $_composite_position_Y = 0;
- }
- // 開始切圖
- $_obj_nmw = NewMagickWand();
- // 讀取圖片
- MagickReadImage($_obj_nmw,$r_dest_img);
- $_obj_draw = NewDrawingWand();
- $_obj_dest_nmw = NewMagickWand();
- // 先把圖片按照比例縮小
- MagickScaleImage($_obj_nmw,$_thumb_width,$_thumb_height);
- // 合成一個新的圖片
- DrawComposite($_obj_draw,MW_AddCompositeOp,$_composite_position_X,$_composite_position_Y,$_width,$_height,$_obj_nmw);
- // 添加一個設定寬高背景色的新空白圖像
- $_bg_color = ‘#FFFFFF’;
- MagickNewImage($_obj_dest_nmw,$r_dest_width,$r_dest_height,$_bg_color);
- // 上色
- MagickDrawImage($_obj_dest_nmw,$_obj_draw);
- MagickSetImageFormat($_obj_dest_nmw,MagickGetImageFormat($_obj_nmw));
- MagickSetImageCompression($_obj_dest_nmw,MW_ZipCompression);
- MagickSetImageCompressionQuality($_obj_dest_nmw,50);
- // 設置水印
- if ($r_mark) {
- $_font = ‘verdana.ttf’;
- $_obj_pdw = NewPixelWand();
- PixelSetColor($_obj_pdw,"black");
- DrawSetFont($_obj_draw,$_font);
- DrawSetFontSize($_obj_draw,12);
- DrawSetFillColor($_obj_draw,$_obj_pdw);
- DrawSetGravity($_obj_draw,MW_SouthGravity);
- MagickAnnotateImage($_obj_dest_nmw,$_obj_draw,100,15,0,’xxxxxxxxx’);
- }
- MagickWriteImage($_obj_dest_nmw,$r_dest_img);
- return true;
- }
- return;
- }
先mark一下,然後等加水印后再繼續。
忘記附上結果了,貼代碼好費事。
—————————————————–苦惱的分割線啊————————
因為是在windows下開發,使用php5.3的版本,在使用magickwand成了最大的問題,從網上找的那些dll文件根本用不了。我都想自己編譯了,可是咱火候不到,都不知道dll做啥的,如果有熱心的同學可以幫幫我么?
msn:beiwei37.5@live.com




You made fantastic nice points here. I performed a search on the issue and discovered almost all peoples will agree with your blog.
Kristopher
3 四 10 at 9:04 下午
You gave honest ideas there. I did a search on the issue and got most peoples will agree with your blog.
Alondra
4 四 10 at 9:05 上午