ホームページ >バックエンド開発 >PHPチュートリアル >PHP フォルダー トラバーサル、均等な比率での画像圧縮

PHP フォルダー トラバーサル、均等な比率での画像圧縮

WBOY
WBOYオリジナル
2016-07-25 08:42:541210ブラウズ
    /**
  1. *出典:インターネット
  2. */
  3. クラスイメージ
  4. {
  5. var $w_quality = 100; // 品質
  6. var $w_minwidth = 500; /最小幅
  7. var $w_minheight = 500; //最小高さ
  8. var $interlace = 0; //画像がインターレースかどうか
  9. var $fontfile; //デフォルトのウォーターマーク画像
  10. 関数__construct()
  11. {
  12. $this->fontfile = $_SERVER['DOCUMENT_ROOT'].'/public/fonts/simhei.ttf';
  13. $this->w_img = '';
  14. {
  15. $this->__construct();
  16. }
  17. function info($img)
  18. {
  19. $imageinfo = getimagesize($img); //画像情報配列 0=>幅ピクセル 1= >高ピクセル 2=> は画像タイプ マーク 3 => はテキスト文字列、内容は "height="yyy" width="xxx"、
  20. if($imageinfo === false) は false を返します
  21. $imagetype = strto lower(substr(image_type_to_extension($imageinfo[2]),1)); //画像ファイルの種類を取得します $imageinfo[2] は画像の種類のマークです
  22. $imagesize = filesize($img) / / 画像サイズ
  23. $info = array(
  24. 'width'=>$imageinfo[0],
  25. 'height'=>$imageinfo[1],
  26. 'type'=>$imagetype,
  27. 'size'= > ;$imagesize,
  28. 'mime'=>$imageinfo['mime']
  29. );
  30. return $info; }
  31. /**
  32. * 略図
  33. *
  34. * @param string $image
  35. * @param string $filename
  36. * @param int $maxwidth
  37. * @param int $maxheight
  38. * @param string $suffix
  39. * @param int $autocut
  40. * @戻り文字列
  41. */
  42. function subject($image, $filename = ' ' ,$maxwidth = 50, $maxheight = 50, $suffix='_thumb', $autocut = 0)
  43. {
  44. if( !$this->check($image)) return false;
  45. $info = $this; - >info($image); //画像情報を取得
  46. if($info === false) return false
  47. $srcwidth = $info['width'] //ソース画像の幅
  48. $srcheight = $info; [ 'height']; //ソース画像は高です
  49. $pathinfo = pathinfo($image);
  50. $type = $pathinfo['extension']; // 拡張子を取得します
  51. if(!$type) $type = $info[ 'type']; // 取得できない場合は $info['type'] を使用します
  52. $type = strto lower($type)
  53. $scale = min($maxwidth/$srcwidth); , $ maxheight/$srcheight); //サムネイルの比率を取得します
  54. //ソース画像に応じて比率を取得します
  55. $createwidth = $width = (int) ($srcwidth*$scale); //サムネイルの幅を取得します);
  56. $createheight = $height = (int)($srcheight*$scale);//(); //サムネイルの高さを取得します
  57. $psrc_x = $psrc_y = 0;
  58. if($autocut) //サムネイルの比率 取得するには
  59. {
  60. if($maxwidth/$maxheight<$srcwidth/$srcheight && $maxheight>=$height) //サムネイルがソース画像よりも比例して狭い場合
  61. {
  62. $width = $ maxheight/$height *$width; //幅は対応する比率に従って処理されます
  63. $height = $maxheight;// //高さは変更されません
  64. }
  65. elseif($maxwidth/$maxheight>$srcwidth/$srcheight && $maxwidth>=$width) // サムネイルがソース画像よりも比例して広い場合
  66. {
  67. $height = $maxwidth/$width*$height;//
  68. $width = $maxwidth
  69. }
  70. if($ maxwidth == '55') {
  71. $width = '55';
  72. $createwidth = '55' }
  73. if($maxwidth == '110'){
  74. $width = '110'; '110';
  75. }
  76. }
  77. if($srcwidth<='280' && $maxwidth != '110'){
  78. $createwidth = $srcwidth;
  79. $createfun = ' imagecreatefrom'.($type= ='jpg' ? 'jpeg' : $type); //さまざまな画像処理関数を検索します
  80. $srcimg = $createfun($image) //画像識別子を返します
  81. if($type ! = 'gif' && function_exists ('imagecreatetruecolor')){
  82. $thumbimg = imagecreatetruecolor($createwidth, $createheight); // 新しい True Color イメージを作成します
  83. }else{
  84. if($maxwidth == '110' && $srcheight >= $srcwidth){
  85. $height1 = 72;
  86. $thumbimg = imagecreate($width, $height1); // 新しいパレットベースの画像を作成します。
  87. }elseif ($maxwidth == '110' && $srcheight $width1 = 110;
  88. $thumbimg = imagecreate($width1, $height); // 新しいパレットベースの画像を作成します
  89. }else{
  90. $thumbimg = imagecreate($width, $height); // 新しいパレットベースの画像を作成します
  91. }
  92. }
  93. if(function_exists('imagecopyresampled')){ // 画像の一部をリサンプルしてコピーしますサイズを調整し、トゥルーカラー
  94. //imagecopyresampled(新しい画像, ソース画像, 新しい画像の左上隅からの x 距離, 新しい画像の左上隅からの y 距離, 新しい画像の左上隅からの x 距離ソース画像、ソース画像の左上隅からの y 距離、新しい画像の幅、新しい画像の高さ、ソース画像の幅、ソース画像の高さ)
  95. if($maxwidth == '110' && $srcheight >= $ srcwidth){
  96. $psrc_x = 0;
  97. $psrc_y = $psrc_yz;
  98. $width = '110' && $srcheight > = $srcwidth && $srcheight>= '72' && $srcwidth $psrc_yz = $height/2;
  99. $psrc_y = $psrc_yz; ';
  100. }
  101. if($maxheight == '72' && $srcheight <= $srcwidth && $srcheight<= '72' && $srcwidth >= '110'){
  102. $cha = ($maxheight-$ srcheight)/2;
  103. $psrc_y = -($cha);
  104. $height = '72';
  105. imagecopyresampled($thumbimg, $srcimg, 0) , 0, $psrc_x, $psrc_y, $width, $height, $srcwidth, $srcheight);
  106. }else{ //画像の一部をコピーしてサイズ変更、パレット
  107. imagecopyresize($thumbimg, $srcimg, 0, 0) , $psrc_x, $psrc_y, $width, $height, $srcwidth, $srcheight);
  108. }
  109. if($type=='gif' || $type=='png')
  110. {
  111. //imagecolorallocate は画像に色を設定します
  112. $background_color = imagecolorallocate($thumbimg, 0, 255, 0); // パレットに基づいて画像の背景色を塗りつぶし、緑を割り当てます
  113. // imagecolortransparent 色を透明色として定義します
  114. imagecolortransparent ($thumbimg, $background_color); // この行がコメントアウトされている場合は透明色に設定します 緑色の画像を出力します
  115. }
  116. // imageinterlace はインターレースを有効または無効にします
  117. if($type=='jpg' || $type =='jpeg') imageinterlace($thumbimg, $this->interlace);
  118. $ imagefun = 'image'.($type=='jpg' ? 'jpeg' : $type)
  119. //imagejpeg imagegif imagepng
  120. if(empty($filename)) $filename = substr($image, 0, strrpos( $image, '.')).$suffix.'.'.$type //ファイル名を取得します
  121. //aaa .gif aaa_thumb.gif
  122. $imagefun($thumbimg, $filename); // 新しい画像
  123. imagedestroy ($thumbimg); // ソース画像を破棄します
  124. return $filename;
  125. }
  126. /**
  127. * 幅または高さを制限します
  128. *
  129. * @param string $image
  130. * @param int $maxwidth
  131. * @param int $maxheight
  132. * @param string $suffix
  133. * @return string
  134. */
  135. function thread3($image,$maxwidth = 0, $maxheight = 0, $suffix='_thumb')
  136. {
  137. if( !$this->check($image) )) return false;
  138. $info = $this->info($image); // 画像情報を取得します
  139. if($info === false) return false; //ソース画像の幅
  140. $srcheight = $info['height']; //ソース画像の高さ
  141. $pathinfo = pathinfo($image)
  142. $type = $pathinfo['extension']; //拡張子を取得します。 if(!$type) $type = $info['type']; // 取得できない場合は、$info['type'] を使用します
  143. $type = strto lower($type)
  144. if ($maxwidth==0){
  145. $scale = $maxheight/$srcheight;
  146. if($scale $createwidth = $srcwidth*$scale;
  147. $createheight = $maxheight;
  148. $作成幅 = $srcwidth
  149. $作成高さ = $srcheight; }
  150. }
  151. if($maxheight==0){
  152. $scale = $maxwidth/$srcwidth;
  153. if($scale $createwidth = $maxwidth
  154. } else{
  155. $createwidth = $srcwidth;
  156. $createheight = $srcheight;
  157. }
  158. $psrc_x = $psrc_y = 0;
  159. $createfun = 'imagecreatefrom'.($type=='jpg' ? 'jpeg' : $type); //さまざまな画像処理関数を検索します
  160. $srcimg = $createfun($image); //画像識別子を返します
  161. if($type != 'gif' && function_exists('imagecreatetruecolor')){
  162. $thumbimg = imagecreatetruecolor($createwidth, $createheight); // 新しい True Color イメージを作成します
  163. }else{
  164. $thumbimg = imagecreate($createwidth, $createheight) // 新しいパレットベースのイメージを作成します
  165. }
  166. if( function_exists ('imagecopyresampled')){ //画像のコピー部分をリサンプルしてサイズ変更、トゥルーカラー
  167. //imagecopyresampled(新しい画像, ソース画像, 新しい画像の左上隅からの x 距離, 左上隅からの y 距離新しい画像の、ソース画像の左上隅の x 距離、ソース画像の左上隅からの y 距離、新しい画像の幅、新しい画像の高さ、ソース画像の幅、ソース画像の高さ)
  168. imagecopyresampled($thumbimg, $) srcimg, 0, 0, $psrc_x, $psrc_y, $createwidth, $createheight , $srcwidth, $srcheight);
  169. }else{ //画像の一部をコピーしてサイズ変更、パレット
  170. imagecopyresize($thumbimg, $srcimg, 0, 0, $psrc_x, $psrc_y, $createwidth, $createheight, $srcwidth, $srcheight);
  171. }
  172. if($type=='gif' || $type=='png')
  173. {
  174. // imagecolorallocate は画像に色を割り当てます
  175. $background_color = imagecolorallocate($thumbimg, 0, 255, 0) // パレットベースの画像の背景色を塗りつぶし、緑を割り当てます
  176. // imagecolortransparent は色を透明として定義します
  177. imagecolortransparent ($thumbimg, $background_color); // 透明な色に設定します。この行がコメントアウトされている場合、緑色の画像が出力されます
  178. }
  179. // imageinterlace はインターレースを有効または無効にします
  180. if($type=='jpg' || $type=='jpeg') imageinterlace($thumbimg, $this ->interlace);
  181. $imagefun = 'image'.($type=='jpg' ? 'jpeg' : $type); imagegif imagepng
  182. $filename = substr($image, 0, strrpos( $image, '.')).$suffix.'.'.$type; //ファイル名を取得します
  183. //aaa.gif aaa_thumb.gif
  184. $imagefun($thumbimg, $filename); //新しい画像
  185. imagedestroy ($thumbimg); // サムネイルを破棄します
  186. return $filename }
  187. /**
  188. * 元のサムネイルが特定のサイズを満たさない問題を解決するために、特定のサイズのサムネイルを生成します
  189. * @static
  190. * @access public
  191. * @param string $image 元画像
  192. * @param string $type 画像形式
  193. * @param string $thumbname サムネイルファイル名
  194. * @param string $maxWidth 幅
  195. * @param string $maxHeight height
  196. * @param boolean $interlace Enableインターレース
  197. * @return void
  198. */
  199. static functionthumb2($image, $thumbname, $type='', $maxWidth=200, $maxHeight=50, $interlace=true) {
  200. // 元の画像情報を取得します
  201. $info = Image ::getImageInfo($image);
  202. if ($info !== false ) {
  203. $srcWidth = $info['width'];
  204. $type = empty($) $info['type'] : $type;
  205. $interlace = $interlace ?
  206. $scale = max($maxWidth); / $srcWidth, $maxHeight / $srcHeight); // 拡大縮小率を計算します
  207. // 元の画像とサムネイルの比率を判断します。たとえば、元の画像がサムネイルよりも広い場合は両側をトリミングします。 ..
  208. if($maxWidth / $srcWidth > $maxHeight / $srcHeight){
  209. //
  210. $srcX = 0 より高い ;
  211. $srcY = ($srcHeight - $maxHeight / $scale) / 2 ; = $srcWidth;
  212. $cutHeight = $maxHeight / $scale;
  213. //
  214. $srcX = ($srcWidth - $maxWidth / $scale) / 2; $srcY = 0; $maxWidth / $scale;
  215. $cutHeight = $srcHeight; }
  216. // ダウンロード原図
  217. $createFun = 'ImageCreateFrom' . ($type == 'jpg' ? 'jpeg' : $type);
  218. $srcImg = $createFun($image);
  219. //创建缩略図
  220. if ($type != 'gif' && function_exists('imagecreatetruecolor'))
  221. $thumbImg = imagecreatetruecolor($maxWidth, $maxHeight);
  222. それ以外の場合
  223. $thumbImg = imagecreate($maxWidth, $maxHeight);
  224. // 复制图片
  225. if (function_exists("ImageCopyResampled"))
  226. imagecopyresampled($thumbImg, $srcImg, 0, 0, $srcX, $srcY, $maxWidth, $maxHeight, $cutWidth, $cutHeight);
  227. else
  228. imagecopyresize($thumbImg, $srcImg, 0, 0, $srcX, $srcY, $maxWidth, $maxHeight, $cutWidth, $cutHeight);
  229. if ('gif' == $type || 'png' == $type) {
  230. //imagealphablending($thumbImg, false);//取消默认の混色モード
  231. //imagesavealpha($thumbImg,true); //完全に保存されるアルファ パス情報を設定します
  232. $background_color = imagecolorallocate($thumbImg, 0, 255, 0); // 指派一个绿色
  233. imagecolortransparent($thumbImg, $background_color); // 設定は透明色、若注释掉実行色の絵
  234. }
  235. // jpeg 图形配置隔離行扫描
  236. if ('jpg' == $type || 'jpeg' == $type)
  237. imageinterlace($thumbImg, $interlace);
  238. // 画像を生成
  239. $imageFun = 'image' . ($type == 'jpg' ? 'jpeg' : $type);
  240. @chmod(ディレクトリ名($thumbname),0777);
  241. $imageFun($thumbImg, $thumbname);
  242. imagedestroy($thumbImg);
  243. imagedestroy($srcImg);
  244. $thumbname を返します;
  245. }
  246. false を返します。
  247. }
  248. /**
  249. * 画像情報を取得
  250. * @static
  251. * @access public
  252. * @param string $image 画像ファイル名
  253. * @returnmixed
  254. */
  255. 静的関数 getImageInfo($img) {
  256. $imageInfo = getimagesize($img);
  257. if ($imageInfo !== false) {
  258. $imageType = strto lower(substr(image_type_to_extension($imageInfo[2]), 1));
  259. $imageSize = ファイルサイズ($img);
  260. $info = array(
  261. "幅" => $imageInfo[0],
  262. "高さ" => $imageInfo[1],
  263. "タイプ" => $imageType,
  264. "サイズ" => $ imageSize,
  265. "mime" => $imageInfo['mime']
  266. );
  267. $info を返します。
  268. } else {
  269. false を返します。
  270. }
  271. }
  272. //watermark(源图, 生成文件, 生成位置,水印文件,水印文本,背景色)
  273. function Watermark($source, $target = '', $w_pos = 9, $w_img = ' ', $w_text = '', $w_font = 12, $w_color = '#cccccc',$x='',$y='')
  274. {
  275. if( !$this->check($source)) false を返します。
  276. if(!$target) $target = $source;
  277. if ($w_img == '' && $w_text == '')
  278. $w_img = $this->w_img;
  279. $source_info = getimagesize($source);
  280. $source_w = $source_info[0]; //获取宽
  281. $source_h = $source_info[1]; //获取高
  282. if($source_w < $this->w_minwidth || $source_h < $this->w_minheight) return false; //宽和高达不到達要求直接返還
  283. switch($source_info[2]) //新規建图片
  284. {
  285. case 1 :
  286. $source_img = imagecreatefromgif($source);
  287. 休憩;
  288. ケース 2 :
  289. $source_img = imagecreatefromjpeg($source);
  290. 休憩;
  291. ケース 3 :
  292. $source_img = imagecreatefrompng($source);
  293. 休憩;
  294. デフォルト:
  295. false を返します。
  296. }
  297. if(!empty($w_img) && file_exists($w_img)) //水印文件
  298. {
  299. $ifwaterimage = 1; //否か 水印图
  300. $water_info = getimagesize($w_img); //水印情報
  301. $width = $water_info[0];
  302. $height = $water_info[1];
  303. switch($water_info[2])
  304. {
  305. ケース 1 :
  306. $water_img = imagecreatefromgif($w_img);
  307. 休憩;
  308. ケース 2 :
  309. $water_img = imagecreatefromjpeg($w_img);
  310. 休憩;
  311. ケース 3 :
  312. $water_img = imagecreatefrompng($w_img);
  313. 休憩;
  314. デフォルト:
  315. リターン;
  316. }
  317. }
  318. else
  319. {
  320. $ifwaterimage = 0;
  321. //imagettfbbox この関数は、TrueType テキストのパケットを包含する仮想フレームの画素サイズを計算して返します。
  322. //imagettfbbox (フォント サイズ、フォント角度、フォント ファイル、ファイル)
  323. // echo $this->fontfile;
  324. $temp = imagettfbbox(ceil($w_font*1.6), 0, $this->fontfile, $w_text);//TrueType フォントを使用してテキストの範囲を取得します
  325. $width = $temp[4] - $temp[6] //右上隅の X 位置 - 左上隅の X 位置
  326. ; $height = $temp[3] - $temp[5]; //右下隅の Y 位置 - 右上隅の Y 位置
  327. unset($temp) }
  328. switch($w_pos)
  329. {
  330. case 0: / /ランダムな位置
  331. $wx = rand(0 ,($source_w - $width));
  332. $wy = rand(0,($source_h - $height));
  333. ケース 1: // 左上隅$wx = 25;
  334. $wy = 25;
  335. ケース 2: // 上部中央の位置
  336. $wy = 0; : // 右上隅
  337. $wx = $source_w - $width;
  338. $wy = 0;
  339. ケース 4: // 左側の中間位置
  340. $wx = 0; - $height) / 2;
  341. ケース 5: // 中間位置
  342. $wy = ($source_h - $height) / 2;ケース 6: // 中央の下の位置
  343. $wx = ($source_w - $width) / 2;
  344. $wy = $source_h - $height
  345. ケース 7: // 左下隅
  346. $wx = 0;
  347. $wy = $source_h - $height;
  348. ケース 8: // 右側の中央の位置
  349. $wy = ($source_h - $height) /2; ;
  350. ケース 9: //右下隅
  351. $wy = $source_h - $height ;
  352. デフォルト: // ランダム
  353. $wx = rand( - $width));
  354. $wy = rand(0,($source_h - $height ));
  355. case 10://カスタマイズされた位置
  356. $wy = $y; 11: //下中央の位置 -- 職人のみ
  357. $wy = $source_h - $height-50;
  358. Break; ifwaterimage) //ウォーターマーク画像がある場合
  359. {
  360. //imagecopymerge 画像をコピーしてマージします
  361. の一部 //パラメータ (ソース画像、ウォーターマーク画像、ソース画像の x 位置にコピー、ソース画像の y 位置にコピー、ウォーターマークから画像の x 位置、透かし画像からの y 位置、高さ、幅、透明度)
  362. //imagecopymerge( $source_img, $water_img, $wx, $wy, 0, 0, $width, $height, $this->w_pct) ;
  363. imagecopy($source_img,$water_img,$wx,$wy,0,0, $width,$height)
  364. }
  365. else
  366. {
  367. if(!empty($w_color) && (strlen($w_color)) ==7))
  368. {
  369. $r = hexdec(substr($w_color,1,2 )) //赤を取得します $g = hexdec(substr($w_color,3,2)); //緑を取得します$b = hexdec(substr($w_color,5)); //青を取得します
  370. }
  371. else
  372. {
  373. return;
  374. }
  375. //imagecolorallocate パレットに基づいて背景色を塗りつぶします
  376. //imagestring文字列を水平方向に 1 行
  377. //imagestring(ソース画像, フォント サイズ, 位置 X, 位置 Y, text , color)
  378. //パラメータ ($image, float $size, float $angle, int $x, int $y, int $color, string $fontfile, string $text)
  379. imagettftext($source_img,$w_font,0, $wx,$wy,imagecolorallocate($source_img,$r,$g,$b),$this->fontfile, $w_text);
  380. //imagestring($source_img,$w_font,$wx,$wy,$ w_text,imagecolorallocate($source_img,$r,$g,$b));
  381. //ファイルまたはブラウザに出力
  382. switch($source_info[2])
  383. {
  384. case 1 :
  385. imagegif($source_img, $target) // 画像をブラウザまたは GIF 形式でファイルに出力
  386. Break; ;
  387. ケース 2 :
  388. imagejpeg($source_img, $target, $this->w_quality); // 画像を JPEG 形式で出力します
  389. ケース 3 :
  390. imagepng($source_img, $target; ; if(isset($water_img))
  391. {
  392. imagedestroy($water_img); //
  393. unset($source_info)
  394. return true }
  395. ライブラリが存在する必要があります。 , 接尾辞は jpg|jpeg|gif|png、ファイルが存在する、imagecreatefromjpeg または imagecreatefromgif が存在する
  396. function check($image)
  397. {
  398. return extension_loaded('gd') &&
  399. preg_match("/.(JPG|JPEG) |PNG|GIF| jpg|jpeg|gif|png)/i", $image, $m) &&
  400. file_exists($image) &&
  401. function_exists('imagecreatefrom'.($m[1] == 'jpg' ? 'jpeg' : $ m[1]));
  402. //imagecreatefromjpeg
  403. //imagecreatefromgif
  404. //imagecreatefrompng }
  405. }
  406. /**
  407. サムネイル
  408. 1. imagecreatefromgif imagecreatefromjpeg imagecreatefrompng で新しい画像リソースを作成します
  409. 2.imagecopyresampled 画像をコピーしてサイズを変更します
  410. ウォーターマーク: 画像ウォーターマーク、テキストウォーターマーク
  411. 1. 画像を作成します
  412. 2. ウォーターマークを追加します
  413. 画像ウォーターマーク: imagecopymerge 2 を入れます画像を結合します
  414. テキストの透かし: imagettftext 画像にテキストを書き込みます
  415. */
  416. error_reporting(0); __FILE__);
  417. $ filesnames = scandir($hostdir.'/desktop');
  418. $img = new image();
  419. if($name != '.' && $name != '.. '){
  420. $imgPath = $hostdir.'/desktop/';
  421. $imgsize = getimagesize($imgPath.$name);
  422. $imgInfo =explode('.',$name); imginfo2 =explode(' _',$imgInfo[0]);
  423. if($imginfo2[count($imginfo2)-1] != 'small'){
  424. $img_small = $imgPath.$imgInfo[0].' _small.'.$ imgInfo[1];
  425. $img->thumb2($imgPath.$name,$img_small,'',$imgsize[0]/4,$imgsize[1]/4); }
  426. }
  427. コードをコピー
  428. 等しい比率、PHP
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。