使用以下脚本我在前端获得过度压缩的图像。它们在服务器上显得很好,但imagesize.php似乎正在破坏最终结果。这是一个问题的视觉效果(忽略此图像上的大小差异,这是我的错误对齐)http://puu.sh/38VaP.png。有任何想法吗?这是脚本......
<?php
// Get the File path for the image
$imagedir = '../../imgs';
$imagename = $_GET["file"];
$sImagePath = "$imagedir/$imagename";
// If you want exact dimensions, you
// will pass 'width' and 'height'
$iThumbnailWidth = (int)$_GET['width'];
$iThumbnailHeight = (int)$_GET['height'];
// If you want proportional thumbnails,
// you will pass 'maxw' and 'maxh'
$iMaxWidth = (int)$_GET["maxw"];
$iMaxHeight = (int)$_GET["maxh"];
// Based on the above we can tell which
// type of resizing our script must do
if ($iMaxWidth && $iMaxHeight) $sType = 'scale';
else if ($iThumbnailWidth && $iThumbnailHeight) $sType = 'exact';
// The 'scale' type will make the image
// smaller but keep the same dimensions
// The 'exact' type will make the thumbnail
// exactly the width and height you choose
// To start off, we will create a copy
// of our original image in $img
$img = NULL;
// At this point, we need to know the
// format of the image
// Based on that, we can create a new
// image using these functions:
// - imagecreatefromjpeg
// - imagecreatefrompng
// - imagecreatefromgif
//$sExtension = strtolower(end(explode('.', $sImagePath)));
$explodedImagePath = explode('.',$sImagePath);
$sExtension = strtolower(end($explodedImagePath));
if ($sExtension == 'jpg' || $sExtension == 'jpeg') {
$img = @imagecreatefromjpeg($sImagePath)
or die("Cannot create new JPEG image");
} else if ($sExtension == 'png') {
$img = @imagecreatefrompng($sImagePath)
or die("Cannot create new PNG image");
} else if ($sExtension == 'gif') {
$img = @imagecreatefromgif($sImagePath)
or die("Cannot create new GIF image");
}
// If the image has been created, we may proceed
// to the next step
if ($img) {
// We now need to decide how to resize the image
// If we chose to scale down the image, we will
// need to get the original image propertions
$iOrigWidth = imagesx($img);
$iOrigHeight = imagesy($img);
if ($sType == 'scale') {
// Get scale ratio
$fScale = min($iMaxWidth/$iOrigWidth,
$iMaxHeight/$iOrigHeight);
// To explain how this works, say the original
// dimensions were 200x100 and our max width
// and height for a thumbnail is 50 pixels.
// We would do $iMaxWidth/$iOrigWidth
// (50/200) = 0.25
// And $iMaxHeight/$iOrigHeight
// (50/100) = 0.5
// We then use the min() function
// to find the lowest value.
// In this case, 0.25 is the lowest so that
// is our scale. The thumbnail must be
// 1/4th (0.25) of the original image
if ($fScale < 1) {
// We must only run the code below
// if the scale is lower than 1
// If it isn't, this means that
// the thumbnail we want is actually
// bigger than the original image
// Calculate the new height and width
// based on the scale
$iNewWidth = floor($fScale*$iOrigWidth);
$iNewHeight = floor($fScale*$iOrigHeight);
// Create a new temporary image using the
// imagecreatetruecolor function
$tmpimg = imagecreatetruecolor($iNewWidth,
$iNewHeight);
// The function below copies the original
// image and re-samples it into the new one
// using the new width and height
imagecopyresampled($tmpimg, $img, 0, 0, 0, 0,
$iNewWidth, $iNewHeight, $iOrigWidth, $iOrigHeight);
// Finally, we simply destroy the $img file
// which contained our original image
// so we can replace with the new thumbnail
imagedestroy($img);
$img = $tmpimg;
}
} else if ($sType == "exact") {
// Get scale ratio
$fScale = max($iThumbnailWidth/$iOrigWidth,
$iThumbnailHeight/$iOrigHeight);
// This works similarly to other one but
// rather than the lowest value, we need
// the highest. For example, if the
// dimensions were 200x100 and our thumbnail
// had to be 50x50, we would calculate:
// $iThumbnailWidth/$iOrigWidth
// (50/200) = 0.25
// And $iThumbnailHeight/$iOrigHeight
// (50/100) = 0.5
// We then use the max() function
// to find the highest value.
// In this case, 0.5 is the highest so that
// is our scale. This is the first step of
// the image manipulation. Once we scale
// the image down to 0.5, it will have the
// dimensions of 100x50. At this point,
// we will need to crop the image, leaving
// the height identical but halving
// the width to 50
if ($fScale < 1) {
// Calculate the new height and width
// based on the scale
$iNewWidth = floor($fScale*$iOrigWidth);
$iNewHeight = floor($fScale*$iOrigHeight);
// Create a new temporary image using the
// imagecreatetruecolor function
$tmpimg = imagecreatetruecolor($iNewWidth,
$iNewHeight);
$tmp2img = imagecreatetruecolor($iThumbnailWidth,
$iThumbnailHeight);
// The function below copies the original
// image and re-samples it into the new one
// using the new width and height
imagecopyresampled($tmpimg, $img, 0, 0, 0, 0,
$iNewWidth, $iNewHeight, $iOrigWidth, $iOrigHeight);
// Our $tmpimg will now have the scaled down
// image. The next step is cropping the picture to
// make sure it's exactly the size of the thumbnail
// The following logic choose how the image
// will be cropped. Using the previous example, it
// needs to take a 50x50 block from the original
// image and copy it over to the new thumbnail
// Since we want to copy the exact center of the
// scaled down image, we need to find out the x
// axis and y axis. To do so, say the scaled down
// image now has a width of 100px but we want it
// to be only 50px
// Somehow, we need to select between the 25th and
// 75th pixel to copy the middle.
// To find this value we do:
// ($iNewWidth/2)-($iThumbnailWidth/2)
// ( 100px / 2 ) - (50px / 2)
// ( 50px ) - ( 25px )
// = 25px
if ($iNewWidth == $iThumbnailWidth) {
$yAxis = ($iNewHeight/2)-
($iThumbnailHeight/2);
$xAxis = 0;
} else if ($iNewHeight == $iThumbnailHeight) {
$yAxis = 0;
$xAxis = ($iNewWidth/2)-
($iThumbnailWidth/2);
}
// We now have to resample the new image using the
// new dimensions are axis values.
imagecopyresampled($tmp2img, $tmpimg, 0, 0,
$xAxis, $yAxis,
$iThumbnailWidth,
$iThumbnailHeight,
$iThumbnailWidth,
$iThumbnailHeight);
imagedestroy($img);
imagedestroy($tmpimg);
$img = $tmp2img;
}
}
// Display the image using the header function to specify
// the type of output our page is giving
header("Content-type: image/jpeg");
imagejpeg($img);
}
?>
答案 0 :(得分:1)
您可以使用第三个参数imagejpeg
调整压缩级别。要获得最高质量(但文件大小最大),请使用:
imagejpeg($img, NULL, 100);
质量值90可能会在质量和文件大小之间达到合理的平衡。
然后,您在示例中的图片类型最好保存为PNG,imagepng
。 JPEG格式最适用于摄影图像。
答案 1 :(得分:0)
看起来你自己正在摧毁这个图像:
imagedestroy($tmpimg);
$img = $tmp2img;
... snip ...
imagejpeg($tmpimg);
您完全使用GD图像处理(包括通过imagejpeg输出)后,才能imagedestroy()
直到 AFTER 。一旦它被破坏,图像就会从内存中消失,并且句柄变量变为无效。