分类目录归档:Php

微信支付签名函数-简单方便

在php使用微信支付的时候,你会发现微信支付自带的API 十分复杂,其实是一个很简单的东西,程序员却装装13,弄得这么复杂,经过本人看代码,把微信支付相关过程简化出来,希望给有需要用的人用上。www.yiyou.org

<?php
/*
 * 生成微信支付签名
 * $input 输入参数格式 array('appid'=>'2323232','mch_id'=>'2222')
 * $secret  支付密钥,这个是自己设的,具体看微信api
 */
function weixin_sign($input,$secret){
    $para_filter=  wx_paraFilter($input);
    $para_sort = wx_argSort($para_filter); //参数排序
    $prestr = wx_createLinkstring($para_sort); ////把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
    $mysign = strtoupper(md5($prestr.'&key='.$secret));  //签名
    return $mysign;
}
/**
 * 除去数组中的空值和签名参数
 * @param $para 签名参数组
 * return 去掉空值与签名参数后的新签名参数组
 */
function wx_paraFilter($para) {
	$para_filter = array();
	while (list ($key, $val) = each ($para)) {
		if($key == "sign" || $key == "sign_type" || $val == "")continue;
		else	$para_filter[$key] = $para[$key];
	}
	return $para_filter;
}
/**
 * 对数组排序
 * @param $para 排序前的数组
 * return 排序后的数组
 */
function wx_argSort($para) {
	ksort($para);
	reset($para);
	return $para;
}
function wx_createLinkstring($para) {
	$arg  = "";
	while (list ($key, $val) = each ($para)) {
		$arg.=$key."=".$val."&";
	}
	//去掉最后一个&字符
	$arg = substr($arg,0,count($arg)-2);
	
	//如果存在转义字符,那么去掉转义
	if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
	
	return $arg;
}
function to_xml($arr_data){
    $xml = "<xml>";
    foreach ($arr_data as $key=>$val)
    {
            if (is_numeric($val)){
                    $xml.="<".$key.">".$val."</".$key.">";
            }else{
                    $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
            }
    }
    $xml.="</xml>";
    return $xml;
}
function xml2array($xml){
    libxml_disable_entity_loader(true);
    $data=json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
    return $data;
}
function nonce_str(){
    return md5(md5(time()).mt_rand(0, 100));
}
function http_request_xml($url, $postdata = null,$useCert=false){
    #$data = http_build_query($postdata);
    //echo ROOT_PATH.'/Libs/weixinapi/cert/apiclient_cert.pem';
    if(function_exists('curl_exec')){
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            if($postdata){
                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);

            }else{
                curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
                curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
            }
            if($useCert == true){
			//设置证书
			//使用证书:cert 与 key 分别属于两个.pem文件
			curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
			curl_setopt($ch,CURLOPT_SSLCERT, ROOT_PATH.'/Libs/weixinapi/cert/apiclient_cert.pem');
			curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
			curl_setopt($ch,CURLOPT_SSLKEY,ROOT_PATH.'/Libs/weixinapi/cert/apiclient_key.pem');  
            }
            $data = curl_exec($ch);
            if( curl_errno ( $ch )){
                echo  'Curl error: '  .  curl_error ( $ch );
            }
            curl_close($ch);
    }else{
            if($postdata){
                    $url = $url.'?'.$postdata;
                    $opts = array(
                            'http' => array(
                                    'method' => 'POST',
                                    'header'=> "Content-type: application/x-www-form-urlencoded\r\n" . "Content-Length: " . strlen($data) . "\r\n",
                                    'content' => $data
                                    )
                        );
                    $context = stream_context_create($opts);
                    $data = file_get_contents($url, false, $context);
            }else{
                $ctx = stream_context_create(array( 
                        'http' => array( 
                        'timeout' => 5 //设置一个超时时间,单位为秒 
                        ))); 
                $data=file_get_contents($url, 0, $ctx); 
            }
    }
    return $data;
}

