2009-12-04 59 views
2

我想爲我的網站創建一個圖片庫,並從網站的管理面板上傳這些圖片。我將在一個非常小的頁面中顯示所有圖片,並且將爲每張圖片分隔一個位置,以顯示大尺寸的所選圖片(來自小圖片)。創建圖片庫

我知道這樣做的方法有兩種:

  1. 我創建2張圖片,從管理面板,一大一小,一個固定大小的上傳。因此,我將在單獨的大空間中加載大個子。小的將在小地方顯示。所以該網站的管理員應該創建2張照片。

  2. 我知道的第二種方法是使用PHP的GD庫來只能上傳大圖片,並且在每個地方PHP函數都會調整大圖的大小,並獲得我需要的2種尺寸畫廊。

第一種方法的缺點是,網站的用戶在上傳之前應該使用Photoshop或其他工具。讓我們同意這對網站用戶來說不是一件愉快的事情。

第二種方法也不好,因爲GD通過降低質量調整圖片大小。而這種損失是不可接受的,因爲它太多了。

什麼是在保持接近原始圖片質量的同時調整大小的操作?

還有什麼是另一種更好的方法呢?

+4

你已經在這個問題上提出了一個獎勵,但沒有評論這裏的任何答案,他們有什麼問題,你到底需要什麼? – 2009-12-07 17:19:13

+0

我想要更多變體的答案能夠爲我選擇更好的答案,因爲我不認爲這些答案令人滿意。 – Narek 2009-12-12 17:19:19

回答

2

使用下面的函數是這樣的:

Image('/path/to/original.image', '1/1', '150*', './thumb.jpg'); // thumb, width = 150 px 
Image('/path/to/original.image', null, '600*', './full.jpg'); // full, width = 600 px 

您可以指定通過第二個參數的作物比(W/H),如果你願意,你也可以指定大小的寬度和/或高度圖像通過第三個參數(w * h)。

function Image($source, $crop = null, $scale = null, $destination = null) 
{ 
    $source = @ImageCreateFromString(@file_get_contents($source)); 

    if (is_resource($source) === true) 
    { 
     $size = array(ImageSX($source), ImageSY($source)); 

     if (isset($crop) === true) 
     { 
      $crop = array_filter(explode('/', $crop), 'is_numeric'); 

      if (count($crop) == 2) 
      { 
       $crop = array($size[0]/$size[1], $crop[0]/$crop[1]); 

       if ($crop[0] > $crop[1]) 
       { 
        $size[0] = $size[1] * $crop[1]; 
       } 

       else if ($crop[0] < $crop[1]) 
       { 
        $size[1] = $size[0]/$crop[1]; 
       } 

       $crop = array(ImageSX($source) - $size[0], ImageSY($source) - $size[1]); 
      } 

      else 
      { 
       $crop = array(0, 0); 
      } 
     } 

     else 
     { 
      $crop = array(0, 0); 
     } 

     if (isset($scale) === true) 
     { 
      $scale = array_filter(explode('*', $scale), 'is_numeric'); 

      if (count($scale) >= 1) 
      { 
       if (empty($scale[0]) === true) 
       { 
        $scale[0] = $scale[1] * $size[0]/$size[1]; 
       } 

       else if (empty($scale[1]) === true) 
       { 
        $scale[1] = $scale[0] * $size[1]/$size[0]; 
       } 
      } 

      else 
      { 
       $scale = array($size[0], $size[1]); 
      } 
     } 

     else 
     { 
      $scale = array($size[0], $size[1]); 
     } 

     $result = ImageCreateTrueColor($scale[0], $scale[1]); 

     if (is_resource($result) === true) 
     { 
      ImageFill($result, 0, 0, IMG_COLOR_TRANSPARENT); 
      ImageSaveAlpha($result, true); 
      ImageAlphaBlending($result, true); 

      if (ImageCopyResampled($result, $source, 0, 0, $crop[0]/2, $crop[1]/2, $scale[0], $scale[1], $size[0], $size[1]) === true) 
      { 
       ImageConvolution($result, array(array(-1, -1, -1), array(-1, 16, -1), array(-1, -1, -1)), 8, 0); 
       ImageJPEG($result, $destination, 90); 
      } 
     } 
    } 

    return false; 
} 

的圖像被自動地增強(銳化)並保存爲具有高質量的JPEG。

享受!

6

GD不會比Photoshop損失任何質量。只要確保你使用的是imagecopyresampled()而不是imagecopyresized(),因爲它不會進行任何類型的重採樣。然後以足夠高的質量保存生成的圖像;對於JPEG,大約80.

然後在Photoshop中做類似的調整大小,你會發現沒有太大的區別。你也可以使用GD來銳化你的縮略圖,這會給他們一點額外的清脆感。

編輯

我做了一個工具來比較不同的大小調整方法,嘗試一下,看看自己什麼是最好的方法:http://www.ulmanen.fi/stuff/downsample/

+0

我使用這種方法,80的JPG壓縮效果很好。 – Jessedc 2009-12-04 09:52:13

+0

我不同意,GD不會失去質量。即使我用100%質量的imagecopyresampled()編程,即使Microsoft Picture Manager也比GD更好地處理圖片。 – Narek 2009-12-12 17:21:42

+1

@Narek:我也不認爲GD失去了質量,我注意到顏色變化略有變化。要麼你堅持使用ImageMagik或者使用ImageMagik(不確定圖像是否失去質量,但大多數人不這麼說),或者只是要求上傳者使用Photoshop並上傳3個獨立的圖像。這裏沒有黃金解決方案。 – 2009-12-12 18:22:22

1

如何輸出時使用的imagejpeg質量參數的圖片?

2

您可以使用ImageMagick而不是GD來獲得更好的結果。我不確定您的網站需要與您的網站進行什麼級別的集成,但我建議在開始編碼之前檢查開源Gallery項目。

2

爲什麼不使用phpThumb()

  • 您只需要爲圖像標籤生成src鏈接。
  • 自動緩存。
  • 提供了很多操作圖像的選項。請參閱demo頁面。
  • 用途ImageMagick和作爲後備GD,你不必關心(但你可以)。
  • 幾乎所有的東西都可以配置。見:phpThumb.config.php
+0

phpThumb是相當不錯的,你也可以輕鬆地將轉換的副本保存在緩存中,這樣你就不必在每次加載時調整大小 – Tom 2009-12-10 07:22:14

1

我用這個簡單的shell腳本,它需要從ImageMagick的轉換上創建縮略圖:

#!/bin/sh 

W=256 
T="Some recent photos" 

cat <<EOF 
<HTML> 
<HEAD> 
<TITLE>$T</TITLE> 
<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=iso-8859-1"> 
</HEAD> 
<BODY STYLE="font-family: sans-serif"> 
<H1>$T</H1> 
Click on the photos to enlarge<P> 
EOF 

for i 
do 
convert -resize $W "$i" "T$i" 
cat <<EOF 
<A HREF="$i"><IMG SRC="T$i" WIDTH=$W></A> 
EOF 
done 

cat <<EOF 
</BODY></HTML> 
EOF 
+0

我寧願使用API​​ http://php.net/manual/en /book.imagick.php – 2009-12-12 18:37:23

0

如果您對圖像的存儲位置沒有挑剔,可以使用Flickr PHP API。由於flickr提供了各種尺寸的圖像,因此您可以爲圖庫製作佈局。

退房http://phpflickr.com/

我用這個一個項目,並在是多麼容易感到驚訝。基本上,您可以通過該API執行每項操作,並且您也可以爲多個用戶執行此操作,因此您可以爲自己和其他人節省大量時間。而且更不用說太空了!)