Image resizing with PHP advice

2019-08-20 06:31发布

问题:

From previous experiences, I've noticed that I'm not very good at integrating 'scripts' created by others, with my own existing code, as of now. I need some advice on understanding what this person is saying about resizing images with PHP:

In the comments, he's written:

// 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)

Then, he gives an actual example, also as a comment:

// 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" />

I am guessing, he wants the user of the script to have something similar to the above img src. So, my question is: How will I actually make the source of my pictures similar to the example above? Below is some of the code I have. It shows how I am saving the pictures and HOW I am echoing/displaying them. It's from uploader.php:

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

Once the photo has been saved in the folder, I save the file path in a MySQL table and later call the file path to display the picture (Below Code). It's from profile.php

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

Therefore, how will I pass the parameters similar to the one in the 'script example' if I am using the above img src to display the 'actual' picture?

THANK YOU.

回答1:

$width = 100;
$height = 100;

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

You can use the following code to resize the image... once you got all the params

/**
 * 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;
}

Hope this helps..

Thanks Chetan sharma