因为我的微信是在框架内使用的,其中有一些变量要注意一下,ROOT_PATH是一个绝对路径,这个地方可以改改。调用办法

function wxpay($order){
        /*
         * 微信支付统一下单接口
         * https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1
         */
        $body='付款';
        if($order['type']==2){
            $body='打赏楼主';
        }
        $parames=array(
            'appid'=> $this->APPID,
            'mch_id'=>  $this->MCHID,
            'nonce_str'=>  nonce_str(),
            'body'=>$body,
            'out_trade_no'=>$order['orderid'],
            'total_fee'=>$order['total_money']*100,  //单位分
            'spbill_create_ip'=>$_SERVER['REMOTE_ADDR'],
            'notify_url'=>  get_siteurl().'/jrmmpay/notify',
        );
        if(is_weixin()){  //在微信内部
            $parames['trade_type']='JSAPI';
            $parames['openid']=  $this->get_openid();
        }else{
            $parames['trade_type']='NATIVE';
             $parames['product_id']=$order['id'];
        }
        
        $parames['sign'] = weixin_sign($parames, $this->PAYKEY);   //加入排序
        
        $xml = to_xml($parames);
        //print_r($xml);exit;
        $respon=http_request_xml('https://api.mch.weixin.qq.com/pay/unifiedorder',$xml);

        $data=  xml2array($respon);
        //print_r($data);
        if($data['result_code']=='FAIL'){
            //查成功
            header('Content-Type: text/html; charset=UTF-8');
            echo $data['err_code_des'];exit;
        }
        
        if(is_weixin()){
            $param=array(
              'appId'=> $this->APPID,
               'timeStamp'=>  '"'.time().'"',
               'nonceStr'=>  nonce_str(),
               'package'=>'prepay_id='.$data['prepay_id'],
               'signType'=>"MD5",

           );

            $param['paySign'] = weixin_sign($param, $this->PAYKEY);   
           $this->tpl->assign('param',  json_encode($param));
           $this->tpl->assign('order',$order);
            $this->tpl->draw('payment/weixinjsapi');
        }else{
            echo "<img width=\"400\" height=\"400\" src=\"?app=payment&act=qrcode&data=".  urlencode($data['code_url'])."\">";
        }

        
    }
 /*
 * 生成二维码图片
 */
 function qrcode(){
 require_once ROOT_PATH.'Libs/weixinapi/phpqrcode/phpqrcode.php';
 $url = urldecode($_GET["data"]);
 QRcode::png($url,FALSE,QR_ECLEVEL_L,11);
 }

上面的函数已经装扫码支付和普通支付集成在一起了。

下面是js API调用

<!DOCTYPE html>
<html>
    <head>
        <title>正在进行支付</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script type="text/javascript">
        function onBridgeReady(){
           WeixinJSBridge.invoke(
               'getBrandWCPayRequest', {$param},
               function(res){     
                   //alert('{$param}');
                   if(res.err_msg == "get_brand_wcpay_request:ok" ) {
                       //window.location.href='/jinrimaoming.php?app=index&act=view2&id={$order.articleid}';
                       alert('ok');
                   }else{
                      // window.location.href='/jinrimaoming.php?app=index&act=view2&id={$order.articleid}';
                      alert('fail');
                   }
               }
           );
        }
        window.onload = function(){
            if (typeof WeixinJSBridge == "undefined"){
               if( document.addEventListener ){
                   document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
               }else if (document.attachEvent){
                   document.attachEvent('WeixinJSBridgeReady', onBridgeReady); 
                   document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
               }
            }else{
               onBridgeReady();
            }            
    }    
    </script>
    </head>
    <body>
        <div>支付正在进行中...</div>
    </body>
</html>

 

php跟据图像中心生成缩略图thumb

如果一张长方形的图像,不管是立像还是卧像,可以跟据图像裁剪成一个正方形,再生成一个缩略图。

