php图片处理类(生成缩略图,图片尺寸调整,图片截取,图片加水印,图片旋转 )

 更新时间:2016年11月25日 15:41  点击:1578
注意这个类库有一个重名的叫phpThumb,只是大小写的差别,所以查找文档的时候千万注意。 在网站建设过程中,需要处理图片的地方多不胜数,用PHP的图片函数处理图片,十分繁琐。而且对新手来讲十分不好掌握。现在我们可以用PHPThumb类库来处理图片,包括,图片尺寸调整,图片截取,图片加水印,图片旋转等等功能

使用演示:

 代码如下 复制代码

//加载类库文件
require_once 'path/to/ThumbLib.inc.php';

//实例化类库,传入你要处理的图片的地址可以是网络地址,也可以是本地地址
$thumb = PhpThumbFactory::create('http://www.111cn.net/');

//把图片等比缩小到最大宽度 100px或者最高100px,当只输入一个参数的时候,是限制最宽的尺寸。
$thumb->resize(100, 100);

//把图片等比缩小到原来的百分数,比如50就是原来的50%。
$thumb->resizePercent(50);

//截取一个175px * 175px的图片,注意这个是截取,超出的部分直接裁切掉,不是强制改变尺寸。
$thumb->adaptiveResize(175, 175);

//从图片的中心计算,截取200px * 100px的图片。
$thumb->cropFromCenter(200, 100);

//截图,前两个参数分别是需要解出的图片的右上角的坐标X,Y。 后面两个参数是需要解出的图片宽,高。
$thumb->crop(100, 100, 300, 200);

//把图片顺时针反转180度
$thumb->rotateImageNDegrees(180);

//保存(生成)图片,你可以保存其他格式,详细参考文档
$thumb->save( 'NewPath/Of/image.jpg ' );

这个类库还有更多功能就不多做介绍了,如果你也在开发PHP网站过程中需要处理图片不妨阅读一下这个类库的文档,保证你处理图片很简单,再也不用和那十几个烦人的php图片处理函数打交道了!
 
 
 
另外一个强大的PHP图片缩略图类:phpThumb
该类除了缩放图片外,还能将图片转换成不同的格式输出(比如将GIF格式的图片输出为PNG格式),其特色功能还包括色彩、特效等
官方网址:http://phpthumb.sourceforge.net/
We’ll be using phpThumb , the open source PHP script to generate thumbnails on the fly.
Download and extract phpThumb to somewhere in your website folder. Now to use a rounded corner thumbnail of an image, simply use the img tag of HTML with src as

 代码如下 复制代码
<img src=”phpThumb.php?src=test.jpg&w=200&h=150&fltr[]=ric|20|20&f=png” />
Adjust the path to phpThumb according to where you place the phpThumb files.
<html>
<head>
</head>
<body>
    <img src="phpThumb/phpThumb.php?src=../images/test.jpg&w=400&fltr[]=fram|3|2|CC9966|333333|CCCCCC" alt="">
</body> 
</html>

 
一般只需要下面的文件就可以了
其实phpThumb的功能比我原先想象的要强大一些,下面把他的其他一些有用的参数列一下:
src:目标图片的地址
w:输出图片的宽度
h:输出图片的高度(如果不指定他将按w参数等比缩放)
q:输出如果是JPG格式的,可以规定它的输出质量
bg:输出时的背景(如果需要)
sw、sh、sx、sy:局部输出,宽高、起始位置
f:输出格式,可以为jpeg、png、gif、ico
sfn:输出gif动画中的某一帧
fltr[]:滤镜,可以有很多效果,包括锐化、模糊、旋翻转、水印、边框、遮照、色彩调整等

天偶然间发现水煮鱼中的PHP 中数组函数 isset 效率比 array_key_exists 更高是这么写的:

由于 isset 属于 php 中的语言结构,而 array_key_exists 是函数,所以 isset 更快。并且 isset 在其他语言中也存在,更具可读性。

顿时很是疑惑——什么,isset竟然不是函数?而至于处理效率isset更快,倒变得不重要了(至少我一直使用isset,几乎没有关注过array_key_exists,具体可以见文章)

PHP.net中,也被分在Variable handling 函数,但是其实在中间有这样一段话:

Note: 因为是一个语言构造器而不是一个函数,不能被 可变函数 调用。

PHP里有echo、print、die、require等几个特殊的关键字,虽然它们用起来像是函数,但实际上更类似于if、while这样控制语句,而不是一个函数。也就是说,当解释器遇到:

