好用的图片裁剪类

<?php

/**
* Author : smallchicken
* Time   : 2009年6月8日16:46:05
* mode 1 : 强制裁剪,生成图片严格按照需要,不足放大,超过裁剪,图片始终铺满
* mode 2 : 和1类似,但不足的时候 不放大 会产生补白,可以用png消除。
* mode 3 : 只缩放,不裁剪,保留全部图片信息,会产生补白,
* mode 4 : 只缩放,不裁剪,保留全部图片信息,生成图片大小为最终缩放后的图片有效信息的实际大小,不产生补白
* 默认补白为白色,如果要使补白成透明像素,请使用SaveAlpha()方法代替SaveImage()方法
*
* 调用方法:
*
* $ic=new ImageCrop(‘old.jpg‘,‘afterCrop.jpg‘);
* $ic->Crop(120,80,2);
* $ic->SaveImage();
* //$ic->SaveAlpha();将补白变成透明像素保存
* $ic->destory();
*
*
*/
class ImageCrop
{

    var $sImage;
    var $dImage;
    var $src_file;
    var $dst_file;
    var $src_width;
    var $src_height;
    var $src_ext;
    var $src_type;

    function ImageCrop($src_file,$dst_file=‘‘)
    {
        $this->src_file=$src_file;
        $this->dst_file=$dst_file;
        $this->LoadImage();
    }

    function SetSrcFile($src_file)
    {
        $this->src_file=$src_file;
    }

    function SetDstFile($dst_file)
    {
        $this->dst_file=$dst_file;
    }

    function LoadImage()
    {
        list($this->src_width, $this->src_height, $this->src_type) = getimagesize($this->src_file);
        switch($this->src_type)
        {
            case IMAGETYPE_JPEG :
            $this->sImage=imagecreatefromjpeg($this->src_file);
            $this->ext=‘jpg‘;
            break;
            case IMAGETYPE_PNG :
            $this->sImage=imagecreatefrompng($this->src_file);
            $this->ext=‘png‘;
            break;
            case IMAGETYPE_GIF :
            $this->sImage=imagecreatefromgif($this->src_file);
            $this->ext=‘gif‘;
            break;
            default:
            exit();
        }
    }

    function SaveImage($fileName=‘‘)
    {
        $this->dst_file=$fileName ? $fileName : $this->dst_file;
        switch($this->src_type)
        {
            case IMAGETYPE_JPEG :
            imagejpeg($this->dImage,$this->dst_file,100);
            break;
            case IMAGETYPE_PNG :
            imagepng($this->dImage,$this->dst_file);
            break;
            case IMAGETYPE_GIF :
            imagegif($this->dImage,$this->dst_file);
            break;
            default:
            break;
        }
    }

    function OutImage()
    {
        switch($this->src_type)
        {
            case IMAGETYPE_JPEG :
            header(‘Content-type: image/jpeg‘);
            imagejpeg($this->dImage);
            break;
            case IMAGETYPE_PNG :
            header(‘Content-type: image/png‘);
            imagepng($this->dImage);
            break;
            case IMAGETYPE_GIF :
            header(‘Content-type: image/gif‘);
            imagegif($this->dImage);
            break;
            default:
            break;
        }
    }

    function SaveAlpha($fileName=‘‘)
    {
        $this->dst_file=$fileName ? $fileName . ‘.png‘ : $this->dst_file .‘.png‘;
        imagesavealpha($this->dImage, true);
        imagepng($this->dImage,$this->dst_file);
    }

    function OutAlpha(){
        imagesavealpha($this->dImage, true);
        header(‘Content-type: image/png‘);
        imagepng($this->dImage);
    }   

    function destory(){
        imagedestroy($this->sImage);
        imagedestroy($this->dImage);
    }

