创建图片库

时间:2009-12-04 09:45:22

标签: php javascript web-applications web

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

我知道两种方法:

  1. 我创建了2张图片,用于从管理面板上传,一张大图片和一张小尺寸的图片。所以我将在一个独立的大空间加载一个大的。小的地方会显示小的。因此,该网站的管理员应该创建2个图片。

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

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

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

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

    或者这两种方法的另一种方法是什么?

8 个答案:

答案 0 :(得分:6)

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

然后在Photoshop中进行类似的调整,你会发现没有太大的区别。你也可以使用GD来锐化你的缩略图,这会给它们带来一点额外的清晰度。

修改

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

答案 1 :(得分: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格式。

享受!

答案 2 :(得分:2)

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

答案 3 :(得分:2)

为什么不使用phpThumb()

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

答案 4 :(得分:1)

输出图像时如何使用imagejpeg的质量参数?

答案 5 :(得分:1)

我使用这个简单的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 :(得分:0)

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

答案 7 :(得分:0)

如果您不了解图像的存储位置,可以使用Flickr PHP API。由于flickr提供各种尺寸的图像,因此您可以为图库制作布局。

查看http://phpflickr.com/

我已经将它用于一个项目,并对它是多么容易感到惊讶。您基本上可以通过该API执行每个操作,并且您也可以为多个用户执行此操作,因此您将节省自己和其他人的大量时间。更别提空间! - )