print 'Hello world';
这样的一个表达式的时候,并不会把它转换成函数调用,而是直接映射到一系列预先定义好的操作。使用语言构成的时候可以加括号,也可以不加括号,但是使用函数的时候必须加括号。

可变函数可见:http://www.php.net/manual/zh/functions.variable-functions.php

$func = 'foo';
$func(); // This calls foo()
$func = 'bar';
$func('test'); // This calls bar()
$func = 'echoit';
$func('test'); // This calls echoit()
而如果

$func = 'print';
// 这样做会产生异常,因为print不是一个函数,而是语言的构成部分
$func('hello world');
这么写的话就会导致报错了。

 

在PHP源码里,关于isset是这么写的:


很明显不是函数的写法。
又长见识了。

php socket是一个什么东西我就不介绍了,下面来给大家整理了一些关于php socket的实现的客户端与服务端互相通讯的例子。

服务端

 代码如下 复制代码

<?php
    set_time_limit(0);
    $host="localhost";
    $port=1001;
     
    //创建一个连接
    $socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)or die("cannot create socketn");
    //绑定socket到端口
    $result=socket_bind($socket,$host,$port) or die("cannot bind port to socketn");
    //开始监听这个端口
    $result=socket_listen($socket,4) or die("could not set up socket listenn");
    //接受连接,另一个socket来处理通信
    $msgsock=socket_accept($socket) or die("cannot accept incoming connectionn");
    if($msgsock){
        echo date("Y-m-d H:i:s D a");
    }
    //读取客户端发送过来的信息
    $input=socket_read($msgsock,1024) or die("cannot read inputn");
    $input=trim($input);
    $output=strrev($input)."顺序反过来了吧n";
    //对接收到的信息进行处理,然后返回到客户端
    socket_write($msgsock,$output,strlen($output)) or die("cannot write");
    //关闭socket连接
    socket_close($msgsock);
    socket_close($socket);
 
?>

客户端

 代码如下 复制代码

<?php
    set_time_limit(0);
    $host="localhost";
    $port=1001;
     
    //创建一个socket
    $socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)or die("cannot create socketn");
     
    $conn=socket_connect($socket,$host,$port) or die("cannot connect servern");
     
    if($conn){echo "client connect ok!";}
     
    socket_write($socket,"hello world!") or die("cannot write datan");
     
    $buffer=socket_read($socket,1024,PHP_NORMAL_READ);
     
    if($buffer){
        echo "response was:".$buffer."n";
    }          
    socket_close($socket);
?>

在php中有很多种方法可以实现模拟提交的,下面我整理了四种post提交数据的例子,希望对各位同学会带来帮助。
 代码如下 复制代码

<?php
 
//以程序登陆一个论坛登录为例
function bbslogin($user_login, $password, $host, $port = "80") {
    //需要提交的post数据
    $argv = array('cookie' => array('user_login' => $user_login, 'password' => $password, '_wp_http_referer' => '/bbpress/', 're' => '', 'remember' => true));
    foreach ($argv['cookie'] as $key => $value) {
        $params[] = $key . '=' . $value;
    }
    $params = implode('&', $params);
    $header = "POST /bbpress/bb-login.php HTTP/1.1rn";
    $header .= "Host:$host:$portrn";
    $header .= "Content-Type: application/x-www-form-urlencodedrn";
    $header .= "Content-Length: " . strlen($params) . "rn";
    $header .= "Connection: Closernrn";
    $header .= $params;
    $fp = fsockopen($host, $port);
    fputs($fp, $header);
    while (!feof($fp)) {
        $str = fgets($fp);
        //以下是自己的逻辑代码,这里主要是模拟cookie,可用来同步登陆
        if (!(strpos($str, "Set-Cookie:") === false)) {
            $tmparray = explode(" ", $str);
            $cookiearray = explode("=", $tmparray[1]);
            $cookiepaths = explode("=", $tmparray[6]);
            $cookiename = urldecode($cookiearray[0]);
            $cookievalue = urldecode(substr($cookiearray[1], 0, strlen($cookiearray[1]) - 1));
            $cookietime = time() + 3600 * 24 * 7;
            $cookiepath = urldecode(substr($cookiepaths[1], 0, strlen($cookiepaths[1]) - 1));
            setcookie($cookiename, $cookievalue, $cookietime, $cookiepath);
        }
    }
    fclose($fp);
}
?>
 
 
<?php
// PHP POST数据的三种方法
// php有三种方法可以post数据,分别为Curl、socket、file_get_contents:
 
 
/**
 * Socket版本
 * 使用方法:
 * $post_string = "app=socket&version=beta";
 * request_by_socket('facebook.cn','/restServer.php',$post_string);
 */
