开发者

Image resizing with PHP advice

开发者 https://www.devze.com 2023-01-07 23:22 出处:网络
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 perso

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 t开发者_如何学运维he 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.


$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

0

精彩评论

暂无评论...
验证码 换一张
取 消