Изменение размера изображения с помощью PHP совета - PullRequest
0 голосов
/ 21 июля 2010

Из предыдущего опыта я заметил, что я не очень хорош в интеграции 'сценариев', созданных другими, с моим собственным существующим кодом на данный момент. Мне нужен совет, чтобы понять, что этот человек говорит об изменении размера изображений с помощью PHP:

В комментариях он написал:

// Parameters need to be passed in through the URL's query string:
// image        absolute path of local image starting with "/" (e.g. /images/toast.jpg)
// width        maximum width of final image in pixels (e.g. 700)
// height       maximum height of final image in pixels (e.g. 700)

Затем он приводит реальный пример, также в качестве комментария:

// Resizing and cropping a JPEG into a square:
// <img src="/image.php/image-name.jpg?width=100&amp;height=100&amp;cropratio=1:1&amp;image=/path/to/image.jpg" alt="Don't forget your alt text" />

Полагаю, он хочет, чтобы у пользователя скрипта было что-то похожее на img src. Итак, мой вопрос: как я на самом деле сделаю источник моих фотографий похожим на пример выше? Ниже приведен код, который у меня есть. Он показывает, как я сохраняю картинки и КАК я их отображаю. Это из uploader.php:

move_uploaded_file($_FILES["file"]["tmp_name"],
      "profileportraits/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "profileportraits/" . $_FILES["file"]["name"]; 

Как только фотография была сохранена в папке, я сохраняю путь к файлу в таблице MySQL, а затем вызываю путь к файлу, чтобы отобразить картинку (код ниже). Это от profile.php

echo "<img src=\"{$row['PortraitPath']}\" />";

Следовательно, как я передам параметры, аналогичные параметрам в «примере скрипта», если я использую приведенный выше img src для отображения «фактического» изображения?

СПАСИБО.

1 Ответ

3 голосов
/ 21 июля 2010
$width = 100;
$height = 100;

src="/image.php?width={$width}&amp;height={$height}"

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

/**
 * Gets the jpeg contents of the resized version of an already uploaded image
 * (Returns false if the file was not an image)
 *
 * @param string $input_name The name of the file on the disk
 * @param int $maxwidth The desired width of the resized image
 * @param int $maxheight The desired height of the resized image
 * @param true|false $square If set to true, takes the smallest of maxwidth and
 *          maxheight and use it to set the dimensions on the new image. If no
 *          crop parameters are set, the largest square that fits in the image
 *          centered will be used for the resize. If square, the crop must be a
 *          square region.
 * @param int $x1 x coordinate for top, left corner
 * @param int $y1 y coordinate for top, left corner
 * @param int $x2 x coordinate for bottom, right corner
 * @param int $y2 y coordinate for bottom, right corner
 * @param bool $upscale Resize images smaller than $maxwidth x $maxheight?
 * @return false|mixed The contents of the resized image, or false on failure
 */
function get_resized_image_from_existing_file($input_name, $maxwidth, $maxheight, $square = FALSE, $x1 = 0, $y1 = 0, $x2 = 0, $y2 = 0, $upscale = FALSE) {
    // Get the size information from the image
    $imgsizearray = getimagesize($input_name);
    if ($imgsizearray == FALSE) {
        return FALSE;
    }

    // Get width and height
    $width = $imgsizearray[0];
    $height = $imgsizearray[1];

    // make sure we can read the image
    $accepted_formats = array(
        'image/jpeg' => 'jpeg',
        'image/pjpeg' => 'jpeg',
        'image/png' => 'png',
        'image/x-png' => 'png',
        'image/gif' => 'gif'
    );

    // make sure the function is available
    $load_function = "imagecreatefrom" . $accepted_formats[$imgsizearray['mime']];
    if (!is_callable($load_function)) {
        return FALSE;
    }

    // crop image first?
    $crop = TRUE;
    if ($x1 == 0 && $y1 == 0 && $x2 == 0 && $y2 == 0) {
        $crop = FALSE;
    }

    // how large a section of the image has been selected
    if ($crop) {
        $region_width = $x2 - $x1;
        $region_height = $y2 - $y1;
    } else {
        // everything selected if no crop parameters
        $region_width = $width;
        $region_height = $height;
    }

    // determine cropping offsets
    if ($square) {
        // asking for a square image back

        // detect case where someone is passing crop parameters that are not for a square
        if ($crop == TRUE && $region_width != $region_height) {
            return FALSE;
        }

        // size of the new square image
        $new_width = $new_height = min($maxwidth, $maxheight);

        // find largest square that fits within the selected region
        $region_width = $region_height = min($region_width, $region_height);

        // set offsets for crop
        if ($crop) {
            $widthoffset = $x1;
            $heightoffset = $y1;
            $width = $x2 - $x1;
            $height = $width;
        } else {
            // place square region in the center
            $widthoffset = floor(($width - $region_width) / 2);
            $heightoffset = floor(($height - $region_height) / 2);
        }
    } else {
        // non-square new image

        $new_width = $maxwidth;
        $new_height = $maxwidth;

        // maintain aspect ratio of original image/crop
        if (($region_height / (float)$new_height) > ($region_width / (float)$new_width)) {
            $new_width = floor($new_height * $region_width / (float)$region_height);
        } else {
            $new_height = floor($new_width * $region_height / (float)$region_width);
        }

        // by default, use entire image
        $widthoffset = 0;
        $heightoffset = 0;

        if ($crop) {
            $widthoffset = $x1;
            $heightoffset = $y1;
        }
    }

    // check for upscaling
    // @todo This ignores squares, coordinates, and cropping. It's probably not the best idea.
    // Size checking should be done in action code, but for backward compatibility
    // this duplicates the previous behavior.
    if (!$upscale && ($height < $new_height || $width < $new_width)) {
        // zero out offsets
        $widthoffset = $heightoffset = 0;

        // determine if we can scale it down at all
        // (ie, if only one dimension is too small)
        // if not, just use original size.
        if ($height < $new_height && $width < $new_width) {
            $ratio = 1;
        } elseif ($height < $new_height) {
            $ratio = $new_width / $width;
        } elseif ($width < $new_width) {
            $ratio = $new_height / $height;
        }
        $region_height = $height;
        $region_width = $width;
        $new_height = floor($height * $ratio);
        $new_width = floor($width * $ratio);
    }

    // load original image
    $orig_image = $load_function($input_name);
    if (!$orig_image) {
        return FALSE;
    }

    // allocate the new image
    $newimage = imagecreatetruecolor($new_width, $new_height);
    if (!$newimage) {
        return FALSE;
    }

    // create the new image
    $rtn_code = imagecopyresampled( $newimage,
                                    $orig_image,
                                    0,
                                    0,
                                    $widthoffset,
                                    $heightoffset,
                                    $new_width,
                                    $new_height,
                                    $region_width,
                                    $region_height );
    if (!$rtn_code) {
        return FALSE;
    }

    // grab contents for return
    ob_start();
    imagejpeg($newimage, null, 90);
    $jpeg = ob_get_clean();

    imagedestroy($newimage);
    imagedestroy($orig_image);

    return $jpeg;
}

Надеюсь, это поможет ..

Спасибо Chetan sharma

...