function request_by_socket($remote_server, $remote_path, $post_string, $port = 80, $timeout = 30)
{
    $socket = fsockopen($remote_server, $port, $errno, $errstr, $timeout);
    if (!$socket) die("$errstr($errno)");
 
    fwrite($socket, "POST $remote_path HTTP/1.0rn");
    fwrite($socket, "User-Agent: Socket Examplern");
    fwrite($socket, "HOST: $remote_serverrn");
    fwrite($socket, "Content-type: application/x-www-form-urlencodedrn");
    fwrite($socket, "Content-length: " . (strlen($post_string) + 8) . 'rn');
    fwrite($socket, "Accept:*/*rn");
    fwrite($socket, "rn");
    fwrite($socket, "mypost=$post_stringrn");
    fwrite($socket, "rn");
    $header = "";
    while ($str = trim(fgets($socket, 4096))) {
        $header .= $str;
    }
    $data = "";
    while (!feof($socket)) {
        $data .= fgets($socket, 4096);
    }
    return $data;
}
 
 
 
/**
 * Curl版本
 * 使用方法:
 * $post_string = "app=request&version=beta";
 * request_by_curl('http://facebook.cn/restServer.php',$post_string);
 */
function request_by_curl($remote_server, $post_string)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $remote_server);
    curl_setopt($ch, CURLOPT_POSTFIELDS, 'mypost=' . $post_string);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERAGENT, "Jimmy's CURL Example beta");
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}
 
 
/**
 * 其它版本
 * 使用方法:
 * $post_string = "app=request&version=beta";
 * request_by_other('http://facebook.cn/restServer.php',$post_string);
 */
function request_by_other($remote_server, $post_string)
{
    $context = array(
        'http' => array(
            'method' => 'POST',
            'header' => 'Content-type: application/x-www-form-urlencoded' .
                        'rn'.'User-Agent : Jimmy's POST Example beta' .
                        'rn'.'Content-length:' . strlen($post_string) + 8,
            'content' => 'mypost=' . $post_string)
        );
    $stream_context = stream_context_create($context);
    $data = file_get_contents($remote_server, false, $stream_context);
    return $data;
}
 
?>
下面给大家整理了个php上传cvs文件完整例子,希望此例子对各位同学会有所帮助自己没注意看不知道什么原因要上传csv文件哦。

html代码:

 代码如下 复制代码

<form action="/message/index/csv" encType="multipart/form-data" method="post" target="uploadcvs">
<div><input type="file" name="csvfile"/> &nbsp;<input type="submit" value="上传"></div>
<div id="upload_info" style="width:100%;border:1px solid #809db9;display:none" ></div>
</form>

target="uploadcvs",添加target时调试代码不好调试,建议调试时去掉这行代码

php代码:

 代码如下 复制代码

public function csvAction(){
    //获取上传文件名$fileinfo,包含文件的扩展
    $fileinfo = pathinfo($_FILES['csvfile']['name']);
    //判断文件扩展是不是csv
    if(!in_array(strtolower($fileinfo['extension']),array('csv'))){
        $feed = array('status'=>'ext');
    //判断文件的大小
    }else if($_FILES['csvfile']['size'] > 1*1024*1024){
        $feed = array('status'=>'size');
    }else{
        //成功时数组
        $succdata = array();
        //错误时数组
        $errdata = array();
        //计数,计算多少行
        $count = 0;
        //打开临时文件,只读形式
        $handle = fopen($_FILES['csvfile']['tmp_name'],"r");

        //获取数据库中的username信息  
        $userMongo = new Application_Model_DbTable_MongoUsers();
        $dbUsers = $userMongo->findAll(array(),array('login.username'=>true));
        //把用户的username信息写入$users
        $users = array();
        foreach($dbUsers as $user){
            if(isset($user['login']['username']))
                $users[] = $user['login']['username'];
        }
        //逐行读取csv文件信息fgetcsv,fgetcsv($handle)
        while ($row = fgetcsv($handle)) {
            //读一行count就累加,这样就可以知道读了多少行
            $count ++ ;
            foreach($users as $user){
                //判断$row[0]是不是手机号&&$row[0]是不是等于$user也就是$users中是否有这条记录
                //判断成功时,把这条手机号写入数组$succdata
                if(preg_match('/^1(3|4|5|8)d{9}$/',$row[0]) && $user==$row[0]){
                    $succdata[$row[0]] = (string)$row[0];
                    break;                    
                }
            }
            //判断$succdata[$row[0]]是否存在,不存在写入$errdata
            if(!isset($succdata[$row[0]])){
                $errdata[$row[0]] = $row[0];
            }
        }
        //关闭文件
        fclose($handle);
        //把上传的cvs文件存到自己的项目中
        $url = $this->_helper->Upload->msgcsv($_FILES['csvfile'], $succdata, $errdata);
        //$count信息是关于csv文件有多少行记录,成功多少行,失败多少行
        $count = array('original'=>$count, 'success'=>count($succdata), 'error'=>count($errdata));
        //$feed,这里状态是成功的,count, 与 url 。
        //count是为了查看是否有失败的,url是为了查看失败的列表信息(因为上传时换回了3个文件,查看失败文件)
        $feed = array('status'=>'succ','count'=>$count, 'url'=>$url);   
    }
        //把数组json化 json_encode() json_encode()json编码
        $feed = json_encode($feed);
        //callback()函数 <script>parent.callback(".$feed.")</script>
        echo "<script>parent.callback(".$feed.")</script>";
        exit;
 }