//from yiyou.org fy@yiyou.org
function cut2thumbnail($src_file,$dsc_file,$width,$height){
        if(!file_exists($src_file)){
            return false;
        }
        if($width <=0||$height <=0){
            return false;
        }
        $imagetype=  exif_imagetype($src_file);

        $src_img ='';
        switch ($imagetype){
            case IMAGETYPE_PNG:
                $src_img=imagecreatefrompng($src_file);
                break;
            case IMAGETYPE_JPEG:
                $src_img=  imagecreatefromjpeg($src_file); 
                break;
            case IMAGETYPE_BMP:
                $src_img=ImageCreateFromBMP($src_file);
                break;
            default:
                return false;
                break;
        }
        list($src_width,$src_height)=  getimagesize($src_file);
        //如果原图比请求的图像还要小
        if($src_width < $width || $src_height < $height){
            @copy($src_file, $dsc_file);
            return true;
        }
        
        
        $target_image  = imagecreatetruecolor($width,$height);//目标缩小后的图像
        
        $cropped_img=$src_img; //如果$cropped_image未改变,说明自身是正方型
        
        if($src_width > $src_height){ //宽大于高
            $diff=$src_width-$src_height; //差异
            $one_part =floor($diff/2); //取中间
            $cropped_img=  imagecreatetruecolor($src_height, $src_height);
            imagecopy($cropped_img,$src_img,0,0,$one_part,0,$src_height,$src_height);
        }
        if($src_width < $src_height){ //宽小于高
            $diff=$src_height-$src_width; //差异
            $one_part =floor($diff/2); //取中间
            $cropped_img=  imagecreatetruecolor($src_width, $src_width);
            imagecopy($cropped_img,$src_img,0,0,0,$one_part,$src_width,$src_width);
        }
        
        $cropped_width=imagesx($cropped_img);
        $cropped_height=imagesy ($cropped_img);
        
        imagecopyresampled($target_image, $cropped_img, 0, 0, 0, 0, $width, $height, $cropped_width, $cropped_height);

        switch ($imagetype){
            case IMAGETYPE_PNG:
                imagepng($target_image,$dsc_file);
                break;
            case IMAGETYPE_JPEG:
                imagejpeg($target_image, $dsc_file,90);
                break;
            case IMAGETYPE_BMP:
                imagejpeg($target_image,$dsc_file); 
                break;
        }
        return true;
        //imagedestroy($src_img);
        //imagedestroy($cropped_img);
        //imagedestroy($target_image);
}

 

php去掉html标记保留文字内容函数

项目需要,所以自己写了一个,感觉还不错www.yiyou.org

function ClearHtml($content) {
    $content = preg_replace("/<\w+>/i", "", $content);
    $content = preg_replace("/<\w+[^>]*>/i", "", $content); 
    $content = preg_replace("/<\/\w+>/i", "", $content);
    return $content;
}

 

php匹配替换文本中的网址加上a-href链接标签

最近有一个项目,需要把用户提交的文本中有网址的内容加上 链接标签,差不多花了一天时间把这个正则写好,效果还不错。给大家分享一个

<?php
$regex='/((http:\/\/|www\.|https:\/\/)(\w+|\.|\?|\=|\/|\&|\:|\d+)+)/';
$str='今天准备来测试一个网址功能的问题,首先使用正常的网址格式是http://aaa.bbs.yiyou.org,有时候我们也可能使用这种方式www.yiyou.org>,如果你会带一个url的网址可能是这样的www.yiyou.org/index.php?aa=aaa&aaa&bb=bbb,但有时候可能是一个伪静态的页面,可能是这样的 http://www.yiyou.org/yiyou/,但很多时候都把http这个内容忘记了,结果是这样的www.yiyou.org/yiyou,至此,网址可以测试了一部分了。再测试一下https://www.yiyou.org/?aa=test,如果加入端口怎么办呢?http://www.yiyou.org:5000/?aaa=bb';
#echo preg_replace($regex,$rep,$str);
echo preg_replace_callback($regex,function($matches){
 #print_r($matches);exit;
 if(!empty($matches[0]) && (strstr($matches[0],'http://')||strstr($matches[0],'https://'))){
        return '<a href="'.$matches[0].'">'.$matches[0].'</a>';
}else{
        return '<a href="http://'.$matches[0].'">'.$matches[0].'</a>';
}

},$str);
echo "<br>";
echo '--------------------<br>';
echo $str;

 

