http://www.drama.com.tw/question/cat.jpg
據我所知PHP的GD有兩種縮圖函式
imagecopyresized()跟imagecopyresampled()
一般人推薦後者,覺得resampled畫質比較好
圖片上方為resize的結果,下方為resample的結果
resize雖然畫質稍差,可是感覺比較銳利
resample畫質比較好,但是比較鬆散
輸出jpg時qulity都是100,不知道有沒有辦法取平衡
這個縮圖功能本來想學flickr取圖片中間部份擷出正方形
但我後來真的輸出後仔細看才發現flickr並不是取該圖片中間的部份
而是每張圖都有一定的比例把主題凸顯出來,不知道他們怎麼做到的
不知道是否有class可以用
可能會有人推薦imagemagick,但我爬了很多文,資質駑鈍實在不知道怎麼安裝
可以參考一下這篇教學
ImageMagick應用大全
http://blog.yogo.tw/2009/11/imagemagick.html
這太棒了,我用dll有成功,不過我想到時候的正式server應該還是要安裝在server上的
所以我後來選擇了"在 Windows 下安裝 ImageMagick"這個步驟
東西也順利安裝完成,但並沒有成功縮圖,也沒有錯誤訊息
<pre class="c" name="code"><?php
$img = 'face.jpg';
echo '<img src="' . $img . '"><br />';
$exe = 'im_convert -geometry 100 ' . $img . ' face_1.jpg';
exec($exe);
echo '<img src="face_1.jpg">';
?>
我本來以為是路徑問題
但我改絕對路徑在php一樣不行
<pre class="c" name="code">
$img = 'face.jpg';
$path = $_SERVER['DOCUMENT_ROOT'] . '/test/';
echo '<img src="' . $img . '"><br />';
$src = $path . $img;
$des = $path . 'face_1.jpg';
$exe = 'im_convert -geometry 100 ' . $src . ' ' . $des;
exec($exe);
echo '<img src="face_1.jpg">';
$exe產出來的code我直接在cmd裡面run就可以執行,所以不知道php跟imagemagick端這邊溝通出了什麼問題。
重開機就可以了,抱歉抱歉 XD
有人可以教我怎樣作到我用GD達到的function嗎?
就是先把圖不論大小撐到以短邊為基準size為120的圖片
在從這張圖片中擷取中間正方形75x75的區塊
我個人的一點點小小建議
如果步驟稍微修改
把ImageMagick當成一般的縮圖程式,不要把它與php的混合運作,這樣會比較簡單。
PS:有時候因為安裝方式的問題,而造成記憶體不足,會發生記憶使用超過 8M 的問題, 修改memory_limit的設定也無效,建議重新php,也可以由限制上傳的圖片大小來解決。
簡單的步驟應該是
1.安裝縮圖程式
2.了解縮圖程式相關指令
3.利用php執行縮圖指令
1.安裝指令
RedHat架構(CentOS、Scientific)...
yum install ImageMagick*
2.了解需要的縮圖程式指令
相關全部的縮圖指令,請參考官方網站說明文件
利用文字介面先練習指令,並了解需要的指令。
1.上傳一張圖片,命名為:aaa.jpg
2.1.練習圖片轉換指令,將aaa.jpg轉換為aaa.png
<pre class="c" name="code">convert aaa.jpg aaa.png
2.2.練習縮圖指令,建立aaa.png的縮圖resize.png
<pre class="c" name="code">convert -sample 100x100 aaa.jpg resize.jpg
2.3.還有一堆功能強大的相關指令及相關參數,請自行練習。
3.與php結合
<pre class="c" name="code">
<SCRIPT LANGUAGE="php">
$FileJPG = "aaa.jpg";
$FilePNG = "aaa.png";
$commmand = "convert"; -- 最好加上路徑名稱,可利用find / -name convert 來找出
--將
$todo=shell_exec($commmand.' '.$FileJPG.' '.$FilePNG);
</SCRIPT>
要做到Flickr那樣的功能,需要了解不少影像處理、尤其是影像辨識/特徵辨識這一方面的原理,也許可以找一找書,或是到google上找一找有沒有比較容易的做法。另外也許可以到phpclass上面找找。(不過我大概都不會)
有一個簡單的邊界偵測方法,是把圖形先做灰階(或是分別對RGB做處理),然後做像素位移,再把兩個像素陣列相減。最近在做一些簡單的GUI的東西,我用php寫了一個小程式把圖形轉成C的陣列原始碼,剛好就把這個程式稍微改一下做簡單的測試:
<pre class="c" name="code">
#!/usr/bin/php
<?php
if ($_SERVER['argc']==2) {
$offset = 1;
$filter = 80;
$file = $_SERVER['argv'][1];
$varname = substr($file,0,strlen($file)-4);
if (file_exists($file)) {
$im = imagecreatefromjpeg($file);
$width = imagesx($im);
$height = imagesy($im);
$im2 = imagecreatetruecolor($width,$height);
$arr1 = array();
for ($y=0; $y < $height ; $y++) {
for ($x=0; $x < $width; $x++) {
$rgb = imagecolorat($im, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$gray = intval(0.3*$r+0.59*$g+0.11*$b);
if($offset<=($height-$y-1) && $offset<=($width-$x-1)) {
$rgb = imagecolorat($im, $x+$offset, $y+$offset);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$gray -= intval(0.3*$r+0.59*$g+0.11*$b);
}
$color1 = imagecolorallocate($im2,0,0,0);
$color2 = imagecolorallocate($im2,255,255,255);
if ( abs($gray) > $filter ) {
imageline($im2,$x,$y,$x,$y,$color1);
$arr1[$x][$y] = 1;
} else {
imageline($im2,$x,$y,$x,$y,$color2);
$arr1[$x][$y] = 0;
}
}
}
imagepng($im2,"test.png",0);
} else {
// echo ("file no exists.\n");
}
}
?>
例如這張相片:處理過後就變成:(可能需要調整$offset跟$filter兩個變數來產生更好的結果)。我是在Linux底下跑,所以程式可能需要做一些調整。
偵測出邊界後,就有機會做進一步的處理。(這樣還遠不足以做出你要的東西,但可以當作開始)