-
-
- /**
- 画像処理クラス
- */
- class imagecls
- {
- /**
- *ファイル情報
- */
- var $file = array();
- /**
- * ディレクトリを保存します
- */
- var $dir = '';
- /**
- * エラーコード
- */
- var $error_code = 0;
- /**
- *最大ファイルアップロードサイズ KB
- */
- var $max_size = -1;
関数 es_imagecls()
- {
}
-
- プライベート関数 checkSize($size)
- {
- return !($size > $this->max_size) || (-1 == $this->max_size);
- }
-
- /**
- * アップロードされたファイルを処理します
- * @param array $file アップロードされたファイル
- * @param string $dir 保存されたディレクトリ
- * @return bool
- */
- function init($file, $dir = 'temp')
- {
- if(!is_array($file) || 空($file) || !$this->isUploadFile($file['name']) == '' $file['size'] == 0)
- {
- $this->file = array();
- $this->error_code = -1;
- return false;
- }
- else
- {
- $file['size'] = intval( $file['size']);
- $file['name'] = トリム($file['name']);
- $file['thumb'] = '';
- $file['ext'] = $this->fileExt($file['name']);
- $file['name'] = htmlspecialchars($file['name'], ENT_QUOTES);
- $file['is_image'] = $this- >isImageExt($file['ext']);
- $file['file_dir'] = $this->getTargetDir($dir);
- $file['prefix'] = md5(microtime(true))。 rand(10,99);
- $file['target'] = "./public/".$file['file_dir'].'/'.$file['prefix'].'.jpg'; //相对
- $file['local_target'] = APP_ROOT_PATH."public/".$file['file_dir'].'/'.$file['prefix'].'.jpg';// 物理
- $this ->file = &$file;
- $this->error_code = 0;
- return true;
- }
- }
/**
- * ファイルを保存
- * @return bool
- */
- function save()
- {
- if(empty($this->file) || empty($this->file['tmp_name']))
- $this->error_code = -101;
- elseif(!$this-> ;checkSize($this->file['size']))
- $this->error_code = -105;
- elseif(!$this->file['is_image'])
- $this->error_code = -102;
- elseif(!$this->saveFile($this->file['tmp_name'], $this->file['local_target']))
- $this->error_code = -103 ;
- elseif($this->file['is_image'] &&
- (!$this->file['image_info'] = $this->getImageInfo($this->file['local_target'], true)))
- {
- $this->error_code = -104;
- @unlink($this->file['local_target']);
- }
- else
- {
- $this->error_code = 0;
- return true;
- }
- return false;
- }
/**
- * エラーコードを取得します
- * @戻り番号
- */
- function error()
- {
- return $this->error_code;
- }
/**
- * ファイル拡張子を取得します
- * @return string
- */
- function fileExt($file_name)
- {
- returnaddslashes(strto lower(substr(strrchr($file_name, '.'), 1, 10)));
- }
-
/**
- * 拡張子に基づいてファイルが画像であるかどうかを判断します
- * @param string $ext extension
- * @return bool
- */
- 関数 isImageExt($ext)
- {
- static $img_ext = array('jpg', 'jpeg', 'png', 'bmp','gif','gif');
- return in_array($ext, $img_ext) ? 1 : 0;
- }
/**
- * 画像情報を取得します
- * @param string $target ファイルパス
- * @returnmixed
- */
- function getImageInfo($target)
- {
- $ext = es_imagecls::fileExt($target);
- $is_image = es_imagecls::isImageExt($ext);
- < ;p> if(!$is_image)
- return false;
- elseif(!is_readable($target))
- return false;
- elseif($image_info = @getimagesize($target))
- {
- list($width, $height, $type ) = !empty($image_info) ? $image_info :
- array('', '', '');
- $size = $width * $height;
- if($is_image && !in_array($type, array(1,2,3,6,13) ))
- return false;
$image_info['type'] =
- strto lower (substr(image_type_to_extension($image_info[2]),1));
- return $image_info;
- }
- else
- return false;
- }
- * ファイルのアップロードが許可されているかどうかを取得します
- * @param string $source file path
- * @return bool
- */
- function isUploadFile($source)
- {
- return $source && ($source != 'none') &&
- (is_uploaded_file($source) || is_uploaded_file(str_replace('\', ' ', $source)));
- }
/**
- * 保存されたパスを取得します
- * @param string $dir 指定された保存ディレクトリ
- * @return string
- */
- function getTargetDir($dir)
- {
- if (!is_dir(APP_ROOT_PATH."public/".$dir)) {
- @mkdir(APP_ROOT_PATH."public/".$dir);
- @chmod(APP_ROOT_PATH."public/".$dir, 0777);
- }
- return $dir;
- }
/**
- * ファイルを保存します
- * @param string $source ソース ファイル パス
- * @param string $target ディレクトリ ファイル パス
- * @return bool
- */
- プライベート関数 saveFile($source, $target)
- {
- if(!es_imagecls::isUploadFile($source))
- $succeed = false;
- elseif(@copy($source, $ target)))
- $succeed = true;
- elseif(function_exists('move_uploaded_file') &&
- @move_uploaded_file($source, $target))
- $succeed = true;
- elseif (@is_readable($source) &&
- (@$ fp_s = fopen($source, 'rb')) && (@$fp_t = fopen($target, 'wb')))
- {
- while (!feof($fp_s))
- {
- $s = @fread( $fp_s, 1024 * 512);
- @fwrite($fp_t, $s);
- }
- fclose($fp_s);
- fclose($fp_t);
- $succeed = true;
- }
- < ;p> if($succeed)
- {
- $this->error_code = 0;
- @chmod($target, 0644);
- @unlink($source);
- }
- else
- {
- $this->error_code = 0 ;
- }
return $succeed;
- }
パブリック関数thumb($image,$maxWidth=200,$maxHeight=50,$gen = 0,
- $interlace=true,$filepath = '',$is_preview = true)
- {
- $info = es_imagecls::getImageInfo( $image);
if($info !== false)
- {
- $srcWidth = $info[0];
- $srcHeight = $info[1];
- $type = $info['type'];
- < ;p> $インターレース = $インターレース? 1:0;
- unset($info);
if($maxWidth > 0 && $maxHeight > 0)
- $scale = min($maxWidth/$srcWidth, $maxHeight/$srcHeight);
- // 計算缩放率
- elseif($maxWidth == 0)
- $scale = $maxHeight/$srcHeight;
- elseif($maxHeight == 0)
- $scale = $maxWidth/$srcWidth;
-
- $paths = pathinfo($image);
- $paths['filename'] = トリム(strto lower($paths['basename']),
- ".".strto lower($paths['extension']));
- $basefilename =explode("_",$paths['filename']);
- $basefilename = $basefilename[0];
- if(empty($filepath))
- {
- if($is_preview)
- $thumbname = $ paths['dirname'].'/'.$basefilename.
- '_'.$maxWidth.'x'.$maxHeight.'.jpg';
- else
- $thumbname = $paths['dirname'].'/ '.$basefilename.
- 'o_'.$maxWidth.'x'.$maxHeight.'.jpg';
- }
- else
- $thumbname = $filepath;
$thumburl = str_replace(APP_ROOT_PATH,'./',$thumbname);
-
- if($scale >= 1)
- {
- // 超过原图大小不再缩略
- $width = $srcWidth;
- $height = $srcHeight;
- if(!$is_preview)
- {
- //非预览模式写入原图
- file_put_contents($thumbname,file_get_contents($image)); //用原图写入
- return array('url'=>$thumburl,'path'=>$thumbname);
- }
- }
- else
- {
- // 缩略图寸
- $width = (int )($srcWidth*$scale);
- $height = (int)($srcHeight*$scale);
- }
-
- if($gen == 1)
- {
- $width = $maxWidth;
- $height = $ maxHeight;
- }
// ダウンロード入原图
- $createFun = 'imagecreatefrom'.($type=='jpg'?'jpeg':$type);
- if(!function_exists($createFun))
- $createFun = 'imagecreatefromjpeg';< ;/p>
$srcImg = $createFun($image);
//创建缩略图
- if($type!='gif' && function_exists('imagecreatetruecolor'))
- $thumbImg = imagecreatetruecolor($width, $height);
- else
- $thumbImg = imagecreate($width, $height) ;
$x = 0;
- $y = 0;
if($gen == 1 && $maxWidth > 0 && $maxHeight > 0)
- {
- $resize_ratio = $maxWidth/$maxHeight;
- $src_ratio = $srcWidth/$srcHeight;
- if($src_ratio >= $resize_ratio)
- {
- $x = ($srcWidth - ($resize_ratio * $srcHeight)) / 2;
- $width = ($height * $srcWidth) / $srcHeight;
- }
- else
- {
- $y = ( $srcHeight - ( (1 / $resize_ratio) * $srcWidth)) / 2;
- $height = ($width * $srcHeight) / $srcWidth;
- }
- }
// 复制图片
- if(function_exists("imagecopyresampled"))
- imagecopyresampled($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height,
- $srcWidth,$srcHeight);
- else
- imagecopyresize($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height,
- $srcWidth,$srcHeight);
- if('gif'==$type || 'png'==$ type) {
- $background_color = imagecolorallocate($thumbImg, 0,255,0); // 指派一个绿色
- imagecolortransparent($thumbImg,$background_color);
- // 透明色、若注释毥行出绿色の画像に設定されています
- }
// 对jpeg图形配置隔行扫描
- if('jpg'==$type || 'jpeg'==$type)
- imageinterlace($thumbImg,$interlace);
// 画像生成
- imagejpeg($thumbImg,$thumbname,100);
- imagedestroy($thumbImg);
- imagedestroy($srcImg);
return array('url'=>$thumburl,'path'=>$thumbname);
- }
- return false;
- }
public function make_thumb($srcImg,$srcWidth,$srcHeight,$type,$maxWidth=200,
- $maxHeight=50,$gen = 0)
- {
$インターレース = $インターレース? 1:0;
if($maxWidth > 0 && $maxHeight > 0)
- $scale = min($maxWidth/$srcWidth, $maxHeight/$srcHeight);
- // 計算缩放率
- elseif($maxWidth == 0)
- $スケール = $maxHeight/$srcHeight;
- elseif($maxHeight == 0)
- $scale = $maxWidth/$srcWidth;
if($scale >= 1)
- {
- // 超过原图大小不再缩略
- $width = $srcWidth;
- $height = $srcHeight;
- }
- else
- {
- // 缩略图尺寸
- $ width = (int)($srcWidth*$scale);
- $height = (int)($srcHeight*$scale);
- }
if($gen == 1)
- {
- $width = $maxWidth;
- $height = $maxHeight;
- }
- //创建缩略图
- if($type!=' gif' && function_exists('imagecreatetruecolor'))
- $thumbImg = imagecreatetruecolor($width, $height);
- else
- $thumbImg = imagecreatetruecolor($width, $height);
$x = 0;
- $y = 0;
if($gen == 1 && $maxWidth > 0 && $maxHeight > 0)
- {
- $resize_ratio = $maxWidth/$maxHeight;
- $src_ratio = $srcWidth/$srcHeight;
- if($src_ratio >= $resize_ratio)
- {
- $x = ($srcWidth - ($resize_ratio * $srcHeight)) / 2;
- $width = ($height * $srcWidth) / $srcHeight;
- }
- else
- {
- $y = ( $srcHeight - ( (1 / $resize_ratio) * $srcWidth)) / 2;
- $height = ($width * $srcHeight) / $srcWidth;
- }
- }
// 画像をコピー
- if(function_exists("imagecopyresampled"))
- imagecopyresampled($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height,
- $srcWidth,$srcHeight);
- else
- imagecopyresize($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height,
- $srcWidth,$srcHeight);
- if('gif'== $type || 'png'==$type) {
- $background_color = imagecolorallocate($thumbImg, 255,255,255);
- // 緑色を割り当てます
- imagecolortransparent($thumbImg,$background_color)
- // 透明色に設定しますこの行をコメントアウトすると、緑色の画像が出力されます
- }
// JPEG グラフィックスのインターレースを設定します
- if('jpg'==$type || 'jpeg'==$type)
- imageinterlace ($thumbImg,$interlace);
return $thumbImg;
-
}
-
- public function Water($source,$water,$alpha= 80 ,$position="0")
- {
- //ファイルが存在するかどうかを確認します
- if(!file_exists($source)||!file_exists($water))
- return false;
//画像情報
- $sInfo = es_imagecls::getImageInfo($source);
- $wInfo = es_imagecls::getImageInfo($water);
//画像がウォーターマークより小さい場合画像の場合、生成されません 画像
- if($sInfo["0"] < $wInfo["0"] || $sInfo['1'] < $wInfo['1'])
- return false;
- < ;p>
-
- if(is_animated_gif($source))
- {
- require_once APP_ROOT_PATH."system/utils/gif_encoder.php";
- require_once APP_ROOT_PATH."system/utils/gif_reader.php";
- < ;p> $gif = new GIFReader();
- $gif->load($source);
- foreach($gif->IMGS['frames'] as $k=> $img)
- {
- $ im = imagecreatefromstring($gif->getgif($k));
- //im にウォーターマークを追加します
- $sImage=$im;
- $wCreateFun="imagecreatefrom".$wInfo['type '];
- if(! function_exists($wCreateFun))
- $wCreateFun = 'imagecreatefromjpeg';
- $wImage=$wCreateFun($water);
-
- //画像ブレンドモードを設定します
- imagealphablending($wImage, true);
- switch (intval($position))
- {
- case 0: Break;
- //左上
- case 1:
- $posY=0;
- $posX=0;
- // 混合画像を生成
- imagecopymerge($sImage, $wImage, $posX, $ posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
- Break;
- //右上
- case 2:
- $posY=0;
- $posX =$sInfo[0]-$ wInfo[0];
- //混合画像を生成
- imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1], $alpha);
- Break;
- //左下
- case 3:
- $posY=$sInfo[1]-$wInfo[1];
- $posX=0;
- //混合画像を生成
- imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
- Break;
- //右下
- case 4:
- $posY=$sInfo[1] -$wInfo[1];
- $ posX=$sInfo[0]-$wInfo[0];
- //混合画像を生成
- imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo [0],$wInfo[1] ,$alpha);
- Break;
- //中央揃え
- case 5:
- $posY=$sInfo[1]/2-$wInfo[1]/2;
- $posX=$ sInfo[0]/2-$wInfo [0]/2;
- //混合画像を生成
- imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1 ],$alpha);
- Break;
- }
- //ウォーターマークが入っています
-
-
- ob_start();
- imagegif($sImage);
- $content = ob_get_contents();
- ob_end_clean();
- $frames [ ] = $content;
- $framed [ ] = $img['frameDelay'];
- }
-
-
- $gif_maker = 新しい GIFEncoder (
- $frames,
- $framed,
- 0,
- 2,
- 0, 0, 0,
- "bin" //bin はバイナリ URL はアドレスです
- );
- $image_rs = $gif_maker->GetAnimation ( );
-
- // 保存ファイル名が指定されていない場合、デフォルトは元の画像名です
- @unlink ($source);
- //画像を保存します
- file_put_contents($source,$image_rs);
- return true;
- }
-
- //画像を作成します
- $sCreateFun="imagecreatefrom".$sInfo['type'];
- if(!function_exists($sCreateFun))
- $sCreateFun = 'imagecreatefromjpeg';
- $sImage=$sCreateFun($source ) ;
$wCreateFun="imagecreatefrom".$wInfo['type'];
- if(!function_exists($wCreateFun))
- $wCreateFun = 'imagecreatefromjpeg';
- $wImage=$ wCreateFun ($water);
//画像のカラーブレンディングモードを設定します
- imagealphablending($wImage, true);
Position))
- {
- case 0: Break;
- //左上
- case 1:
- $posY=0;
- $posX=0;
- // 混合画像を生成
- imagecopymerge($sImage, $wImage, $posX, $posY, 0 , 0, $wInfo[0],$wInfo[1],$alpha);
- Break;
- //右上
- case 2:
- $posY=0;
- $posX=$sInfo[0] -$wInfo[0 ];
- //混合画像を生成
- imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
- Break ;
- //左下
- ケース 3:
- $posY=$sInfo[1]-$wInfo[1];
- $posX=0;
- // 混合画像を生成
- imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0 , $wInfo[0],$wInfo[1],$alpha);
- Break;
- //右下
- case 4:
- $posY=$sInfo[1]-$wInfo[1] ;
- $posX=$ sInfo[0]-$wInfo[0];
- //混合画像を生成
- imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo [1],$alpha );
- Break;
- //中央揃え
- case 5:
- $posY=$sInfo[1]/2-$wInfo[1]/2;
- $posX=$sInfo[0]/2 -$wInfo[0] /2;
- //混合画像を生成
- imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
- Break;
- }< ;/p>
//保存ファイル名が指定されていない場合、デフォルトは元の画像名です
- @unlink($source);
- //画像を保存します
- imagejpeg($ sImage,$source,100);
- imagedestroy($sImage);
- }
- }
if(!function_exists('image_type_to_extension'))
- {
- function image_type_to_extension($imagetype)
- {
- if(empty($imagetype))
- return false;
switch($imagetype)
- {
- case IMAGETYPE_GIF : return '.gif';
- case IMAGETYPE_JPEG : return '.jpeg';
- IMAGETYPE_PNG の場合: '.png' を返す;
- IMAGETYPE_SWF の場合: '.swf' を返す;
- IMAGETYPE_PSD の場合: '.psd' を返す;
- IMAGETYPE_BMP の場合: '.bmp' を返す;
- IMAGETYPE_TIFF_II の場合: '.tiff' を返す;
- IMAGETYPE_TIFF_MM の場合: '.tiff' を返す;
- IMAGETYPE_JPC の場合: '.jpc' を返す;
- IMAGETYPE_JP2 の場合: '.jp2' を返す;
- IMAGETYPE_JPX の場合: '.jpf' を返す;
- IMAGETYPE_JB2 の場合: '.jb2' を返す;
- IMAGETYPE_SWC の場合: '.swc' を返す;
- IFF の場合: '.aiff' を返す;
- IMAGETYPE_WBMP の場合: '.wbmp' を返す;
- IMAGETYPE_XBM の場合: '.xbm' を返す;
- デフォルト: false を返す;
- }
- }
- }
- ?> p>
-
コードをコピー
2.get_spec_img() は画像クラスを呼び出し、次のメソッドを使用して異なる仕様の画像を保存し、画像接続を返します。
-
- //対応する仕様の画像アドレスを取得します
- //gen=0: 比例スケーリングを維持し、クリップしません。高さが 0 の場合、幅はスケーリングされることが保証されます。 gen=1: 幅が長いことが保証され、クリッピング
- function get_spec_image($img_path,$width=0,$height=0,$gen=0,$is_preview=true)
- {
- if($width== 0)
- $new_path = $img_path;
- else
- {
- $img_name = substr($img_path,0,-4);
- $img_ext = substr($img_path,-3);
- if($is_preview)
- $new_path = $img_name."_".$width."x".$height.".jpg";
- else
- $new_path = $img_name."o_".$width."x".$height.".jpg" ;
- if(!file_exists($new_path))
- {
- require_once "imagecls.php";
- $imagec = new imagecls();
- $thumb = $imagec->thumb($img_path,$width,$height, $gen,true,"
- ",$is_preview );
-
- if(app_conf("PUBLIC_DOMAIN_ROOT")!='')
- {
- $paths = pathinfo($new_path);
- $path = str_replace("./" ,"",$paths['dirname'] );
- $filename = $paths['basename'];
- $pathwithoupublic = str_replace("public/","",$path);
-
- $file_data = @file_get_contents ($path.$file);
- $img = @imagecreatefromstring($file_data);
- if($img!==false)
- ); 使用方法:
- //im: ストア画像を 3 つの仕様で保存します: 小画像: 48x48、中画像 120x120、大画像 200x200
- $small_url=get_spec_image($data['image'],48,48,0 );
- $
- middle_url=get_spec_image($data['image'], 120,120, 0);
- $big_url=get_spec_image($data['image'],200,200,0);
-
-
- コードをコピー
|