2009-12-04 61 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执行每项操作,并且您也可以为多个用户执行此操作,因此您可以为自己和其他人节省大量时间。而且更不用说太空了!)