PHP Thumbnail Image Resizing with proportions

后端 未结 6 2150
终归单人心
终归单人心 2020-12-06 15:06

As a brief run down, I am currently making a dating type site. Users can create accounts and upload profile pictures (up to 8). In order to display these in the browse area

相关标签:
6条回答
  • 2020-12-06 15:18

    you don't need imagick. here is a link that will take you to a function that will resize any image using PHP GD to any arbitrary size. the function has options to use letterboxing or crop-to-fit methods to resize to the new aspect ratio. the function is also explained thoroughly. check it out.

    http://www.spotlesswebdesign.com/blog.php?id=1

    if this is what you are looking for, please select the check mark next to this answer. thanks!

    0 讨论(0)
  • 2020-12-06 15:22

    Some says imagic faster, i use next

        
        function resizeImageProportional($imagePath, $destinationPath, $width = false, $height = false, $filterType = \Imagick::FILTER_POINT, $blur = 1, $bestFit = false, $cropZoom = false)
        {
            if (!$width && !$height) {
                trigger_error("WTF_IMAGE_RESIZE");
                return false;
            }
            //The blur factor where > 1 is blurry, < 1 is sharp.
            $imagick = new \Imagick(realpath($imagePath));

    if (!$width || !$height) { $orig_width = $imagick->getImageWidth(); $orig_height = $imagick->getImageHeight(); $proportion = $orig_height/$orig_width; if (!$width) { $width = $height*$proportion; } elseif (!$height) { $height = $width*$proportion; } } if ($bestFit) { $imagick->resizeImage($width, $height, $filterType, $blur, $bestFit); } else { $imagick->resizeImage($width, $height, $filterType, $blur); } if ($cropZoom) { $cropWidth = $imagick->getImageWidth(); $cropHeight = $imagick->getImageHeight(); $newWidth = $cropWidth / 2; $newHeight = $cropHeight / 2; $imagick->cropimage( $newWidth, $newHeight, ($cropWidth - $newWidth) / 2, ($cropHeight - $newHeight) / 2 ); $imagick->scaleimage( $imagick->getImageWidth() * 4, $imagick->getImageHeight() * 4 ); }
    0 讨论(0)
  • 2020-12-06 15:27
    $maxwidth = 120;
    $maxheight = 150;
    
    $img = imagecreatefromjpeg($jpgimage); 
    //or imagecreatefrompng,imagecreatefromgif,etc. depending on user's uploaded file extension
    
    $width = imagesx($img); //get width and height of original image
    $height = imagesy($img);
    
    //determine which side is the longest to use in calculating length of the shorter side, since the longest will be the max size for whichever side is longest.    
    if ($height > $width) 
    {   
    $ratio = $maxheight / $height;  
    $newheight = $maxheight;
    $newwidth = $width * $ratio; 
    }
    else 
    {
    $ratio = $maxwidth / $width;   
    $newwidth = $maxwidth;  
    $newheight = $height * $ratio;   
    }
    
    //create new image resource to hold the resized image
    $newimg = imagecreatetruecolor($newwidth,$newheight); 
    
    $palsize = ImageColorsTotal($img);  //Get palette size for original image
    for ($i = 0; $i < $palsize; $i++) //Assign color palette to new image
    { 
    $colors = ImageColorsForIndex($img, $i);   
    ImageColorAllocate($newimg, $colors['red'], $colors['green'], $colors['blue']);
    } 
    
    //copy original image into new image at new size.
    imagecopyresized($newimg, $img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
    
    imagejpeg($newimg,$outputfile); //$output file is the path/filename where you wish to save the file.  
    //Have to figure that one out yourself using whatever rules you want.  Can use imagegif() or imagepng() or whatever.
    

    This will shrink any images down proportionally based on whichever side is longer (width or height), to the maximum size. It will also blow up any images smaller than max, which you can stop with a bit of checking on whether or not both width and height are less than their max. So, a 200x300 image will be shrunk to 100x150, and a 300x200 image will be shrunk to 120x80.

    Hmm, you want the width to always be 120, so it would change a bit, and yeah, it would have to cut something out in the case of an image like 200x300, because that would shrink to 120x180 without any distortion, or it would have to shrink it farther and letterbox it, but that should get you started nicely.

    Letterboxing this example would just involve figuring out what the proper x and y to start the drawing to the new image would be in the imagecopyresized() function. In the case of something like 100x150, the X would be 10, I think, so there would be 10px of blank space on each side for 120x150 in the end. Letterboxing 120x80 X would be 0 but Y would be 35, so there would be 35px of blank space above and below for 120x150.

    You'd also want to make $newimg with $maxwidth,$maxheight rather than $newwidth,$newheight, but the imagecopyresized() would still use both $new values.

    Since I'm bored and don't have anything else to do, these changes would do it:

    if ($height > $width) 
    {   
    $ratio = $maxheight / $height;  
    $newheight = $maxheight;
    $newwidth = $width * $ratio; 
    $writex = round(($maxwidth - $newwidth) / 2);
    $writey = 0;
    {
    else 
    {
    $ratio = $maxwidth / $width;   
    $newwidth = $maxwidth;  
    $newheight = $height * $ratio;   
    $writex = 0;
    $writey = round(($maxheight - $newheight) / 2);
    }
    
    $newimg = imagecreatetruecolor($maxwidth,$maxheight);
    
    //Since you probably will want to set a color for the letter box do this
    //Assign a color for the letterbox to the new image, 
    //since this is the first call, for imagecolorallocate, it will set the background color
    //in this case, black rgb(0,0,0)
    imagecolorallocate($newimg,0,0,0);
    
    //Loop Palette assignment stuff here
    
    imagecopyresized($newimg, $img, $writex, $writey, 0, 0, $newwidth, $newheight, $width, $height);
    

    That should work, haven't tried it yet.

    0 讨论(0)
  • 2020-12-06 15:34

    You can do this with ImageMagick:

    convert susan.jpg -resize x200 susan_thumb.jpg
    

    This runs with a shell command, so in PHP you'd use shell_exec() to run the above command. I don't think you need any PHP extensions.

    A few flags can be found in the ImageMagick documentation to control the resizing operation. If I recall correctly, the x200 before the number means "scale with the same aspect ratio to 200px".

    I wrote an install guide for ImageMagick (and ghostscript): How to install, test, convert, resize PDF using ImageMagick, Ghostscript, Windows Vista/7 x64 based on my bumbling around, maybe it can help you.

    The other option is the GD library (detailed in dqhendricks answer). This is faster and apparently better documented, used for basic operations.

    0 讨论(0)
  • 2020-12-06 15:43

    GD or Imagick functions are what you need depending on your PHP configuration.
    Sorry I'm a newbie I can't post both links in the same message :(

    0 讨论(0)
  • 2020-12-06 15:43

    I have recently needed php resizing (thumbnail) solution and found Zebra_Image library, which is a lightweight image manipulation library written in PHP. The code is really clean and it's also easy to use. I highly recommend using this library. The example code is just enough to get you started.

    Be make sure that you have enough memory limit set in php.ini file to manipulate images which have relatively big resolution (e.g 2560x1600). I had an error with big images and there was no error to print. I debugged the problem down to imagecreatefrom{gif,jpeg,png} calls in function _create_from_source in lines 1262, 1279, and 1288. The calls were silented with @ so I couldn't have a change to get the error. I removed @ lines and saw a PHP error that memory limit has been exceeded. The original memory limit was set to 32MB and I increased it to 64MB. Now I can manipulate 2560x1600 and I refuse to manipulate images which are bigger.

    Below is the example code for controlling the image resolution.

        $image_properties = getimagesize($UPLOADED_FILE_PATH);                   
        $file_width = $image_properties[0];                                
        $file_height = $image_properties[1];                               
    
        if ($file_width > 2560 || $file_height > 1600) {    
            // handle your error whichever you like, I simply 'die' just to show               
            die('Cannot manipulate image bigger than 2560x1600');                                                                                                                                              
        }       
    

    (Note: I use Zebra Image version 2.2.2)

    0 讨论(0)
提交回复
热议问题