我想为我的网站创建一个图片库,并从网站的管理面板上传这些图片。我将显示所有的图片在一页非常小的大小,我将分开一个地方,每一张图片,以显示选定的图片(从小的)与大的大小。
我知道两种方法:
第一种方法的缺点是,网站的用户在上传之前应该使用Photoshop或其他一些工具。让我们同意,这对网站用户来说不是一件愉快的事情。
第二种方法也不好,因为GD通过降低质量来调整图片的大小。这种损失是不可接受的,因为它太多了。
在保持接近原始图片质量的情况下,如何调整大小操作?
或者还有什么方法比这两种方法更好呢?
发布于 2009-12-07 10:54:19
使用如下函数:
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。。
享受吧!
发布于 2009-12-04 09:50:08
GD没有失去任何质量比Photoshop更多。只需确保您使用的是imagecopyresampled(),而不是imagecopyresized(),因为这不会进行任何类型的重采样。然后以足够高的质量保存产生的图像;对于JPEG,这大约是80。
然后在Photoshop中做一个类似的调整大小,你会发现没有太大的差别。你也可以使用GD来磨尖你的缩略图,这会给他们一些额外的脆感。
编辑
我制作了一个工具来比较不同的调整大小的方法,试着自己看看什么是最好的方法:http://www.ulmanen.fi/stuff/downsample/
发布于 2009-12-07 11:09:19
您可以使用ImageMagick而不是GD来获得更好的结果。我不确定您需要与您的网站进行多大程度的集成,但我建议您在开始编写代码之前检查开源画廊项目。
https://stackoverflow.com/questions/1845913
复制相似问题