js代码:

 代码如下 复制代码

//data就是".$feed."
function callback(data){   
    try{
     if(data.status =='ext'){
         alert('文件类型不正确');
         return false;
     }else if(data.status == 'size'){
         alert('文件不能超过1M');
         return false;
     }else if(data.status == 'succ'){
         //parseInt将字符串转化为整型 parseInt
         var html = parseInt(data.count.error) > 0 ? ' <a href="<?php echo UPLOAD_IMAGE_PATH;?>'+data.url.error+'">查看失败列表</a>' : '';
         //成功的条数,失败的条数
         $('#upload_info').html('成功导入:'+data.count.success+';失败:'+data.count.error+html);
         $('#upload_info').show();
      $('input[name=step3_hidden]').val(data.url.success);
         }      
    }catch(e){    
        alert('解析出错,请检查文件格式.');
    }
    return false;
}

Upload.php文件

 代码如下 复制代码

<?php
//上传处理
class Ata_Controller_Action_Helper_Upload extends Zend_Controller_Action_Helper_Abstract {

    //通知csv文件
    public function MsgCsv(&$source, $succdata, $errdata){

        //原cvs保留
        //文件存放目录
        $publicPath = realpath(APPLICATION_PATH."/../public/upload").'/';
        $csvPath = "msgcsv/".date('Y').'/'.date('m')."/";
        $path = $publicPath.$csvPath;
        //创建目录
        $this->mkdirs($path);
        //uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。uniqid()
        $filename = uniqid();
        //获取文件的扩展名
        $ext = pathinfo($source['name'], PATHINFO_EXTENSION);
        //创建空文件,目录,文件名,扩展
        $filepath = $path.$filename.'_org.'.$ext;
        //move_uploaded_file(),将上传的文件移动到新位置
        move_uploaded_file($source['tmp_name'], $filepath);

        //正确csv创建
        $content = '';
        //创建空文件,目录,文件名,扩展
        $succfile = $path.$filename.'_succ.'.$ext;
        //把$succdata的内容写入$content;
        foreach($succdata as $row){
            //连接字符串等同$content = $content.$row."n"
            $content .= $row."n";
        }
        $content = trim($content,"n");
        //file_put_contents(),把一个字符串写入文件中
        file_put_contents($succfile, $content);

        //错误csv创建
        $content = '';
        $errfile = $path.$filename.'_err.'.$ext;
        foreach($errdata as $row){
            $content .= $row."n";
        }
        $content = trim($content,"n");
        file_put_contents($errfile, $content);

        //返回3个文件(用于查看失败列表与把成功的列表内容写入隐藏域中传递到数据库中)
        return array(
            'orginal' => $csvPath.$filename.'_org.'.$ext,
            'success' => $csvPath.$filename.'_succ.'.$ext,
            'error' => $csvPath.$filename.'_err.'.$ext
        );
    }
    //删除文件
    //获取csv文件的前缀名
    public function rmMsgCsv($path){
        //$prefix获取csv文件的前缀名
        $prefix = str_replace('_succ.csv','',$path);
        //删除三个文件     
        unlink($prefix.'_org.csv');
        unlink($prefix.'_succ.csv');
        unlink($prefix.'_err.csv');
    }

    public function mkdirs($dir, $mode = 0777)  {
        return is_dir($dir) or ($this->mkdirs(dirname($dir)) and mkdir($dir, $mode));
    }
}

[!--infotagslink--]

