首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建图片库

创建图片库
EN

Stack Overflow用户
提问于 2009-12-04 09:45:22
回答 8查看 703关注 0票数 2

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

我知道两种方法:

  1. 我创建了两个图片,从管理面板上传,一个大的和一个小的固定大小。所以我会把大的放在单独的大空间里。小的地方就会显示出来。因此,网站管理员应该创建2张图片。
  2. 我所知道的第二种方法是使用PHP的GD库只能上传大图片,在每个地方,一个PHP函数将调整大图片的大小,并得到我所需的两个大小的图库。

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

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

在保持接近原始图片质量的情况下,如何调整大小操作?

或者还有什么方法比这两种方法更好呢?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-12-07 10:54:19

使用如下函数:

代码语言:javascript
复制
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)指定调整大小的图像的宽度和/或高度。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2009-12-04 09:50:08

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

然后在Photoshop中做一个类似的调整大小,你会发现没有太大的差别。你也可以使用GD来磨尖你的缩略图,这会给他们一些额外的脆感。

编辑

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

票数 6
EN

Stack Overflow用户

发布于 2009-12-07 11:09:19

您可以使用ImageMagick而不是GD来获得更好的结果。我不确定您需要与您的网站进行多大程度的集成,但我建议您在开始编写代码之前检查开源画廊项目。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1845913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档