【发布时间】:2010-02-26 23:56:46
【问题描述】:
我有一个 php 脚本,它保存原始图像,然后调整它的大小 - 一个缩略图和一个更大的图像用于网络查看。这很好用,除了一些图像质量很差。它似乎是用一个非常低的颜色托盘保存的。您可以在http://kalpaitch.com/index.php?filter=white 看到结果 - 点击标题为“white white white”的第一个缩略图
以下是用于图像重采样的代码:
function resizeImg($name, $extension, $size1, $size2) {
if (preg_match('/jpg|jpeg|JPG|JPEG/',$extension)){
$image = imagecreatefromjpeg($name);
}
if (preg_match('/gif|GIF/',$extension)){
$image = imagecreatefromgif($name);
}
$old_width = imageSX($image);
$old_height = imageSY($image);
$old_aspect_ratio = $old_width/$old_height;
if($size2 == 0){
$new_aspect_ratio = $old_aspect_ratio;
if($old_width > $old_height){
$new_width = $size1;
$new_height = $new_width / $old_aspect_ratio;
} else {
$new_height = $size1;
$new_width = $new_height * $old_aspect_ratio;
}
} elseif($size2 > 0){
$new_aspect_ratio = $size1/$size2;
//for landscape potographs
if($old_aspect_ratio >= $new_aspect_ratio) {
$x1 = round(($old_width - ($old_width * ($new_aspect_ratio/$old_aspect_ratio)))/2);
$old_width = round($old_width * ($new_aspect_ratio/$old_aspect_ratio));
$y1 = 0;
$new_width = $size1;
$new_height = $size2;
//for portrait photographs
} else{
$x1 = 0;
$y1 = 0;
$old_height = round($old_width/$new_aspect_ratio);
$new_width = $size1;
$new_height = $size2;
}
}
$new_image = imagecreatetruecolor($new_width, $new_height);
imagecopyresampled($new_image, $image, 0, 0, $x1, $y1, $new_width, $new_height, $old_width, $old_height);
return $new_image;
非常感谢
附: [从服务器中删除的照片]
这里是其余的上传代码:
// Move the original to the right place
$result = @move_uploaded_file($image['tmp_name'], $origlocation);
// Resize the image and save the thumbnail
$new_image = resizeImg($origlocation, $extension, 500, 0);
if (preg_match("/gif/",$extension)){
imagegif($new_image, $normallocation);
} else {
imagejpeg($new_image, $normallocation);
}
// Resize the image and save the thumbnail
$new_image = resizeImg($origlocation, $extension, 190, 120);
if (preg_match("/gif/",$extension)){
imagegif($new_image, $thumblocation);
} else {
imagejpeg($new_image, $thumblocation);
}
【问题讨论】:
-
你能展示一个前后的例子吗?
-
我不是 100% 清楚,但听起来你得到的一些图像有一定的大小,你的脚本实际上调整它的大小比原来更大?如果你这样做,质量会很糟糕。
-
如果只给定一种尺寸,脚本不会按比例调整图像大小。如果给定两个尺寸,它将调整大小并裁剪其余的而不改变纵横比。重采样图像的分辨率总是比原始图像低得多。上图不是原图,都是一样的分辨率,但是之前是用photoshop保存的,后一张是用我的脚本保存的。
-
脚本的其余部分在哪里?它可能是您正在使用的图像输出功能。尝试使用 imagepng() 输出图像并将压缩质量设置为“0”以进行测试。 us2.php.net/manual/en/function.imagepng.php
-
我做了一个快速测试,但 imagepng() 似乎并没有太大的不同。好吧,真的没有。但我发布了脚本的另一半,仅供参考。