相关文章

  • php 上传文件并生成缩略图代码

    if( isset($_FILES['upImg']) ) { if( $userGroup[$loginArr['group']]['upload'] == 0 ) { echo '{"error":"您所在的用户组无权上传图片!"}'; } else...2016-11-25
  • php高效快速获取图片尺寸的方法

    在 php 获取图片尺寸的方法我们可以使用 getimagesize 获取图片尺寸的效率是很低的,首先需要获取整个的图片信息,然后再进行操作,下面的例子更科学算法更好,我们一起来看...2016-11-25
  • php 图片上传代码(具有生成缩略图与增加水印功能)

    这款图片上传源代码是一款可以上传图片并且还具有给上传的图片生成缩略图与增加水印功能哦,可以说是一款完美的图片上传类哦。 代码如下 复制代码 ...2016-11-25
  • iOS实现音乐播放器图片旋转

    这篇文章主要为大家详细介绍了iOS实现音乐播放器图片旋转,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-12-08
  • php支持生成缩略图文件上传代码

    <!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1...2016-11-25
  • 利用C#代码实现图片旋转360度

    本文介绍利用C#代码实现图片旋转360度,具体实例代码已附上,仅供大家参考,希望对大家有所帮助...2020-06-25
  • php图片上传类同时可生成缩略图与加水印

    这款图片上传代码可以把上传的图片增加水印,生成小图片,同时还可以生成文字水印。 代码如下 复制代码 class upimages { var $annexf...2016-11-25
  • c#生成缩略图不失真的方法实例分享

    使用.net的方法GetThumbnailImage生成的缩略图失真严重,这里推荐一种不失真生成缩略图的方法...2021-09-22
  • 等比例生成缩略图的php程序

    等比例生成缩略图的php程序 这个程序很实现,但只是用来进来等比例生成缩略图哦,你要把文件上传到服务器,然后再由此函数来操作,有需要的朋友参考一下。 等比例生成缩...2016-11-25
  • php 上传图片自动生成缩略图

    一款实现的生成小图功能的实现代码,有需要的朋友可以参考,每个都有详细的说明参数。 代码如下 复制代码 <form action="uploads.php" method=...2016-11-25
  • 一款php按比例生成缩略图代码

    本文章里面image就是你要生成的图片地址哦,这是一php按比例生成缩略图代码,只要给你图片他就能生成指定大小的图片哦,并且不变形ekt 代码如下 复制代码 ...2016-11-25
  • php图片按比较生成缩略图片代码

    图片按在比较进行放大缩小,这得利用php教程 gd库的函数现实现,我们会利用到imagecreatetruecolor(),imagecopyresampled()来操作 function my_image_resize($src_file,...2016-11-25
  • android获取图片尺寸的两种方式及bitmap的缩放操作

    这篇文章主要介绍了android获取图片尺寸的两种方式及bitmap的缩放操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-28
  • php 生成缩略图代码可自动填充空白处

    网站大多数生成缩略图都是按比例操作的,今天我们来看看可以固定图片大小">图片大小,不够的地方自动填充空白哦。有需要的朋友可以参考一下。 <?php教程 error_report...2016-11-25
  • ASP.NET实现上传图片并生成缩略图的方法

    这篇文章主要介绍了ASP.NET实现上传图片并生成缩略图的方法,提供了一个asp.net上传图片与生成缩略图的方法,并给出了改进程序供大家对比分析,需要的朋友可以参考下...2021-09-22
  • php图片处理类(生成缩略图,增加水印,获取图片信息)

    本文章提供这款图片处理类,他可以做的事情有把图片生成缩略图,可能给图片增加水印以及获取图片信息,算是比较实用代码又简洁的函数*/ 代码如下 复制代码 ...2016-11-25
  • 美图看看批量修改图片尺寸方法分享

    今天小编在这里就来给美图秀秀的这一款软件的使用者们来说一下批量修改图片尺寸的方法,各位想知道具体处理方法的使用者们,那么下面就快来跟着小编一起看一看教程吧。 ...2016-09-14
  • PHP生成缩略图的实现

    PHP令我们惊喜的就是在图形图象处理方面要忧于ASP,用GD库PHP就可以轻松的实现缩略图。这一篇文章我们的目的就是用GD来生成缩略图,PHP可以把缩略图直接生成输送到浏览器...2016-11-25
  • 图片旋转、鼠标滚轮缩放、镜像、切换图片js代码

    这篇文章主要为大家介绍了图片旋转、鼠标滚轮缩放、镜像、切换图片js代码具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-01-21
  • php文件上传类可生成缩略图代码

    <?php 代码如下 复制代码 if ($_GET['action'] == 'save') { $up = new upload(); $up->set_dir(dir...2016-11-25