使用PHP建议调整图像大小

时间:2010-07-21 03:04:39

标签: php resize-image

根据之前的经验,我注意到我不太擅长使用我自己的现有代码来创建其他人创建的'脚本',截至目前。我需要一些建议来理解这个人对使用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显示“实际”图片,我将如何传递类似于'script example'中的参数?

谢谢。

1 个答案:

答案 0 :(得分:3)

$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