    function Crop($dst_width,$dst_height,$mode=1,$dst_file=‘‘)
    {
        if($dst_file) $this->dst_file=$dst_file;
        $this->dImage = imagecreatetruecolor($dst_width,$dst_height);

        $bg = imagecolorallocatealpha($this->dImage,255,255,255,127);
        imagefill($this->dImage, 0, 0, $bg);
        imagecolortransparent($this->dImage,$bg);

        $ratio_w=1.0 * $dst_width / $this->src_width;
        $ratio_h=1.0 * $dst_height / $this->src_height;
        $ratio=1.0;
        switch($mode)
        {
            case 1:        // always crop
            if( ($ratio_w < 1 && $ratio_h < 1) || ($ratio_w > 1 && $ratio_h > 1))
            {
                $ratio = $ratio_w < $ratio_h ? $ratio_h : $ratio_w;
                $tmp_w = (int)($dst_width / $ratio);
                $tmp_h = (int)($dst_height / $ratio);
                $tmp_img=imagecreatetruecolor($tmp_w , $tmp_h);
                $src_x = (int) (($this->src_width-$tmp_w)/2) ;
                $src_y = (int) (($this->src_height-$tmp_h)/2) ;
                imagecopy($tmp_img, $this->sImage, 0,0,$src_x,$src_y,$tmp_w,$tmp_h);
                imagecopyresampled($this->dImage,$tmp_img,0,0,0,0,$dst_width,$dst_height,$tmp_w,$tmp_h);
                imagedestroy($tmp_img);
            }else
            {
                $ratio = $ratio_w < $ratio_h ? $ratio_h : $ratio_w;
                $tmp_w = (int)($this->src_width * $ratio);
                $tmp_h = (int)($this->src_height * $ratio);
                $tmp_img=imagecreatetruecolor($tmp_w ,$tmp_h);
                imagecopyresampled($tmp_img,$this->sImage,0,0,0,0,$tmp_w,$tmp_h,$this->src_width,$this->src_height);
                $src_x = (int)($tmp_w - $dst_width) / 2 ;
                $src_y = (int)($tmp_h - $dst_height) / 2 ;
                imagecopy($this->dImage, $tmp_img, 0,0,$src_x,$src_y,$dst_width,$dst_height);
                imagedestroy($tmp_img);
            }
            break;
            case 2:        // only small
            if($ratio_w < 1 && $ratio_h < 1)
            {
                $ratio = $ratio_w < $ratio_h ? $ratio_h : $ratio_w;
                $tmp_w = (int)($dst_width / $ratio);
                $tmp_h = (int)($dst_height / $ratio);
                $tmp_img=imagecreatetruecolor($tmp_w , $tmp_h);
                $src_x = (int) ($this->src_width-$tmp_w)/2 ;
                $src_y = (int) ($this->src_height-$tmp_h)/2 ;
                imagecopy($tmp_img, $this->sImage, 0,0,$src_x,$src_y,$tmp_w,$tmp_h);
                imagecopyresampled($this->dImage,$tmp_img,0,0,0,0,$dst_width,$dst_height,$tmp_w,$tmp_h);
                imagedestroy($tmp_img);
            }elseif($ratio_w > 1 && $ratio_h > 1)
            {
                $dst_x = (int) abs($dst_width - $this->src_width) / 2 ;
                $dst_y = (int) abs($dst_height -$this->src_height) / 2;
                imagecopy($this->dImage, $this->sImage,$dst_x,$dst_y,0,0,$this->src_width,$this->src_height);
            }else
            {
            $src_x=0;$dst_x=0;$src_y=0;$dst_y=0;
            if(($dst_width - $this->src_width) < 0)
            {
                $src_x = (int) ($this->src_width - $dst_width)/2;
                $dst_x =0;
            }else{
                $src_x =0;
                $dst_x = (int) ($dst_width - $this->src_width)/2;
            }

            if( ($dst_height -$this->src_height) < 0)
            {
                $src_y = (int) ($this->src_height - $dst_height)/2;
                $dst_y = 0;
            }else
            {
                $src_y = 0;
                $dst_y = (int) ($dst_height - $this->src_height)/2;
            }
            imagecopy($this->dImage, $this->sImage,$dst_x,$dst_y,$src_x,$src_y,$this->src_width,$this->src_height);
            }
            break;
            case 3:        // keep all image size and create need size
            if($ratio_w > 1 && $ratio_h > 1)
            {
                $dst_x = (int)(abs($dst_width - $this->src_width )/2) ;
                $dst_y = (int)(abs($dst_height- $this->src_height)/2) ;
                imagecopy($this->dImage, $this->sImage, $dst_x,$dst_y,0,0,$this->src_width,$this->src_height);
            }else
            {
                $ratio = $ratio_w > $ratio_h ? $ratio_h : $ratio_w;
                $tmp_w = (int)($this->src_width * $ratio);
                $tmp_h = (int)($this->src_height * $ratio);
                $tmp_img=imagecreatetruecolor($tmp_w ,$tmp_h);
                imagecopyresampled($tmp_img,$this->sImage,0,0,0,0,$tmp_w,$tmp_h,$this->src_width,$this->src_height);
                $dst_x = (int)(abs($tmp_w -$dst_width )/2) ;
                $dst_y = (int)(abs($tmp_h -$dst_height)/2) ;
                imagecopy($this->dImage, $tmp_img, $dst_x,$dst_y,0,0,$tmp_w,$tmp_h);
                imagedestroy($tmp_img);
            }
            break;
            case 4:        // keep all image but create actually size
            if($ratio_w > 1 && $ratio_h > 1)
            {
                $this->dImage = imagecreatetruecolor($this->src_width,$this->src_height);
                imagecopy($this->dImage, $this->sImage,0,0,0,0,$this->src_width,$this->src_height);
            }else
            {
                $ratio = $ratio_w > $ratio_h ? $ratio_h : $ratio_w;
                $tmp_w = (int)($this->src_width * $ratio);
                $tmp_h = (int)($this->src_height * $ratio);
                $this->dImage = imagecreatetruecolor($tmp_w ,$tmp_h);
                imagecopyresampled($this->dImage,$this->sImage,0,0,0,0,$tmp_w,$tmp_h,$this->src_width,$this->src_height);
            }
            break;
        }
    }// end Crop

}

