使用PHP调整图像大小

时间:2011-09-12 20:04:51

标签: php image

我有一个简短的问题,我不太确定要设置。我在其他地方见过例子但没有特别喜欢我的情况。我想使用PHP调整图像大小,因此它们是可读的,而不仅仅是像你使用HTML一样令人兴奋。如果它们不是250像素宽,或160像素高,我怎样才能调整图片大小以使其成比例但适合该空间呢?

谢谢!

6 个答案:

答案 0 :(得分:6)

PHP不会直接操作图像。您需要使用gdImageMagick等图像处理库来实现此目标。

在ImageMagick中,image resizing完成如下:

$thumb = new Imagick('myimage.gif');

$thumb->resizeImage(320,240,Imagick::FILTER_LANCZOS,1);
$thumb->writeImage('mythumb.gif');

使用GD,您可以do it like this

<?php
// The file
$filename = 'test.jpg';
$percent = 0.5;

// Content type
header('Content-Type: image/jpeg');

// Get new dimensions
list($width, $height) = getimagesize($filename);
$new_width = $width * $percent;
$new_height = $height * $percent;

// Resample
$image_p = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

// Output
imagejpeg($image_p, null, 100);
?>

答案 1 :(得分:4)

好的,下面是我在商店中使用的Image对象。它保持规模 - 需要GD

<?php
class Store_Model_Image extends My_Model_Abstract 
{
    const PATH  = STORE_MODEL_IMAGE_PATH;
    const URL   = "/store-assets/product-images/";

    public function get_image_url($width, $height)
    {
        $old_file = self::PATH . $this->get_filename();
        $basename = pathinfo($old_file, PATHINFO_FILENAME);

        $new_name = sprintf("%s_%sx%s.jpg", $basename, $width, $height);
        if(file_exists(self::PATH . $new_name))
        {
            return self::URL . $new_name;
        }
        else
        {
            list($width_orig, $height_orig, $image_type) = @getimagesize($old_file);
            $img = FALSE;

            // Get the image and create a thumbnail     
            switch($image_type)
            {
                case 1:
                    $img = @imagecreatefromgif($old_file);
                    break;
                case 2:
                    $img = @imagecreatefromjpeg($old_file);
                    break;
                case 3: 
                    $img = @imagecreatefrompng($old_file);
                    break;
            }

            if(!$img)
            {
                throw new Zend_Exception("ERROR: Could not create image handle from path.");
            }

            // Build the thumbnail
            if($width_orig > $height_orig)
            {
                $width_ratio = $width / $width_orig;
                $new_width   = $width;
                $new_height  = $height_orig * $width_ratio;
            }
            else
            {
                $height_ratio = $height / $height_orig;
                $new_width    = $width_orig * $height_ratio;
                $new_height   = $height;
            }

            $new_img = @imagecreatetruecolor($new_width, $new_height);

            // Fill the image black
            if(!@imagefilledrectangle($new_img, 0, 0, $new_width, $new_height, 0))
            {           
                throw new Zend_Exception("ERROR: Could not fill new image");
            }

            if(!@imagecopyresampled($new_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width_orig, $height_orig))
            {
                throw new Zend_Exception("ERROR: Could not resize old image onto new bg.");
            }

            // Use a output buffering to load the image into a variable
            ob_start();
            imagejpeg($new_img, NULL, 100);
            $image_contents = ob_get_contents();
            ob_end_clean();

            // lastly (for the example) we are writing the string to a file
            $fh = fopen(self::PATH . $new_name, "a+");
            fwrite($fh, $image_contents);
            fclose($fh);

            return self::URL . $new_name;
        }
    }
}

我在请求时调整图像大小,因此页面第一次加载图像时将调整大小为模板所需的大小。 (这意味着每次我的设计更改时,我都不必崩溃共享主机尝试重新生成图像缩略图)

因此,在模板中传递图像对象,当需要图像缩略图时,

<img src="<?php echo $image->get_image_url(100, 100); ?>" />

你现在有一个100x100的拇指,它被保存到服务器以便以后重复使用

答案 2 :(得分:1)

答案 3 :(得分:0)

这是我以前使用的东西

class cropImage{

    var $imgSrc,$myImage,$cropHeight,$cropWidth,$x,$y,$thumb;  

    function setImage($image,$moduleWidth,$moduleHeight,$cropPercent = "1") {

        //Your Image
        $this->imgSrc = $image; 

        //getting the image dimensions
        list($width, $height) = getimagesize($this->imgSrc); 

        //create image from the jpeg
        $this->myImage = imagecreatefromjpeg($this->imgSrc) or die("Error: Cannot find image!"); 

         if($width > $height) $biggestSide = $width; //find biggest length
         else $biggestSide = $height; 

        //The crop size will be half that of the largest side 
        //$cropPercent = 1.55; // This will zoom in to 50% zoom (crop)

        if(!$cropPercent) {
            $cropPercent = 1.50;
        }

        $this->cropWidth   = $moduleWidth*$cropPercent; 
        $this->cropHeight  = $moduleHeight*$cropPercent; 
        //$this->cropWidth   = $biggestSide*$cropPercent; 
        //$this->cropHeight  = $biggestSide*$cropPercent; 


        //getting the top left coordinate
        $this->x = ($width-$this->cropWidth)/2;
        $this->y = ($height-$this->cropHeight)/2;

    }  

    function createThumb($moduleWidth,$moduleHeight){

        $thumbSize = 495; // will create a 250 x 250 thumb
        $this->thumb = imagecreatetruecolor($moduleWidth, $moduleHeight); 
        //$this->thumb = imagecreatetruecolor($thumbSize, $thumbSize); 

        imagecopyresampled($this->thumb, $this->myImage, 0, 0,$this->x, $this->y, $moduleWidth, $moduleHeight, $this->cropWidth, $this->cropHeight); 
        //imagecopyresampled($this->thumb, $this->myImage, 0, 0,$this->x, $this->y, $thumbSize, $thumbSize, $this->cropWidth, $this->cropHeight); 
    }  

    function renderImage(){
        header('Content-type: image/jpeg');
        imagejpeg($this->thumb);
        imagedestroy($this->thumb); 
    }  

}  

使用

调用它
$image = new cropImage;
$image->setImage($imagepath,$moduleWidth,$moduleHeight,$scaleRelation);
$image->createThumb($moduleWidth,$moduleHeight);
$image->renderImage();

答案 4 :(得分:0)

使用GD或ImageMagick。 Here您可能会找到一个真实的代码生成示例(由MediaWiki使用),它支持安慰的ImageMagick接口(transformImageMagick方法),ImageMagick扩展接口(transformImageMagickExt方法)和GD(transformGd方法)。

答案 5 :(得分:0)

有一个名为PHP Image Magician的简单易用的开源库可以帮助你。

基础用法示例:

$magicianObj = new imageLib('racecar.jpg');
$magicianObj -> resizeImage(100, 200, 'crop');
$magicianObj -> saveImage('racecar_small.png');