PHP表单常用正则表达式(URL、HTTP、手机、邮箱等)

转自http://www.oschina.net/code/snippet_2009720_38796

<?php
/**
* @description: 正则表达式匹配
*/
class Regex {
/**
* @手机号
*/
public static function Phone($subject) {
$pattern='/^(0|86|17951)?(13[0-9]|15[012356789]|1[78][0-9]|14[57])[0-9]{8}$/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @数字
*/
public static function Number($subject) {
$pattern='/^[0-9]+$/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @年份 格式:yyyy
*/
public static function Year($subject) {
$pattern='/^(\d{4})$/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @月份 格式:mm
*/
public static function Month($subject) {
$pattern='/^0?([1-9])$|^(1[0-2])$/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @日期 格式:yyyy-mm-dd
*/
public static function Day($subject) {
$pattern='/^(\d{4})-(0?\d{1}|1[0-2])-(0?\d{1}|[12]\d{1}|3[01])$/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @日期时间 格式:yyyy-mm-dd hh:ii:ss
*/
public static function DateTime($subject) {
$pattern='/^(\d{4})-(0?\d{1}|1[0-2])-(0?\d{1}|[12]\d{1}|3[01])\s(0\d{1}|1\d{1}|2[0-3]):[0-5]\d{1}:([0-5]\d{1})$/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @邮箱
*/
public static function Email($subject) {
$pattern='/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @邮编
*/
public static function Postcode($subject) {
$pattern='/[1-9]\d{5}(?!\d)/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @有效图片地址
*/
public static function Photo($subject) {
$pattern='/\b(([\w-]+:\/\/?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/)))/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @URL地址
*/
public static function UrlAddress($subject) {
$pattern='/\b(([\w-]+:\/\/?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/)))/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @有效HTTP地址
*/
public static function EffectiveHttp($subject) {
$pattern='/\b(([\w-]+:\/\/?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/)))/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @身份证
*/
public static function Identity($subject) {
$pattern='/(^\d{15}$)|(^\d{17}([0-9]|X)$)/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @IPv4
*/
public static function Ipv4($subject) {
$pattern='/^(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))$/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @IPv6
*/
public static function Ipv6($subject) {
$pattern='/^([\da-fA-F]{1,4}:){7}[\da-fA-F]{1,4}$/';
return Regex::PublicMethod($pattern, $subject);
}
/**
* @匹配正则公共方法
*/
public static function PublicMethod($pattern, $subject){
if(preg_match($pattern, $subject)){
return true;
}
return false;
}
}

设置php_session的生命周期

PHP中,Session变量保存在服务器端(默认以文件格式保存),而Session ID以cookie形式保存在客户端。

销毁session的方法有2种

第一种是通过程序

session_destory()方法清除所有session

unset(session[‘x’])来清除指定的session[‘x’]。

第二种是通过关闭浏览器

关闭后会直接清除所有session。

在Cookie没有禁用的情况下,session ID是保存在Cookie中的。

想要改变session生命周期,可以通过设置Cookie中session ID的有效时间来实现

设置session生命周期的也有2种方法。

第一种  setcookie()

     $lifetime=60;//保存1分钟
     session_start();
     setcookie(session_name(),session_id(),time()+$lifetime,"/");

直接用setcookie设置session id的生命周期。

第二种  session_set_cookie_params()

        $lifetime=60;//保存1分钟
        session_set_cookie_params($lifetime);
        session_start();
        session_regenerate_id(true);

session_regenerate_id();方法用于改变当前session_id的值,并保留session中数组的值。参数默认为false,如果设置为true则改变session_id的值,并清空当前session数组。

http://my.oschina.net/jiec/blog/227252?fromerr=3oTGBXPb

php文件上传

这段时间需要用到文件上传,也用过文件上传组件,因为有三个地方上传,所以上传这个地方很乱。今天抽时间重写了一次,上传格式包括bmp,jpg,png

function file_upload($temp_file,$pv_width,$pv_height,$th_width,$th_height,$addon_path=''){
      $res=array(
        'status'=>FALSE,
        'msg'=>'',
        'pv_path'=>'',
        'thumb_path'=>''
      );
      if(!file_exists($temp_file)){
          $res['msg']='文件上传失败';
          return $res;
      }
      if(filesize($temp_file) < 1024){
          $res['msg']='文件大小小于1kb';
          return $res;
      }
    $imagetype=  exif_imagetype($temp_file);

    if(!in_array($imagetype, array(IMAGETYPE_PNG,IMAGETYPE_JPEG ,IMAGETYPE_BMP))){
        $res['msg']='当前只支持jpg,png,bmp格式图片';
        return $res;
    }
    $suffix='';
    $im ='';
    switch ($imagetype){
        case IMAGETYPE_PNG:
            $suffix='.png';
            $im=imagecreatefrompng($temp_file);
            break;
        case IMAGETYPE_JPEG:
            $suffix='.jpg';
            $im=  imagecreatefromjpeg($temp_file); 
            break;
        case IMAGETYPE_BMP:
            $suffix='.jpg';
            //函数在 http://www.yiyou.org/php5%E5%87%BD%E6%95%B0%E8%87%AA%E5%AE%9A%E4%B9%89imagecreatefrombmp/
            $im=ImageCreateFromBMP($temp_file);
            break;
    }
    //iphone拍照上传图片会自动反转问题处理
    if($imagetype ==IMAGETYPE_JPEG){ //只有jpg 才支持exif
        $exif = exif_read_data($temp_file);
        if(!empty($exif['Orientation'])) {
            switch($exif['Orientation']) {
                case 8:
                    $source = imagerotate($im,90,0);
                    break;
                case 3:
                    $source = imagerotate($im,180,0);
                    break;
                case 6:
                    $source = imagerotate($im,-90,0);
                    break;
            }
        }
    }
    $filename=  md5(time().rand(1, 99)).$suffix;
    //文件上传目录,按日期分类
    $web_path='/Public/upload/'.$addon_path.'/'. date("Y/m/d").'/';
    $local_dir= ROOT_PATH.$web_path;
    if(!is_dir($local_dir)){
        @mkdir($local_dir,0755,TRUE);
    }
    
    $local_file=$local_dir.$filename;
    
    //裁剪图片
    list($src_w,$src_h)=getimagesize($temp_file); //获取图像尺寸
    
    //原图宽度比: 修正后宽/原图宽= 比率
    $new_img='';
    if($src_w > $pv_width){
        $src_scale = $pv_width/$src_w;
        $pv_height=intval($src_h*$src_scale);
         //生成大图
        $new_img=imagecreatetruecolor($pv_width, $pv_height);
        imagecopyresampled($new_img, $im, 0, 0, 0, 0, $pv_width, $pv_height, $src_w, $src_h);
    }  else {
        $new_img=$im; //复制一次
    }
    
    switch ($imagetype){
        case IMAGETYPE_PNG:
            imagepng($new_img,$local_file);
            break;
        case IMAGETYPE_JPEG:
            imagejpeg($new_img, $local_file);
            break;
        case IMAGETYPE_BMP:
            imagejpeg($new_img,$local_file); 
            break;
    }

    //缩略图
    $local_file_thumb=$local_dir.'thumb_'.$filename;
    if($th_width >0){
        //参考http://www.yiyou.org/%E6%B7%98%E5%AE%9Dtclip-php_ext%E5%AE%89%E8%A3%85/
        @tclip($local_file,$local_file_thumb,$th_width,$th_height);
    }
    return  array(
        'status'=>true,
        'msg'=>'上传成功',
        'pv_path'=>$web_path.$filename,
        'thumb_path'=>$web_path.'thumb_'.$filename,
        'filename'=>$filename
      );
}
/***  以下为使用方法 ****/
//基于文件流方式上传
function image(){
    $temp_file  =  tempnam ( sys_get_temp_dir (),'lsb_upload_');
    file_put_contents($temp_file, file_get_contents("php://input"));
    $result=$this->file_upload($temp_file, 750, 0, 200, 200);
    if($result['status'] ==TRUE){
        //成功处理
    }else{
        //失败处理
    }
}
//这是wangEditor 上传
function wysiwyg(){
     if(isset($_FILES['wangEditorH5File'])){
        $result=$this->file_upload($_FILES['wangEditorH5File']['tmp_name'], 710, 0, 0, 0,'project');
        if($result['status']==true){
            echo $result['pv_path'];
        }else{
            echo  'error|'.$result['msg'];
        }
     }  else {
        echo  'error|上传失败';
     }
}

 

php5函数自定义ImageCreateFromBMP

最近项目需要上传bmp,但是php5 已经不再支持php了,所以找了很久才找到(在php手册里找到的)

原文

The solution you are looking for is here: http://tr.php.net/imagecreate

Scroll below to the comments to find the function named "ImageCreateFromBMP". It will help you create images from the bmp images.

Once you create the image you can use the imagejpeg() function to save the image in jpeg format.

 

function ImageCreateFromBMP($filename)
{

   if (! $f1 = fopen($filename,"rb")) return FALSE;


   $FILE = unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread($f1,14));
   if ($FILE['file_type'] != 19778) return FALSE;

//2 : Chargement des ent�tes BMP
   $BMP = unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel'.
                 '/Vcompression/Vsize_bitmap/Vhoriz_resolution'.
                 '/Vvert_resolution/Vcolors_used/Vcolors_important', fread($f1,40));
   $BMP['colors'] = pow(2,$BMP['bits_per_pixel']);
   if ($BMP['size_bitmap'] == 0) $BMP['size_bitmap'] = $FILE['file_size'] - $FILE['bitmap_offset'];
   $BMP['bytes_per_pixel'] = $BMP['bits_per_pixel']/8;
   $BMP['bytes_per_pixel2'] = ceil($BMP['bytes_per_pixel']);
   $BMP['decal'] = ($BMP['width']*$BMP['bytes_per_pixel']/4);
   $BMP['decal'] -= floor($BMP['width']*$BMP['bytes_per_pixel']/4);
   $BMP['decal'] = 4-(4*$BMP['decal']);
   if ($BMP['decal'] == 4) $BMP['decal'] = 0;

//3 : Chargement des couleurs de la palette
   $PALETTE = array();
   if ($BMP['colors'] < 16777216)
   {
    $PALETTE = unpack('V'.$BMP['colors'], fread($f1,$BMP['colors']*4));
   }

//4 : Cr�ation de l'image
   $IMG = fread($f1,$BMP['size_bitmap']);
   $VIDE = chr(0);

   $res = imagecreatetruecolor($BMP['width'],$BMP['height']);
   $P = 0;
   $Y = $BMP['height']-1;
   while ($Y >= 0)
   {
    $X=0;
    while ($X < $BMP['width'])
    {
     if ($BMP['bits_per_pixel'] == 24)
        $COLOR = unpack("V",substr($IMG,$P,3).$VIDE);
     elseif ($BMP['bits_per_pixel'] == 16)
     {  
        $COLOR = unpack("n",substr($IMG,$P,2));
        $COLOR[1] = $PALETTE[$COLOR[1]+1];
     }
     elseif ($BMP['bits_per_pixel'] == 8)
     {  
        $COLOR = unpack("n",$VIDE.substr($IMG,$P,1));
        $COLOR[1] = $PALETTE[$COLOR[1]+1];
     }
     elseif ($BMP['bits_per_pixel'] == 4)
     {
        $COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1));
        if (($P*2)%2 == 0) $COLOR[1] = ($COLOR[1] >> 4) ; else $COLOR[1] = ($COLOR[1] & 0x0F);
        $COLOR[1] = $PALETTE[$COLOR[1]+1];
     }
     elseif ($BMP['bits_per_pixel'] == 1)
     {
        $COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1));
        if     (($P*8)%8 == 0) $COLOR[1] =  $COLOR[1]        >>7;
        elseif (($P*8)%8 == 1) $COLOR[1] = ($COLOR[1] & 0x40)>>6;
        elseif (($P*8)%8 == 2) $COLOR[1] = ($COLOR[1] & 0x20)>>5;
        elseif (($P*8)%8 == 3) $COLOR[1] = ($COLOR[1] & 0x10)>>4;
        elseif (($P*8)%8 == 4) $COLOR[1] = ($COLOR[1] & 0x8)>>3;
        elseif (($P*8)%8 == 5) $COLOR[1] = ($COLOR[1] & 0x4)>>2;
        elseif (($P*8)%8 == 6) $COLOR[1] = ($COLOR[1] & 0x2)>>1;
        elseif (($P*8)%8 == 7) $COLOR[1] = ($COLOR[1] & 0x1);
        $COLOR[1] = $PALETTE[$COLOR[1]+1];
     }
     else
        return FALSE;
     imagesetpixel($res,$X,$Y,$COLOR[1]);
     $X++;
     $P += $BMP['bytes_per_pixel'];
    }
    $Y--;
    $P+=$BMP['decal'];
   }

//Fermeture du fichier
   fclose($f1);

return $res;
}

原文地址:http://stackoverflow.com/questions/2100875/unable-to-create-gd-image-resource-from-bmp-with-mime-type-image-x-ms-bmp-in-p

淘宝tclip php_ext安装

项目需要一个缩略图的功能,发现自己做的缩略图总是载剪得不好。后来搜到tclip 这个东西。看上去不错,但是安装比较复杂,环境基于debian 7.x
另外大家要访问这里的源码,比较新
https://github.com/exinnet/tclip

Tclip

1、下载代码
git clone https://github.com/exinnet/tclip.git

2、安装opencv2.x
apt-get install cmake pkg-config
apt-get install gnome-core-devel
apt-get install libavformat-dev
apt-cache search libswscale
apt-get install libhighgui-dev
apt-get install libbz2-dev
重装zlib与 bzip
出错
/usr/bin/ld: /usr/local/lib/libbz2.a(bzlib.o): relocation R_X86_64_32S against `a local symbol’ can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libbz2.a: could not read symbols: Bad value

先删除 /usr/local/lib/libbz2.a
修改zlib 和bzip Makefile文件
修改zlib-1.2.3的Makefile文件
把gcc的编译参数加上 -fPIC
原文:CFLAGS=-O3 -DUSE_MMAP
修改为:CFLAGS=-O3 -DUSE_MMAP -fPIC
make
make install
再执行
/usr/local/lib# ln -s libbz2.so libbz2.a

跟据作者介绍,最好安装http://www.bo56.com/download/opencv2.tar.bz2 这个版本的opencv

3、进入目录,执行
~/tclip/php_ext# ./configure

参考
http://www.aiuxian.com/article/p-724490.html
http://yangguanghaojie.blog.163.com/blog/static/1899080520130244240149/
http://www.blogjava.net/haha0515/archive/2009/09/30/296957.html