iT邦幫忙

0

PHP 縮圖問題

php
chan15 2009-12-17 13:05:3614588 瀏覽
  • 分享至 

  • xImage

http://www.drama.com.tw/question/cat.jpg
據我所知PHP的GD有兩種縮圖函式
imagecopyresized()跟imagecopyresampled()
一般人推薦後者,覺得resampled畫質比較好
圖片上方為resize的結果,下方為resample的結果
resize雖然畫質稍差,可是感覺比較銳利
resample畫質比較好,但是比較鬆散
輸出jpg時qulity都是100,不知道有沒有辦法取平衡

這個縮圖功能本來想學flickr取圖片中間部份擷出正方形
但我後來真的輸出後仔細看才發現flickr並不是取該圖片中間的部份
而是每張圖都有一定的比例把主題凸顯出來,不知道他們怎麼做到的
不知道是否有class可以用

可能會有人推薦imagemagick,但我爬了很多文,資質駑鈍實在不知道怎麼安裝

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
6
yogo
iT邦新手 3 級 ‧ 2009-12-21 16:43:56
最佳解答

可以參考一下這篇教學

ImageMagick應用大全
http://blog.yogo.tw/2009/11/imagemagick.html

看更多先前的回應...收起先前的回應...
chan15 iT邦新手 2 級 ‧ 2009-12-21 17:47:34 檢舉

這太棒了,我用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">';
?>
chan15 iT邦新手 2 級 ‧ 2009-12-21 17:59:05 檢舉

我本來以為是路徑問題
但我改絕對路徑在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端這邊溝通出了什麼問題。

chan15 iT邦新手 2 級 ‧ 2009-12-21 18:09:36 檢舉

重開機就可以了,抱歉抱歉 XD

chan15 iT邦新手 2 級 ‧ 2009-12-21 18:11:42 檢舉

有人可以教我怎樣作到我用GD達到的function嗎?
就是先把圖不論大小撐到以短邊為基準size為120的圖片
在從這張圖片中擷取中間正方形75x75的區塊

12
saiue
iT邦研究生 1 級 ‧ 2009-12-18 11:08:55

我個人的一點點小小建議

如果步驟稍微修改
把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>
chan15 iT邦新手 2 級 ‧ 2009-12-18 13:46:54 檢舉

我也很想try imagemagick,可是我不會安裝
我的工作環境是Windows + Appserv
Linux我也不會,因為客戶幾乎都租用Server
會有相關的服務人員幫我們設定好,所以我沒接觸這一塊
安裝Appserv也只是模擬環境增加coding速度而已

10
fillano
iT邦超人 1 級 ‧ 2009-12-18 15:37:35

要做到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底下跑,所以程式可能需要做一些調整。

偵測出邊界後,就有機會做進一步的處理。(這樣還遠不足以做出你要的東西,但可以當作開始)

chan15 iT邦新手 2 級 ‧ 2009-12-18 19:56:25 檢舉

多謝fillano大哥提供的資訊
我想可能的話不知道可否幫我看一下解析度的問題

fillano iT邦超人 1 級 ‧ 2009-12-18 22:24:27 檢舉

方法恐怕不多,他就提供這兩個函數而已...也許可以用ImageMagick試試,如果你沒辦法裝,我另外在windows編譯一個試試看好了。

我要發表回答

立即登入回答