PHP / GD - Kırpma ve yeniden boyutlandırma

1 Cevap php

Ben belirli bir boy oranına ve daha sonra nihayet yeniden boyutlandırır ve JPG olarak çıkaran bir görüntüyü kırpar bir işlevi kodlu ettik:

<?php

function Image($image, $crop = null, $size = null)
{
    $image = ImageCreateFromString(file_get_contents($image));

    if (is_resource($image) === true)
    {
    	$x = 0;
    	$y = 0;
    	$width = imagesx($image);
    	$height = imagesy($image);

    	/*
    	CROP (Aspect Ratio) Section
    	*/

    	if (is_null($crop) === true)
    	{
    		$crop = array($width, $height);
    	}

    	else
    	{
    		$crop = array_filter(explode(':', $crop));

    		if (empty($crop) === true)
    		{
    			$crop = array($width, $height);
    		}

    		else
    		{
    			if ((empty($crop[0]) === true) || (is_numeric($crop[0]) === false))
    			{
    				$crop[0] = $crop[1];
    			}

    			else if ((empty($crop[1]) === true) || (is_numeric($crop[1]) === false))
    			{
    				$crop[1] = $crop[0];
    			}
    		}

    		$ratio = array
    		(
    			0 => $width / $height,
    			1 => $crop[0] / $crop[1],
    		);

    		if ($ratio[0] > $ratio[1])
    		{
    			$width = $height * $ratio[1];
    			$x = (imagesx($image) - $width) / 2;
    		}

    		else if ($ratio[0] < $ratio[1])
    		{
    			$height = $width / $ratio[1];
    			$y = (imagesy($image) - $height) / 2;
    		}

    		/*
    		How can I skip (join) this operation
    		with the one in the Resize Section?
    		*/

    		$result = ImageCreateTrueColor($width, $height);

    		if (is_resource($result) === true)
    		{
    			ImageSaveAlpha($result, true);
    			ImageAlphaBlending($result, false);
    			ImageFill($result, 0, 0, ImageColorAllocateAlpha($result, 255, 255, 255, 127));

    			ImageCopyResampled($result, $image, 0, 0, $x, $y, $width, $height, $width, $height);

    			$image = $result;
    		}
    	}

    	/*
    	Resize Section
    	*/

    	if (is_null($size) === true)
    	{
    		$size = array(imagesx($image), imagesy($image));
    	}

    	else
    	{
    		$size = array_filter(explode('x', $size));

    		if (empty($size) === true)
    		{
    			$size = array(imagesx($image), imagesy($image));
    		}

    		else
    		{
    			if ((empty($size[0]) === true) || (is_numeric($size[0]) === false))
    			{
    				$size[0] = round($size[1] * imagesx($image) / imagesy($image));
    			}

    			else if ((empty($size[1]) === true) || (is_numeric($size[1]) === false))
    			{
    				$size[1] = round($size[0] * imagesy($image) / imagesx($image));
    			}
    		}
    	}

    	$result = ImageCreateTrueColor($size[0], $size[1]);

    	if (is_resource($result) === true)
    	{
    		ImageSaveAlpha($result, true);
    		ImageAlphaBlending($result, true);
    		ImageFill($result, 0, 0, ImageColorAllocate($result, 255, 255, 255));
    		ImageCopyResampled($result, $image, 0, 0, 0, 0, $size[0], $size[1], imagesx($image), imagesy($image));

    		header('Content-Type: image/jpeg');

    		ImageInterlace($result, true);
    		ImageJPEG($result, null, 90);
    	}
    }

    return false;
}

?>

Bekleniyor ama ben bunu nasıl düzeltebilirim, bir non-gerekli GD resim kaynak yaratmak kulüpler olarak işlev çalışır? Ben her iki aramaları katılmadan ama bazı yanlış hesaplamalar yapıyor olmalı denedim.

<?php

/*
Usage Examples
*/

Image('http://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png', '1:1', '600x');
Image('http://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png', '2:1', '600x');
Image('http://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png', '2:', '250x300');

?>

Herhangi bir yardım büyük, teşekkür takdir edilmektedir.

1 Cevap

Eğer yeniden boyutlandırma kodu ile başlamak için kırpılmış görüntüye dayalı değil değiştirmek zorunda kalacak. Eğer yapmak istediğiniz beri birinde kırpma ve boyutlandırma bağımsız olarak hesaplamak gerekir gidin.

<?php
function Image($image, $crop = null, $size = null) {
    $image = ImageCreateFromString(file_get_contents($image));

    if (is_resource($image) === true) {
        $x = 0;
        $y = 0;
        $width = imagesx($image);
        $height = imagesy($image);

        /*
        CROP (Aspect Ratio) Section
        */

        if (is_null($crop) === true) {
            $crop = array($width, $height);
        } else {
            $crop = array_filter(explode(':', $crop));

            if (empty($crop) === true) {
                    $crop = array($width, $height);
            } else {
                if ((empty($crop[0]) === true) || (is_numeric($crop[0]) === false)) {
                        $crop[0] = $crop[1];
                } else if ((empty($crop[1]) === true) || (is_numeric($crop[1]) === false)) {
                        $crop[1] = $crop[0];
                }
            }

            $ratio = array(0 => $width / $height, 1 => $crop[0] / $crop[1]);

            if ($ratio[0] > $ratio[1]) {
                $width = $height * $ratio[1];
                $x = (imagesx($image) - $width) / 2;
            }

            else if ($ratio[0] < $ratio[1]) {
                $height = $width / $ratio[1];
                $y = (imagesy($image) - $height) / 2;
            }

        }

        /*
        Resize Section
        */

        if (is_null($size) === true) {
            $size = array($width, $height);
        }

        else {
            $size = array_filter(explode('x', $size));

            if (empty($size) === true) {
                    $size = array(imagesx($image), imagesy($image));
            } else {
                if ((empty($size[0]) === true) || (is_numeric($size[0]) === false)) {
                        $size[0] = round($size[1] * $width / $height);
                } else if ((empty($size[1]) === true) || (is_numeric($size[1]) === false)) {
                        $size[1] = round($size[0] * $height / $width);
                }
            }
        }

       $result = ImageCreateTrueColor($size[0], $size[1]);

        if (is_resource($result) === true) {
            ImageSaveAlpha($result, true);
            ImageAlphaBlending($result, true);
            ImageFill($result, 0, 0, ImageColorAllocate($result, 255, 255, 255));
            ImageCopyResampled($result, $image, 0, 0, $x, $y, $size[0], $size[1], $width, $height);

            ImageInterlace($result, true);
            ImageJPEG($result, null, 90);
        }
    }

    return false;
}

header('Content-Type: image/jpeg');
Image('http://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png', '1:1', '600x');

?>