同福

做个web框架(19)——图像处理工具对象TFImage的实现【20201213】

介绍

介绍

福哥今天要给TFPHP框架添加一个新的对象,就是用来加工图片的工具对象TFImage。一般情况下,在做web开发的时候会有很多场合需要对用户上传的图片进行加工处理,常有的加工操作有缩小、旋转、裁剪、加水印、写文字等等。在PHP里面如果要对图片进行加工处理的话就需要用到GD扩展库了,这个GD扩展库在我们的TFLinux里面已经安装好了,可以直接使用了。

前面说过了,加工图片的操作有很多,福哥会一点一点地逐个实现它们。

今天福哥会先实现TFImage的其中一个操作,就是“中心裁剪”法对图片进行裁剪处理。所谓“中心裁剪”就是在保证最终宽、高尺寸的前提下将原图的中心进行最大限度地保留,然后将其余的部分裁剪掉。

TFImage

a

private function a(int $a,int $b){
    $c=$a/$this->a;
    $d=$b/$this->b;
    if($b/$c<=$this->b){
        return $this->zoom($c);
    }
    else if($a/$d<=$this->a){
        return $this->zoom($d);
    }
    return null;
}

centerDrop

public function centerDrop(int $a,int $b=0):?TFImage{
    if($b==0){
        $b=$a;
    }
    $c=$this->a($a,$b);
    if($c==null){
        return null;
    }
    $d=$c->getWidth();
    $e=$c->getHeight();
    $f=$c->getImage();
    $g=intval(($d-$a)/2);
    $h=intval(($e-$b)/2);
    $i=imagecreatetruecolor($a,$b);
    $j=imagecopyresampled($i,$f,0,0,$g,$h,$a,$b,$a,$b);
    if($j){
        $k=new TFImage($this->tfphp);
        $k->createFromIM($i,$a,$b,$this->c);
        return $k;
    }
    return null;
}

zoom

public function zoom(float $a):?TFImage{
    $b=intval($this->a*$a);
    $c=intval($this->b*$a);
    $d=imagecreatetruecolor($b,$c);
    $e=imagecopyresampled($d,$this->d,0,0,0,0,$b,$c,$this->a,$this->b);
    if($e){
        $f=new TFImage($this->tfphp);
        $f->createFromIM($d,$b,$c,$this->c);
        return $f;
    }
    return null;
}

show

public function show(){
    $a=substr($this->c,1);
    if($a=="jpg"){
        $a="jpeg";
    }
    header('Content-Type: image/'.$a);
    switch($this->c){
        case'.png':imagepng($this->d);
        break;
        case'.gif':imagegif($this->d);
        break;
        case'.jpg':imagejpeg($this->d);
        break;
    }
}

save

public function save(string $a){
    $b=false;
    switch($this->c){
        case'.png':$b=imagepng($this->d,$a);
        break;
        case'.gif':$b=imagegif($this->d,$a);
        break;
        case'.jpg':$b=imagejpeg($this->d,$a);
        break;
    }
    if($b){
        return true;
    }
    return false;
}

讲解

TFImage

TFImage对象存放在Image/TFImage.inc.php里面。

a

这个方法的方法名称是经过了混淆处理的,该方法的作用是计算“中心裁剪”处理后缩小的尺寸。

centerDrop

这个方法就是用来将图片通过“中心裁剪”法将图片裁剪并缩放至指定尺寸。

zoom

这个方法可以用来对图片进行等比例缩放。

show

这个方法是用来将加工后的图片显示到浏览器上,常用的场景有图片验证码、报表图像等等。

save

这个方法是用来将加工后的图片保存起来的功能。

使用

下面我们使用centerDrop功能裁剪一张图片,大家来看看效果。

代码

$myImage = new TFImage($this->tfphp);
$myImage->createFromFile("images/org.jpg");
$newImage = $myImage->centerDrop(518, 518);
$newImage->show();

原图

3ecebeef0407b54d.jpg

小图

9fb8f0cbfbb2cd7e.jpg

可以看出来原图的纵向内容被全部保留了,横向内容的左右均被裁剪掉了一部分。

总结

今天福哥带着童鞋们实现了图像处理工具对象TFImage的基础功能,还实现了使用“中心裁剪”法裁剪图片的技巧,使用“中心裁剪”法可以很方便地完成用户头像的图片的制作,因为“中心裁剪”法可以最大限度地保留原图的内容,非常适合用户头像这种有固定尺寸的场景。