PHP yeniden boyutlandırma Akıllı yolu [kapalı]

6 Cevap php

PhpThumb yaptığı gibi birisi PHP ile yazılmış bir görüntü boyutlandırma fonksiyonu ile bana yardımcı olabilir ama bir wich bir görüntüyü yeniden boyutlandırmak için varsa merak, ama bir şekilde oldu. Ben yeni resmin genişliğini ve yüksekliğini ayarlamak Yani, eğer fonksiyon yüklenen görüntü uygun (ve boy oranını korumaya) yeni genişlik ve yükseklik gerekir.

Herhangi bir yardım takdir edilmektedir.

Teşekkür ederim.

6 Cevap

Ben bir kaç yıl önce bu yazdı ve aradığınız tam olarak ne yapar. Bu sadece genişlik ve yüksekliğini hesaplar akılda tutmak, aslında bu hesaplamaları uygulamak iMagic kendiniz aramalısınız.

/**
* ImageIntelligentResize()
* 
* @global Intelligently resizes images using a providid max width and height
* @param mixed $imagePath
* @param mixed $maxWidth
* @param mixed $maxHeight
* @param mixed $alwaysUpscale
* @return
*/
function ImageIntelligentResize( $imagePath, $maxWidth, $maxHeight, $alwaysUpscale )
{
    // garbage in, garbage out
    if ( IsNullOrEmpty($imagePath) || !is_file($imagePath) || IsNullOrEmpty($maxWidth) || IsNullOrEmpty($maxHeight) )
    {
    	return array("width"=>"", "height"=>"");
    }

    // if our thumbnail size is too big, adjust it via HTML
    $size = getimagesize($imagePath);
    $origWidth = $size[0];
    $origHeight = $size[1];

    // Check if the image we're grabbing is larger than the max width or height or if we always want it resized
    if ( $alwaysUpscale || $origWidth > $maxWidth || $origHeight > $maxHeight )
    {	
    	// it is so let's resize the image intelligently
    	// check if our image is landscape or portrait
    	if ( $origWidth > $origHeight )
    	{
    		// target image is landscape/wide (ex: 4x3)
    		$newWidth = $maxWidth;
    		$ratio = $maxWidth / $origWidth;
    		$newHeight = floor($origHeight * $ratio);
    		// make sure the image wasn't heigher than expected
    		if ($newHeight > $maxHeight)
    		{
    			// it is so limit by the height
    			$newHeight = $maxHeight;
    			$ratio = $maxHeight / $origHeight;
    			$newWidth = floor($origWidth * $ratio);
    		}
    	}
    	else
    	{
    		// target image is portrait/tall (ex: 3x4)
    		$newHeight = $maxHeight;
    		$ratio = $maxHeight / $origHeight;
    		$newWidth = floor($origWidth * $ratio);
    		// make sure the image wasn't wider than expected
    		if ($newWidth > $maxWidth)
    		{
    			// it is so limit by the width
    			$newWidth = $maxWidth;
    			$ratio = $maxWidth / $origWidth;
    			$newHeight = floor($origHeight * $ratio);
    		}
    	}
    }
    // it's not, so just use the current height and width
    else
    {
    	$newWidth = $origWidth;
    	$newHeight = $origHeight;
    }	

    return array("width"=>$newWidth, "height"=>$newHeight);
}

I OOP öğrenmeye başladığımda, i this image class Kendimi uygulama wroted.

Bu GD kullanır, ans kesinlikle geliştirilebilir, bu yardımcı olur umarım.

edit: i herhangi bir kontrol yok, bir sorun için 2 downvotes sonra, ben pastie üzerinde sınıfını koydu.

The class

The Example

Sınıf çalışıyor, ancak temelleri OOP öğrenmek için bir uygulama olduğunu unutmayın.

Ben bu Tamam, tembel kullanıcılar olacağını umuyoruz ;)

at Christmas we are all better people

  • boyutlandırma sonra kırpma yaklaşım: kaynak görüntünün en boy oranını hesaplamak ve (ya genişlik ve yükseklikte) hedef görüntünün daha büyük olacak bir ara görüntü oluşturmak için bir kısıtlama olarak kullanın - nihayet için ara görüntü kırpma Hedef boyutları.

  • kullanmak seam carving! olarak da adlandırılan "liquid rescale" in ImageMagick (ayrıca bkz there)

Eğer ImageMagick sunucu üzerinde yüklü olan güvenebilirsiniz, bu GD daha birçok özellik sunuyor.

benim anlayış, OP'ın soru yerine yeniden boyutlandırma daha yeni boyutlar hesaplama hakkında daha fazla olduğunu

@ Psyche, bu aslında basit bir aritmetik bir konudur. Bir 640x480 görüntü var ve 200x200 "kutu" içinde göstermek istediğinizi varsayalım.

$sw = 640; $sh = 480;
$dw = 200; $dh = 200;

Kutunun boy oranını bulmak, orijinal ile karşılaştırın ve yeni görüntü için yüksekliği genişliği ya hesaplamak

$sr = $sw / $sh;
$dr = $dw / $dh;
if($sr > $dr)
    $dh = round($dw / $sr);
else
    $dw = round($dh * $sr);

Bu size 200x150 verir ve bu orijinal görüntüyü büyütmek gerekiyor boyutu

I GD veya ImageMagick kullanmak istiyorsunuz. Her ikisi de büyük kütüphaneler ve daha fazlasını yapmak için.

en azından bu küçük (ve kullanışlı) olan: http://www.white-hat-web-design.co.uk/articles/php-image-resizing.php