-
-
/** - *
- * 画像処理クラス
- * @author FC_LAMP
- * @internal 関数にはウォーターマーク、サムネイルが含まれます
- */
- class Img
- {
- //画像形式
- private $exts = array ('jpg', 'jpeg', 'gif ', 'bmp', 'png' );
/**
- *
- *
- * @throws 例外
- */
- public function __construct()
- {
- if (! function_exists ( 'gd_info' ))
- {
- 新しい例外をスローします (「GD ライブラリのロードに失敗しました!' );
- }
- }
/**
- *
- * トリミングと圧縮
- * @param $src_img 画像
- * @param $save_img で生成された画像
- * @param $option パラメーター オプション (以下を含む): $maxwidth width $maxheight height
- * array('width'=> xx ,'height'=>xxx)
- * @internal
- * 通常、画像が長すぎるか幅が広すぎる場合、生成された画像は「平坦化」されます。このために、最初にトリミングされます。そして、比例圧縮方法を押します
- */
- パブリック関数thumb_img($src_img, $save_img = '', $option)
- {
-
if (空 ( $option ['width'] ) または空 ( $option ['height'] ))
- {
- return array ('flag' => False, 'msg' => 'Original画像の長さと幅は 0' より小さくすることはできません' );
- }
- $org_ext = $this->is_img ( $src_img );
- if (! $org_ext ['flag'])
- {
- return $org_ext ;
- }< /p>
//保存パスがある場合は、そのパスが正しいかどうかを判断します
- if (! empty ( $save_img ))
- {
- $f = $this->check_dir ( $save_img );
- if ( ! $f ['flag'])
- {
- return $f;
- }
- }
// 対応するメソッドを取得します
- $org_funcs = $this ->get_img_funcs ( $org_ext ['msg'] );
//元のサイズを取得します
- $source = $org_funcs ['create_func'] ( $src_img );
- $src_w = imagex ( $source );
- $ src_h = imagey ( $source );
//元の画像を調整します (画像の元の形状を維持し、画像をトリミングします)
- $dst_scale = $ option ['height'] / $option ['width'] ; // ターゲット画像のアスペクト比
- $src_scale = $src_h / $src_w; // 元の画像のアスペクト比
- if ($src_scale >= $dst_scale) { // 高すぎます
- $w = intval ( $src_w );
- $h = intval ( $dst_scale * $w );
$x = 0;
- $y = ($src_h - $h) / 3;
- } else
- { / / 幅が広すぎます
- $h = intval ( $src_h );
- $w = intval ( $h / $dst_scale );
= ($src_w - $w) / 2;
- $y = 0;
- }
- // トリミング
- $croped = imagecreatetruecolor ( $w, $h );
- imagecopy ( $croped, $source, 0, 0, $ x, $y, $src_w, $src_h );
- // スケーリング
- $scale = $option ['width'] / $w;
- $target = imagecreatetruecolor ( $option ['width'], $option ['height '] );
- $final_w = intval ( $w * $scale );
- $final_h = intval ( $h * $scale );
- imagecopyresampled ( $target, $croped, 0, 0, 0, 0, $final_w, $final_h, $w, $h );
- imagedestroy ( $croped );
//画像を出力(保存)
- if (! empty ( $save_img ))
- { ;
$org_funcs ['save_func' ] ( $target, $save_img );
- } else
- {
- header ( $org_funcs ['header'] );
- $org_funcs ['save_func'] ( $target ) ;
- }
- imagedestroy ( $target );
- return array ('flag' => True, 'msg' => '' );
- }
* - * 拡大縮小画像
- * @param $src_img 元画像
- * @param $save_img 保存先
- * @param $option パラメータ設定 array('width'=>xx,'height'=> xxx)
- *
- */
- function raise_image($src_img, $save_img = '', $option)
- {
- $org_ext = $this->is_img ( $src_img );
- if (! $org_ext ['flag'])
- {
- return $org_ext;
- }
-
//保存パスがある場合、そのパスが正しいかどうかを判定します
- if (! empty ( $save_img ))
- {
- $f = $this- >check_dir ( $save_img );
- if (! $f [ 'flag'])
- {
- return $f;
- }
- }
// 対応するメソッドを取得します
- $org_funcs = $this->get_img_funcs ( $org_ext ['msg' ] );
//元のサイズを取得します
- $source = $org_funcs ['create_func'] ( $src_img );
- $src_w = imagex ( $source );
- $src_h = imagey ( $source );
if (($option ['width'] && $src_w > $option ['width' ]) || ($option ['高さ'] && $src_h > $option ['高さ']))
- {
- if ($option ['幅'] && $src_w > $option ['幅'] )
- {
- $widthratio = $option ['width'] / $src_w;
- $resizewidth_tag = true;
- }
if ($option ['height'] && $src_h > $option ['height'])
- {
- $heightratio = $option ['height'] / $src_h;
- $resizeheight_tag = true;
- }
if ($resizewidth_tag && $resizeheight_tag )
- {
- if ($widthratio $ rate = $widthratio;
- else
- $ratio = $heightratio;
- }
if ($resizewidth_tag && ! $resizeheight_tag)
- $ratio = $widthratio;
- if ($resizeheight_tag && ! $resizewidth_tag)
- $ratio = $heightratio;
$newwidth = $src_w * $ratio;
- $newheight = $src_h * $ratio;
if (function_exists ( "imagecopyresampled" ))
- {
- $newim = imagecreatetruecolor ( $newwidth, $newheight );
- imagecopyresampled ( $newim, $source, 0, 0, 0, 0, $newwidth, $newheight, $src_w, $src_h );
- } else
- {
- $newim = imagecreate ( $newwidth, $newheight );
- imagecopyresize ( $newim, $source, 0, 0, 0, 0, $newwidth, $newheight, $src_w, $src_h );
- }
- }
- //出(保存)图片
- if (! empty ( $save_img ))
- {
$org_funcs ['save_func'] ( $newim, $save_img );
- } else
- {
- header ( $org_funcs ['header'] );
- $org_funcs ['save_func'] ( $newim );
- }
- imagedestroy ( $newim );
- return array ('flag' => True, 'msg' => '' );
- }
/**
- *
- * 透かし画像を生成します
- * @param $org_img 元の画像
- * @param $mark_img 透かし画像
- * @param $save_img ディレクトリが存在しない場合、ディレクトリの作成を試みます
- * @param array $optionウォーターマークの基本設定には以下が含まれます:
- * x: ウォーターマークの水平位置、デフォルトはウォーターマーク画像の幅を引いた後の値です
- * y: ウォーターマークの垂直位置、デフォルトは後の値です透かし画像の高さを減算します
- * alpha: アルファ値 (透明度の制御)、デフォルトは 50 です
- */
- public function Water_mark($org_img, $mark_img, $save_img = '', $option = array())
- {
- //检查图片
- $org_ext = $this->is_img ( $org_img );
- if (! $org_ext ['flag'])
- {
- return $org_ext;
- }
- $mark_ext = $this->is_img ( $mark_img );
- if (! $mark_ext ['flag' ])
- {
- return $mark_ext;
- }
- //如果有保存路径,则确定路径有無正确
- if (! empty ( $save_img ))
- {
- $f = $this->check_dir ( $save_img ) ;
- if (! $f ['flag'])
- {
- return $f;
- }
- }
//获取相应画布
- $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );
- $org_img_im = $org_funcs ['create_func'] ( $org_img );
get_img_funcs ( $mark_ext ['msg'] );
- $mark_img_im = $mark_funcs ['create_func'] ( $mark_img );
//贝水印图片座標
- $mark_img_im_x = 0;
- $mark_img_im_y = 0;
- //贝水印图片高宽
- $mark_img_w = imagex ( $mark_img_im );
- $mark_img_h = imagey ( $mark_img_im );< /p> ;
$org_img_w = 画像x ( $org_img_im );
- $org_img_h = 画像x ( $org_img_im );
//合成生成点坐标
- $x = $org_img_w - $mark_img_w;
- $org_img_im_x = isset ( $option ['x'] ) ? $option ['x'] : $x;
- $org_img_im_x = ($org_img_im_x > $org_img_w または $org_img_im_x $y = $org_img_h - $mark_img_h;
- $org_img_im_y = isset ( $option ['y'] ) ? $option ['y'] : $y;
- $org_img_im_y = ($org_img_im_y > $org_img_h または $org_img_im_y
//アルファ
- $alpha = isset ( $option ['alpha'] ) ? $option ['alpha'] : 50;
- $alpha = ($alpha > 100 または $alpha
//結合图片
- imagecopymerge ( $org_img_im, $mark_img_im, $org_img_im_x, $org_img_im_y, $mark_img_im_x, $mark_img_im_y, $mark_img_w, $mark_img_h, $alpha );
//输出(保存)写真
- if (! empty ( $save_img ))
- {
$org_funcs ['save_func'] ( $org_img_im, $save_img );
- } else
- {
- header ( $org_funcs ['header'] );
- $org_funcs ['save_func'] ( $org_img_im );
- }
- //销毁画布
- imagedestroy ( $org_img_im );
- imagedestroy ( $mark_img_im );
- return array ('flag' => True, 'msg' => '' );
}
/**
- *
- * 画像を確認してください
- * @paramknown_type $img_path
- * @return array('flag'=>true/false,'msg'=>ext/error message)
- */
- private function is_img($img_path)
- {
- if (! file_exists ( $img_path ))
- {
- return array ('flag' => False, 'msg' => "加ダウンロード図片 $img_path 失われています!" );
- }
- $ext =explode ( '.', $img_path );
- $ext = strto lower ( end ( $ext ) );
- if (! in_array ( $ext, $this-> ;exts ))
- {
- return array ('flag' => False, 'msg' => "图片 $img_path 格式不正确!" );
- }
- return array ('flag' => True, 'msg' => $ext );
- }
/**
- *
- * 正しい画像関数を返します
- * @paramknown_type $ext
- */
- プライベート関数get_img_funcs($ext)
- {
- //选择
- switch ($ext)
- {
- case 'jpg' :
- $header = 'Content-Type:image/jpeg';
- $createfunc = 'imagecreatefromjpeg';
- $savefunc = 'imagejpeg';
- break;
- case 'jpeg' :
- $header = 'Content-Type:image/jpeg';
- $createfunc = 'imagecreatefromjpeg';
- $savefunc = 'imagejpeg';
- break;
- case ' gif' :
- $header = 'Content-Type:image/gif';
- $createfunc = 'imagecreatefromgif';
- $savefunc = 'imagegif';
- Break;
- case 'bmp' :
- $header = 'Content-Type :image/bmp';
- $createfunc = 'imagecreatefrombmp';
- $savefunc = 'imagebmp';
- ブレーク;
- デフォルト :
- $header = 'Content-Type:image/png';
- $createfunc = 'imagecreatefrompng';
- $savefunc = 'imagepng';
- }
- return array ('save_func' => $savefunc, 'create_func' => $createfunc, 'header' => $header );
- }
-
/**
- *
- * ディレクトリを確認して作成してみます
- * @param $save_img
- */
- プライベート関数 check_dir($save_img)
- {
- $dir = dirname ( $save_img );
- if (! is_dir ( $dir ))
- {
- if (! mkdir ( $dir, 0777, true ))
- {
- return array ('flag' => False, 'msg' => "图片保存目录 $dir 無法创建!" );
- }
- }
- return array ('flag' => True, 'msg' => '' );
- }
- }
if (! empty ( $ _FILES ['test'] ['tmp_name'] ))
- {
- //例子
- $img = new Img ();
- //原图
- $name =explode ( '.', $_FILES ['test'] ['名前'] );
- $org_img = 'D:/test.' 。 end ( $name );
- move_uploaded_file ( $_FILES ['test'] ['tmp_name'], $org_img );
- $option = array ('width' => $_POST ['width'], 'height' = > $_POST ['高さ'] );
- if ($_POST ['タイプ'] == 1)
- {
- $s = $img->resize_image ( $org_img, '', $option );
- } else
- {
- $img->thumb_img ( $org_img, '', $option );
- }
- unlink ( $org_img );
- }
-
复制コード
使用方法:
php水印
-
- $img = new Img ();
- $org_img = 'D:/tt.png';
- $mark_img = 'D:/t.png';
- //保存水印图片(如果$save_img空時,将会直接出图片)
- $save_img = 'D:/test99h/testone/sss.png';
- //水印设置调节
- $option = array ('x' => 50, 'y' => 50, 'alpha' => 80 );
- // 水印图片
- $flag = $img->water_mark ( $org_img, $mark_img, $save_img, $option );
复制發
当调节 $option パラメータ時,会有相应变化:
-
-
//例子
- $img = new Img ();
- $org_img = 'D:/tt.png';
- //压缩图片(100*100)
- $option = array ('width' => 100, 'height' => 100 );
//$save_img は空時です、会は画像を浏览器に直接出力します
$save_img = 'D:/test99h/testone/sss_thumb.png';
- $flag = $img->thumb_img ( $org_img, $save_img, $option );
-
-
复制番号
调节$オプションの大小:
-
- $img = new Img ();
- //原图
- $org_img = 'D:/tt.png';
- //水印标记图
- $mark_img = 'D:/t.png' ;
- //保存水印图片
- $save_img = 'D:/test99h/testone/sss.png';
- //水印设置调节
- $option = array ('x' => 50, 'y' => 50, 'alpha' => 60 );
- //压缩水印图片
- $option $img->water_mark ( $org_img, $mark_img, $save_img, $option ) = array ('width' => 200, 'height' => 200 );
- //保存压缩图
- $save_img2 = 'D:/test99h/testone/sss2_thumb.png';
- $flag = $img- >thumb_img ( $save_img, $save_img2, $option ); //等比例圧縮形式
-
-
- 倍生成符号
圧縮生成された水印画像の際、圧縮後に生成された画像形式は原画像と一致し、水印画像は一致する。
しかし、いくつかの未知の危険な発言が発生する可能性があります。
|