【问题标题】:Creating picture gallery创建图片库
【发布时间】:2010-12-23 04:29:24
【问题描述】:

我想为我的网站创建一个图片库,并从网站的管理面板上传这些图片。我将在一个页面中以非常小的尺寸显示所有图片,并且我将为每张图片分隔一个位置以显示所选的大尺寸图片(从小图片中)。

我知道这样做的两种方法:

  1. 我创建了 2 张图片用于从管理面板上传,一张大一张固定大小的小图片。所以我将在单独的大空间中加载大的。而小的会在小地方显示。所以网站管理员应该创建 2 张图片。

  2. 我知道的第二种方法是使用 PHP 的 GD 库能够只上传大图,并且在每个地方都有一个 PHP 函数会调整大图的大小并获得我需要的 2 个大小画廊。

第一种方法的缺点是,网站的用户在上传之前应该使用 Photoshop 或其他工具。让我们同意这对网站用户来说不是一件愉快的事情。

第二种方法也不好,因为GD通过降低质量来调整图片大小。而且这种损失是不可接受的,因为它太多了。

在保持接近原始图片质量的同时进行调整大小操作的方法是什么?

或者还有什么比这两个更好的方法?

【问题讨论】:

  • 您在这个问题上投入了大量资金,但没有对这里的任何答案发表评论,他们有什么问题以及您到底需要什么?
  • 我希望更多的答案变体能够为我选择更好的答案,因为我认为这些答案并不令人满意。

标签: php javascript web-applications web


【解决方案1】:

您可以使用ImageMagick 而不是GD 以获得可能更好的结果。我不确定您需要与您的网站进行何种级别的集成,但我建议您在开始编码之前检查开源 Gallery 项目。

【讨论】:

    【解决方案2】:

    为什么不使用phpThumb()

    • 你只需要为你的图片标签生成src-links。
    • 自动缓存。
    • 提供了许多处理图像的选项。请参阅demo 页面。
    • 使用ImageMagick 和备用GD,您不必关心(但您可以)。
    • 几乎所有东西都可以配置。请参阅:phpThumb.config.php

    【讨论】:

    • phpThumb 非常好,您还可以轻松地将转换的副本保存在缓存中,这样您就不必在每次加载时调整大小
    【解决方案3】:

    如果您对图像的存储位置不挑剔,可以使用 Flickr PHP API。由于 flickr 提供了各种尺寸的图像,因此您可以自行设计图库的布局。

    查看http://phpflickr.com/

    我已经将它用于一个项目,并且对它的简单性感到惊讶。您基本上可以通过该 API 完成所有操作,并且您也可以为多个用户执行此操作,因此您将为自己和他人节省大量时间。更不用说空间了!-)

    【讨论】:

      【解决方案4】:

      GD 不会比 Photoshop 更损失质量。只要确保您使用的是imagecopyresampled() 而不是imagecopyresized(),因为它不会进行任何类型的重采样。然后以足够高的质量保存生成的图像;对于 JPEG,大约是 80。

      然后在 Photoshop 中进行类似的调整大小,您会发现差别不大。您还可以使用 GD 来锐化缩略图,这会让它们更加清晰。

      编辑

      我做了一个工具来比较不同的调整大小的方法,你自己试试看什么是最好的方法:http://www.ulmanen.fi/stuff/downsample/

      【讨论】:

      • 我不同意,GD 不会失去质量。即使是 Microsoft 图片管理器在处理图片方面也比 GD 好,即使我使用 100% 质量的 imagecopyresampled() 进行编程。
      • @Narek:我也不认为 GD 质量下降,我注意到颜色变化略有变化。您要么坚持这一点,要么使用 ImageMagik(不确定图像是否会丢失质量,但大多数人说不会),或者您只是要求您的上传者使用 Photoshop 并上传 3 张单独的图像。这里没有黄金解决方案。
      • +,非常漂亮的展示 =) 大图会更好,这张图也很不错,可以看到细微的差异upload.wikimedia.org/wikipedia/commons/c/ce/…
      • @Alix,重点是展示缩小算法之间的差异(或缺乏),这就是小图像的原因。
      【解决方案5】:

      我使用这个简单的 shell 脚本,它需要 ImageMagick 的 convert

      #!/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
      

      【讨论】:

        【解决方案6】:

        我会使用一个文件上传,然后使用 ImageMagick 在服务器上创建缩略图 (http://www.imagemagick.org/script/index.php)

        【讨论】:

          【解决方案7】:

          像这样使用以下函数:

          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。

          享受吧!

          【讨论】:

            【解决方案8】:

            在输出图像时使用imagejpeg 的质量参数怎么样?

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多