PHP对图片等比缩放和补白居中

图片的等比缩放我们需要的是一个等比缩放的公式即可:


原图宽度/新图宽度=原图高度/新图高度



有了这个等比数列,我们就可以根据需求,来计算高宽的值。


逻辑:


当原图的宽度超过我们限定的宽度,已知的就是新图的宽度,得公式:


新图高度=原图高度*新图宽度/原图宽度



反之,当高度超过了,得公式:


新图宽度=原图宽度*新高宽度/原图宽度



有人这时候会问,如果2个都超过怎么办?是的,如果2个都超过的话,我们就比较原图中,哪个值比较大,然后再根据大的值做优先缩放,套用上面的公式。


补白剧中,首先我们看一张图:





图中B部分是等比缩放后的图的大小,A部分则是我们需要的图片限定的高宽,那么,X,Y分别为B图相对于A图的距离。假设,我们有2张图,一个背景为红色的A图(即限定尺寸的图),一个背景为黄色的B图(等比缩放后的图),如要B在A中剧中显示,我们要计算出X,Y的值,然后将B定位到(X,Y)的位置,并合并2张图即可。


公式:


x=(A图宽度-B图宽度)÷2


y=(A图高度-B图高度)÷2



需要的PHP 函数:


getimagesize


imagecreatetruecolor


imagecopyresampled


imagecreate


imagecolorallocate


imagecreatefromjpeg


imagecopy


imagejpeg


列出一些只要的PHP函数,具体的作用就不解释了,大家可以去查看手册,我相信手册讲的绝对会比我跟清楚的,哈哈。


<?php

class ImageCopy{
        public $ImageUrl;
        public $Path;
        public $ImageWidth;
        public $ImageHeight;
        function __construct($ImageUrl,$Path,$ImageWidth,$ImageHeight){
                $this->ImageUrl=$ImageUrl;
                $this->Path=$Path;
                $this->ImageWidth=$ImageWidth;
                $this->ImageHeight=$ImageHeight;
        }
        //获取图片信息,高宽的值
        public function getImageSize(){
                list($width,$height)=getimagesize($this->ImageUrl);
                $imageArr=array(
                        "width"=>$width,
                        "height"=>$height
                );
                return $imageArr;
        }
        public function SetImageCopy(){
                //创建一个新的图像
                //
if(function_exists("imagecreatetruecolor")){
$NewImage=imagecreatetruecolor($this->ImageWidth,$this->ImageHeight); // 创建目标图gd2
$back = imagecolorallocate($NewImage, 255, 255, 255);
imagefilledrectangle($NewImage, 0, 0, $this->ImageWidth, $this->ImageHeight, $back); 
}
else
$NewImage=imagecreate($this->ImageWidth,$this->ImageHeight);// 创建目标图gd1

                //设置图像的背景颜色,白色
                imagecolorallocate($NewImage, 255, 255, 255);
                // 读取图片
                $Image=imagecreatefromjpeg($this->ImageUrl);



                //获取图片信息
                $imageSize=$this->getImageSize();
                //计算高宽的值
                $x=($this->ImageWidth-$imageSize['width'])/2;
                $y=($this->ImageHeight-$imageSize['height'])/2;
                //进行图片的合并操作
                imagecopy($NewImage,$Image,$x,$y,0,0,$imageSize['width'],$imageSize['height']);
                //$NewImageUrl=$this->Path."/".basename($this->ImageUrl,".jpg")."_".$this->ImageWidth."_".$this->ImageHeight.".jpg";
$NewImageUrl=$this->Path."/".basename($this->ImageUrl,".jpg")."_b.jpg";
                // 输出新的图片
                imagejpeg($NewImage,$NewImageUrl,100);
                imagedestroy($NewImage);
                //最后返回图片保存路径
                return array(
                        "imageUrl"=>$NewImageUrl
                );
        }
}
?>

SyntaxHighlighter.highlight();