PHP / GD – обрезка и изменение размеров изображений

Я закодировал функцию, которая обрезает изображение с заданным соотношением сторон и, наконец, затем изменяет его размеры и выводит его как JPG:

<?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; } ?> 

Функция работает так, как ожидалось, но я создаю необоснованный ресурс изображения GD, как я могу его исправить? Я попытался присоединиться к обоим вызовам, но я должен делать некоторые просчеты.

 <?php /* Usage Examples */ Image('http://img.ruphp.com/php/PNG_transparency_demonstration_1.png', '1:1', '600x'); Image('http://img.ruphp.com/php/PNG_transparency_demonstration_1.png', '2:1', '600x'); Image('http://img.ruphp.com/php/PNG_transparency_demonstration_1.png', '2:', '250x300'); ?> 

Любая помощь очень ценится, спасибо.

Related of "PHP / GD – обрезка и изменение размеров изображений"

Вам нужно будет изменить свой код изменения размера, чтобы не основываться на обрезанном изображении для начала. Поскольку вы хотите сделать обрезку и изменение размера за один раз, вам нужно рассчитать его самостоятельно.

 <?php function Image($image, $crop = ':', $size = null) { $image = ImageCreateFromString(file_get_contents($image)); if (is_resource($image)) { $x = 0; $y = 0; $width = imagesx($image); $height = imagesy($image); // CROP (Aspect Ratio) Section $crop = array_filter(explode(':', $crop)); if (empty($crop)) { $crop = [$width, $height]; } else { $crop[0] = $crop[0] ?: $crop[1]; $crop[1] = $crop[1] ?: $crop[0]; } $ratio = [$width / $height, $crop[0] / $crop[1]]; if ($ratio[0] > $ratio[1]) { $width = $height * $ratio[1]; $x = (imagesx($image) - $width) / 2; } else { $height = $width / $ratio[1]; $y = (imagesy($image) - $height) / 2; } // Resize Section if (is_null($size)) { $size = [$width, $height]; } else { $size = array_filter(explode('x', $size)); if (empty($size)) { $size = [imagesx($image), imagesy($image)]; } else { $size[0] = $size[0] ?: round($size[1] * $width / $height); $size[1] = $size[1] ?: round($size[0] * $height / $width); } } $result = ImageCreateTrueColor($size[0], $size[1]); if (is_resource($result)) { 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://img.ruphp.com/php/PNG_transparency_demonstration_1.png', '1:1', '600x'); ?>