PHP kullanarak küçük üretmek kötü görüntü kalitesine neden olur

3 Cevap php
$sourcePath = 'images/'; // Path of original image
$sourceUrl = '';
$sourceName = 'photo1.jpg'; // Name of original image
$thumbPath = 'thumbs/'; // Writeable thumb path
$thumbUrl = 'thumbs/';
$thumbName = "test_thumb.jpg"; // Tip: Name dynamically
$thumbWidth = 100; // Intended dimension of thumb

// Beyond this point is simply code.
$sourceImage = imagecreatefromjpeg("$sourcePath/$sourceName");
$sourceWidth = imagesx($sourceImage);
$sourceHeight = imagesy($sourceImage);

$targetImage = imagecreate($thumbWidth,$thumbWidth);
imagecopyresized($targetImage,$sourceImage,0,0,0,0,$thumbWidth,$thumbWidth,imagesx($sourceImage),imagesy($sourceImage));
imagejpeg($targetImage, "$thumbPath/$thumbName");

// By now, the thumbnail is copied into the $thumbpath
// as the file name specified in $thumbName, so display
echo "<img src='$thumbUrl$thumbName' alt=''>";

Yukarıdaki kod bana bir resmini verir ve bu harika, ama görüntü kalitesi çok kötü. Görüntü renkler ters olmuştur ve ezilmiş oldu gibi görünüyor gibi görünüyor. Bunu yaparken bütün gün baş ağrısı yaşadım. Herhangi biri herhangi bir fikirleri var mı?

3 Cevap

imagecreatetruecolor yerine imagecreate ve imagecopyresampled yerine imagecopyresized arasında kullanın.

Üçüncü parametre Dominic işaret olarak dahil değer. Bu jpeg kalitesini belirler.

"O ezilmiş olmuştur ve öyle görünüyor" konusunda, size kendisi veya kare olmayabilir bir kaynak görüntüden bir kare resmini yapıyoruz, hatırlıyorum.

Bunu aşmanın tek yolu, kaynağından kopyalamak için kare (görüntü dikey veya yatay olmasına bağlı olarak) tam bir genişlik veya yüksekliğini tam olarak çalışmak için kaynak boyutları ile çalışmaktır. Bu dinamik olarak hesaplanan bir şey ile imagecopyresized için argümanlar "0,0,0,0" () yerine gelir.

(EDIT: örnek)

function makeSquareThumb($srcImage, $destSize, $destImage = null)
{
//I'm sure there's a better way than this, but it works...
//I don't like my folder and file checking in the middle, but need to illustrate the need for this.	

$srcFolder = dirname($srcImage); //source folder
$srcName = basename($srcImage); //original image filename

//the IF ELSEIF ELSE below is NOT comprehensive - eg: what if the dest folder is the same as the source?
//writeable nature of the destination is not checked!
if(!destImage)
	{
	$destFolder = $srcFolder.'/thumbs/';
	if(!is_dir($destFolder))
		{
		//make the thumbs folder if there isn't one!
		mkdir($destFolder);
		}
	$destImage = $destFolder.$srcName;
	}
elseif(is_dir($destImage))
	{
	$destFolder = $destImage;
	$destImage = $destFolder.'/'.$srcName;
	}
else
	{
	$destFolder = dirname($destImage);
	}


//Now make it!
$srcCanvas = imagecreatefromjpeg($srcImage);
$srcWidth = imagesx($srcCanvas);
$srcHeight = imagesy($srcCanvas);

//this let's us easily sample a square from the middle, regardless of apsect ratio.
$shortSide = array($srcWidth,$srcHeight);
sort($shortSide);

$src_x = $srcWidth/2 - $shortSide[0]/2;
$src_y = $srcHeight/2 - $shortSide[0]/2;

//do it!
$destCanvas = imagecreatetruecolor($destSize, $destSize);
imagecopyresampled($destCanvas,$srcCanvas,0,0,$src_x,$src_y,$destSize,$destSize,$shortSide[0],$shortSide[0]);
imagejpeg($destCanvas, $destImage);
}

Deneyin:

imagejpeg($targetImage, "$thumbPath/$thumbName", 100);