?>
时间: 2024-10-01 03:20:04

好用的图片裁剪类的相关文章

使用JCrop进行图片裁剪,裁剪js说明,裁剪预览,裁剪上传,裁剪设计的图片处理的工具类和代码

?? 1.要想制作图片裁剪功能,可以使用网上的裁剪工具JCrop,网址是:https://github.com/tapmodo/Jcrop/ 案例效果如下: 2.引入JCrop的js代码,具体要引入那些js可以参考JCrop案例: 3.编写的html代码如下: <div id="light" class="white_content"> <div class="vatitlee"> 封面截取 <div class=&

java图片裁剪处理工具类代码

剪切前:  原文:java图片裁剪处理工具类代码 源代码下载地址:http://www.zuidaima.com/share/1550463351786496.htm 剪切后:  package com.zuidaima.zhangjun.image; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import

PHP图片处理类:支持(缩略,裁剪,圆角,倾斜)

<? /*     图片处理类:缩略,裁剪,圆角,倾斜 */ class resizeimage {    //图片类型    var $type;    //实际宽度    var $width;    //实际高度    var $height;    //改变后的宽度    var $resize_width;    //改变后的高度    var $resize_height;    //是否裁图    var $cut;    //源图象    var $srcimg;    //目标

bootstrap-wysiwyg 结合 base64 解码 .net bbs 图片操作类 (二) 图片裁剪

图片裁剪参见: http://deepliquid.com/projects/Jcrop/demos.php?demo=thumbnail        一个js插件 http://www.mikesdotnetting.com/article/95/upload-and-crop-images-with-jquery-jcrop-and-asp-net  一个外国人写的例子,基于 asp.net webform 的.别人 在 2009 年 写的啊,我却在 2014年 才使用. 一共2个aspx

拍照、本地图片工具类(兼容至Android7.0)

拍照.本地图片工具类:解决了4.4以上剪裁会提示"找不到文件"和6.0动态授予权限,及7.0报FileUriExposedException异常问题. package com.hb.weex.util; import android.Manifest; import android.app.Activity; import android.app.Dialog; import android.content.ClipData; import android.content.Conten

利用jquery的imgAreaSelect插件实现图片裁剪示例

利用jquery的imgAreaSelect插件实现图片裁剪示例 将用户上传的图片进行裁剪再保存是现在web2.0应用中常常处理的工作,现在借助jquery的imgareaselect插件再配合PHP的GD库就可以轻松的实现这个在以前来说非常棘手的功能.我们来看看它的实现步骤: 1.包含进CSS文件(imgareaselect-default.css)和 jquery.imgareaselect.js文件 2.html代码(要裁剪的图片元素) <img id="selectbanner&q

struts2+jsp+jquery+Jcrop实现图片裁剪并上传

<1> 使用html标签上传需要裁剪的大图. <2> 在页面呈现大图,使用Jcrop(Jquery)对大图进行裁剪,并且可以进行预览. <3> 选择好截取部分之后发送数据给Action,在服务器端使用 Java API 对大图进行裁剪. <4> 保存大图裁剪好的头像到指定目录,完成业务. 下面一步一步做: 第一步:使用html标签上传需要裁剪的大图. 这一步说白了也就是使用Struts2自带的FileUpload功能,把图片进行上传具体代码如下: html页

Android图片裁剪之自由裁剪

我的博客http://blog.csdn.net/dawn_moon 客户的需求都是非常怪的.我有时候在给客户做项目的时候就想骂客户是sb.可是请你相信我,等你有需求,自己变成客户的时候,给你做项目的哥哥肯定也会骂你是sb. 是这种,客户须要做一个图片上传的功能,这个图片须要裁剪.一般而言,这东西用系统自带的裁剪就搞定了.但是客户不,他要能够自由裁剪,就是长宽比不固定,想裁成什么比例就裁成什么比例,我一听,蛋都碎了. 没有办法,客户sb归sb,需求还是得照做,不然不给钱要喝西北风了. 图片裁剪的

Java+Javascript图片裁剪简单封装

在做项目的过程中,有很多时候前端的图片会出现拉伸现象,所以在上传图片的时候,图片裁剪是必不可少的.所以有了封装一个图片裁剪工具的念头,下面是实现步骤: 1.首先选择一个前台裁剪工具,我这里使用的是Jcrop-0.9.12. 2.开始编写前端js代码: 我这里把前端封装成一个函数 /**      * 初始化裁剪工具.      * @param divId 定义生成填充页面代码的div(函数产生的代码会填充到此div内)     * @param imagePath 图片地址     * @pa