찾다
백엔드 개발PHP 튜토리얼PHP 이미지 처리 함수 클래스(워터마크, 썸네일) [비례 압축 및 크로핑 압축에 대하여]

다음은 워터마크, 썸네일 등의 기능을 포함하는 간단한 이미지 처리 클래스입니다.
하지만 썸네일을 생성하는 방법에는 두 가지가 있습니다. 하나는 이미지를 비례적으로 직접 압축하는 것이고, 다른 하나는 이미지를 잘라낸 후 압축하는 것입니다. 제 생각에는 동일 압축과 자르기 압축의 차이점은 다음과 같습니다.
동일 예시 압축: 이미지의 너비와 길이 비율이 합리적이고 이미지가 완성되었는지 확인할 수 있습니다. 그러나 실제 크기는 요구 사항을 충족한다고 보장되지 않습니다.
자르기 및 압축: 사진의 너비와 길이 비율이 합리적인지 확인하고 실제 크기도 보장할 수 있습니다. 그러나 사진의 무결성은 보장할 수 없습니다.image.php
  1. /**
  2. *
  3. * 이미지 처리 클래스
  4. * @author FC_LAMP
  5. * @internal 기능 포함: 워터마크, 썸네일
  6. */
  7. class Img
  8. {
  9. //이미지 형식
  10. 비공개 $exts = 배열('jpg', 'jpeg', 'gif', 'bmp', 'png' );
  11. /**
  12. *
  13. *
  14. * @throws 예외
  15. */
  16. 공용 함수 __construct()
  17. {
  18. if (! function_exists ( 'gd_info' ))
  19. {
  20. throw new Exception ( 'GD 라이브러리를 로드하지 못했습니다!' );
  21. }
  22. }
  23. /**
  24. *
  25. * 자르기 및 압축
  26. * @param $src_img 이미지
  27. * @param $save_img 생성 이미지
  28. * @param $option 매개변수 옵션(다음 포함): $maxwidth width $maxheight height
  29. * array('width'=>xx,'height'=>xxx)
  30. * @internal
  31. * 이미지가 너무 길거나 너무 넓은 경우 생성되는 일반적인 이미지 압축 방법
  32. *이를 처리하려면 먼저 자르고 비례적으로 압축하는 방법이 필요합니다.
  33. */
  34. 공개 함수 Thumb_img($src_img, $save_img = '', $option)
  35. {
  36. if (비어 있음 ( $option ['width'] ) 또는 비어 있음 ( $option ['height'] ))
  37. {
  38. return array ('flag' => False, 'msg' = > '원본 이미지의 길이와 너비는 0보다 작을 수 없습니다.' );
  39. }
  40. $org_ext = $this->is_img ( $src_img );
  41. if (! $org_ext [' flag'])
  42. {
  43. return $org_ext;
  44. }
  45. //저장 경로가 있으면 경로가 올바른지 확인
  46. if (!empty ( $save_img ))
  47. {
  48. $f = $this->check_dir ( $save_img );
  49. if (! $f ['flag'])
  50. {
  51. return $f;
  52. }
  53. }
  54. //해당 메소드 가져오기
  55. $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );
  56. //가져오기 원본 크기
  57. $source = $org_funcs ['create_func'] ( $src_img );
  58. $src_w = Imagesx ( $source );
  59. $src_h = imagey ( $source );
  60. //원본 이미지 조정(이미지 원본 모양 잘린 이미지 유지)
  61. $dst_scale = $option ['height'] / $option ['width'] // 대상 이미지 가로 세로 비율
  62. $src_scale = $ src_h / $src_w; // 원본 이미지 가로 세로 비율
  63. if ($src_scale >= $dst_scale)
  64. { // 너무 길다
  65. $w = intval ( $src_w );
  66. $h = intval ( $dst_scale * $w ) ;
  67. $x = 0;
  68. $y = ($src_h - $h) / 3;
  69. } else
  70. { // 너무 넓음
  71. $h = intval ( $ src_h );
  72. $w = intval ( $h / $dst_scale );
  73. $x = ($src_w - $w) / 2;
  74. $y = 0;
  75. }
  76. // 자르기
  77. $croped = imagecreatetruecolor( $w, $h );
  78. imagecopy( $croped, $source, 0, 0, $x, $y, $ src_w, $src_h );
  79. // 크기 조정
  80. $scale = $option ['너비'] / $w;
  81. $target = imagecreatetruecolor ( $option ['너비'], $option ['높이 '] );
  82. $ final_w = intval ( $w * $scale );
  83. $final_h = intval ( $h * $scale );
  84. imagecopyresampled ( $target, $croped, 0, 0, 0 , 0, $final_w, $final_h , $w, $h );
  85. imagedestroy ( $croped );
  86. //출력(저장) 이미지
  87. if (!empty ( $save_img ))
  88. {
  89. $org_funcs ['save_func'] ( $target, $save_img );
  90. } else
  91. {
  92. 헤더( $org_funcs ['header'] );
  93. $org_funcs ['save_func'] ( $target );
  94. }
  95. imagedestroy ( $target );
  96. return array ('flag' => True, 'msg' => '' );
  97. }
  98. /**
  99. *
  100. * 확대된 이미지
  101. * @param $src_img 원본 이미지
  102. * @param $save_img 저장 위치
  103. * @param $option 매개변수 설정 array('width'= >xx ,'키'=>xxx)
  104. *
  105. */
  106. 함수 resize_image($src_img, $save_img = '', $option)
  107. {
  108. $org_ext = $this-> ;is_img ( $src_img );
  109. if (! $org_ext ['flag'])
  110. {
  111. return $org_ext;
  112. }
  113. //저장 경로가 있는 경우 , 경로가 올바른지 확인
  114. if (!empty ( $save_img ))
  115. {
  116. $f = $this->check_dir ( $save_img );
  117. if (! $f [' flag'])
  118. {
  119. return $f;
  120. }
  121. }
  122. //해당 메소드 가져오기
  123. $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );
  124. //원본 크기 가져오기
  125. $source = $org_funcs ['create_func'] ( $src_img );
  126. $src_w = Imagesx ( $source );
  127. $src_h = 이미지 ( $source );
  128. if (($option ['너비'] && $src_w > $option ['너비']) || ($option ['높이'] && $src_h > $option ['높이' ]))
  129. {
  130. if ($option ['너비'] && $src_w > $option ['너비'])
  131. {
  132. $widthratio = $option ['너비'] / $src_w;
  133. $resizewidth_tag = true;
  134. }
  135. if ($option ['height'] && $src_h > $option [' height'])
  136. {
  137. $heightratio = $option ['height'] / $src_h;
  138. $resizeheight_tag = true;
  139. }
  140. if ($resizewidth_tag && $resizeheight_tag )
  141. {
  142. if ($ widthratio $ratio = $widthratio;
  143. else
  144. $ratio = $heightratio;
  145. }
  146. if ($resizewidth_tag && ! $resizeheight_tag)
  147. $ratio = $widthratio;
  148. if ($resizeheight_tag && ! $resizewidth_tag)
  149. $ratio = $heightratio;
  150. $newwidth = $src_w * $ratio;
  151. $newheight = $src_h * $ratio;
  152. if (function_exists ( "imagecopyresampled" ))
  153. {
  154. $newim = imagecreatetruecolor ( $newwidth, $newheight );
  155. imagecopyresampled( $newim, $source, 0 , 0, 0, 0, $newwidth, $newheight, $src_w, $src_h );
  156. } else
  157. {
  158. $newim = imagecreate( $newwidth , $newheight );
  159. imagecopyreised ( $ newim, $source, 0, 0, 0, 0, $newwidth, $newheight, $src_w, $src_h );
  160. }
  161. }
  162. //그림 출력(저장)
  163. if (!empty ( $save_img ))
  164. {
  165. $org_funcs ['save_func'] ( $newim, $save_img );
  166. } else
  167. {
  168. 헤더( $org_funcs ['header'] );
  169. $org_funcs ['save_func']( $newim );
  170. }
  171. imagedestroy( $newim );
  172. 반환 배열 ('flag' => True, 'msg' => '' );
  173. }
  174. /**
  175. *
  176. * 워터마크 이미지 생성
  177. * @param $org_img 원본 이미지
  178. * @param $mark_img 워터마크 이미지
  179. * @param $save_img 디렉토리가 존재하지 않으면 Create를 시도합니다. 디렉토리
  180. * @param array $option 워터마크에 대한 기본 설정은 다음과 같습니다.
  181. * x: 워터마크의 가로 위치, 기본값은 워터마크 이미지의 너비를 뺀 값입니다.
  182. * y: 워터마크의 세로 위치, 기본값은 워터마크의 높이를 뺀 값
  183. * alpha: 알파 값(투명도 조절), 기본값은 50
  184. */
  185. 공개 함수 water_mark($org_img, $mark_img, $save_img = '', $option = array())
  186. {
  187. //사진 확인
  188. $org_ext = $this->is_img ( $org_img );
  189. if ( ! $org_ext ['플래그'])
  190. {
  191. return $org_ext;
  192. }
  193. $mark_ext = $this->is_img ( $mark_img );
  194. if (! $mark_ext [ ' flag'])
  195. {
  196. return $mark_ext;
  197. }
  198. //저장 경로가 있으면 경로가 맞는지 확인
  199. if (!empty ( $save_img ))
  200. {
  201. $f = $this->check_dir ( $save_img );
  202. if (! $f ['flag'])
  203. {
  204. return $f;
  205. }
  206. }
  207. //해당 캔버스 가져오기
  208. $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );
  209. $org_img_im = $org_funcs ['create_func' ] ( $org_img ) ;
  210. $mark_funcs = $this->get_img_funcs ( $mark_ext ['msg'] );
  211. $mark_img_im = $mark_funcs ['create_func'] ( $mark_img );
  212. //워터마크 이미지 좌표 복사
  213. $mark_img_im_x = 0;
  214. $mark_img_im_y = 0;
  215. //워터마크 이미지 높이 및 너비 복사
  216. $mark_img_w = ​​​​imagesx ( $mark_img_im );
  217. $mark_img_h = 이미지( $mark_img_im );
  218. $org_img_w = ​​​​이미지x( $org_img_im );
  219. $org_img_h = 이미지x( $org_img_im );
  220. / /합성 생성점 좌표
  221. $x = $org_img_w - $mark_img_w;
  222. $org_img_im_x = isset ( $option ['x'] ) ? $option ['x'] : $x;
  223. $org_img_im_x = ($org_img_im_x > $org_img_w 또는 $ org_img_im_x $y = $org_img_h - $mark_img_h;
  224. $org_img_im_y = isset ( $option ['y'] ) ? $option ['y'] : $ y;
  225. $org_img_im_y = ($org_img_im_y > $org_img_h 또는 $org_img_im_y
  226. //알파
  227. $alpha = isset ( $option [' alpha'] ) ? $option ['alpha'] : 50;
  228. $alpha = ($alpha > 100 또는 $alpha
  229. //이미지 병합
  230. 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 );
  231. / /출력(저장) 이미지
  232. if (!empty ( $save_img ))
  233. {
  234. $org_funcs ['save_func'] ( $org_img_im, $save_img );
  235. } else
  236. {
  237. 헤더( $org_funcs [ 'header'] );
  238. $org_funcs ['save_func']( $org_img_im );
  239. }
  240. //캔버스 삭제
  241. imagedestroy( $org_img_im );
  242. imagedestroy ( $mark_img_im );
  243. return array ('flag' => True, 'msg' => '' );
  244. }
  245. /* *
  246. *
  247. * 이미지 확인
  248. * @paramknown_type $img_path
  249. * @return array('flag'=>true/false,'msg'=>ext/error message)
  250. */
  251. 비공개 함수 is_img($img_path)
  252. {
  253. if (!file_exists ( $img_path ))
  254. {
  255. 반환 배열 ('flag' => False, 'msg' => "$img_path 이미지 로드 실패! " );
  256. }
  257. $ext = 폭발( '.', $img_path );
  258. $ext = strtolower( end( $ext ) );
  259. if(!in_array( $ext, $ this->exts ))
  260. {
  261. return array ('flag' => False, 'msg' => "$img_path 이미지의 형식이 잘못되었습니다!" );
  262. }
  263. 반환 배열 ('flag' => True, 'msg' => $ext );
  264. }
  265. /**
  266. *
  267. * 올바른 이미지 함수를 반환합니다
  268. * @paramknown_type $ext
  269. */
  270. 비공개 함수 get_img_funcs($ext)
  271. {
  272. //选择
  273. 스위치($ext)
  274. {
  275. case 'jpg' :
  276. $header = 'Content-Type: image/jpeg';
  277. $createfunc = 'imagecreatefromjpeg';
  278. $savefunc = 'imagejpeg';
  279. break;
  280. case 'jpeg' :
  281. $header = 'Content-Type:image /jpeg';
  282. $createfunc = 'imagecreatefromjpeg';
  283. $savefunc = 'imagejpeg';
  284. break;
  285. case 'gif' :
  286. $header = 'Content-Type:image/ gif';
  287. $createfunc = 'imagecreatefromgif';
  288. $savefunc = 'imagegif';
  289. break;
  290. case 'bmp' :
  291. $header = '콘텐츠 유형:이미지/bmp ';
  292. $createfunc = 'imagecreatefrombmp';
  293. $savefunc = 'imagebmp';
  294. break;
  295. 기본값:
  296. $header = 'Content-Type:image/png';
  297. $createfunc = 'imagecreatefrompng';
  298. $savefunc = 'imagepng';
  299. }
  300. 반환 배열('save_func' => $savefunc, 'create_func' => $createfunc, 'header' = > $header );
  301. }
  302. /**
  303. *
  304. * 디렉터리를 확인하고 생성해 보세요.
  305. * @param $save_img
  306. */
  307. 비공개 함수 check_dir($save_img)
  308. {
  309. $dir = dirname ( $save_img );
  310. 만일(! is_dir ( $dir ))
  311. {
  312. if (! mkdir ( $dir, 0777, true ))
  313. {
  314. return array ('flag' => False, 'msg' => "图文保存目录 $dir 无法创建!" );
  315. }
  316. }
  317. 반환 배열 ('flag' => True, 'msg' => '' );
  318. }
  319. }
  320. if (! 비어 있음 ( $_FILES ['test'] ['tmp_name'] ))
  321. {
  322. //例子
  323. $img = new Img ();
  324. //원래
  325. $name = 폭발( '.', $_FILES ['test'] ['name'] );
  326. $org_img = 'D:/test.' . end ( $name );
  327. move_uploaded_file ( $_FILES ['test'] ['tmp_name'], $org_img );
  328. $option = array ('width' => $_POST ['width'], '높이' => $_POST ['높이'] );
  329. if ($_POST ['type'] == 1)
  330. {
  331. $s = $img->resize_image ( $org_img , '', $option );
  332. } else
  333. {
  334. $img->thumb_img( $org_img, '', $option );
  335. }
  336. 연결 해제( $org_img );
  337. }
复代码

사용 방법:

水印
  1. $img = 새 Img();
  2. $org_img = 'D:/tt.png';
  3. $mark_img = 'D:/t .png';
  4. //保存水印图 Images(如果$save_img为空时,将会直接输图文)
  5. $save_img = 'D:/test99h/testone/sss.png';
  6. //水印设置调节
  7. $option = array ('x' => 50, 'y' => 50, 'alpha' => 80 );
  8. //生成水印图文
  9. $flag = $img->water_mark ( $org_img, $mark_img, $save_img, $option );
复代码

当我们调节 $option 参数时,会有数变化:

1 $option = 배열('x' => 0, 'y' => 0, '알파' => 50 );

2$option = 배열('x' => 50, 'y' => 50, '알파' => 80 );


3 如果你不设置$option 参数,将会采用默认值:

如果要纯文字式的水印,可以参看这里:http://www.php.net/manual/zh/image.examples.merged-watermark.php
  1. //例子
  2. $img = 새 이미지();
  3. $org_img = 'D:/tt.png';
  4. //压缩图picture(100*100)
  5. $option = array ('width' => 100, 'height' => 100 );
  6. //$save_img为空时,将会直接输출图이미지到浏览器
  7. $save_img = 'D:/test99h/testone/sss_thumb.png';
  8. $flag = $img->thumb_img ( $org_img, $save_img, $option );
复代码

调节$옵션의 큰 크기:
  1. $option = 배열('너비' => 200, '높이' => 200);
제제대码

水印与压缩图
  1. $img = new Img ();
  2. //hara图
  3. $org_img = 'D:/tt.png';
  4. //水印标记图
  5. $mark_img = 'D:/t.png';
  6. //保存水印图文
  7. $save_img = 'D:/test99h/testone/sss.png';
  8. //水印设置调节
  9. $option = array ('x' => 50, 'y' => 50, 'alpha' => 60 );
  10. //生成水印图文
  11. $flag = $img->water_mark ( $org_img, $mark_img, $save_img, $option );
  12. //压缩水印图文
  13. $option = array ('너비' => 200, '높이' => 200 );
  14. //保存压缩图
  15. $save_img2 = 'D:/test99h/testone/sss2_thumb.png';
  16. $flag = $img->thumb_img ( $save_img, $save_img2, $ 옵션 ); //等比例压缩类似
复代码

생성된 워터마크 이미지를 압축할 때, 압축 후 생성된 이미지의 형식은 원본 이미지 및 워터마크 이미지와 일치해야 합니다. 그렇지 않으면 알 수 없는 오류가 발생합니다.

또한 참고: 이미지 압축의 원리는 제가 고안한 것이 아닙니다.
이미지 처리, 비례, PHP


성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
11 최고의 PHP URL 쇼트너 스크립트 (무료 및 프리미엄)11 최고의 PHP URL 쇼트너 스크립트 (무료 및 프리미엄)Mar 03, 2025 am 10:49 AM

종종 키워드와 추적 매개 변수로 혼란스러워하는 긴 URL은 방문자를 방해 할 수 있습니다. URL 단축 스크립트는 솔루션을 제공하여 소셜 미디어 및 기타 플랫폼에 이상적인 간결한 링크를 만듭니다. 이 스크립트는 개별 웹 사이트 a에 유용합니다

Instagram API 소개Instagram API 소개Mar 02, 2025 am 09:32 AM

Instagram은 2012 년 Facebook에서 유명한 인수에 이어 타사 사용을 위해 두 개의 API 세트를 채택했습니다. Instagram Graph API 및 Instagram Basic Display API입니다. 개발자는

Laravel의 플래시 세션 데이터로 작업합니다Laravel의 플래시 세션 데이터로 작업합니다Mar 12, 2025 pm 05:08 PM

Laravel은 직관적 인 플래시 방법을 사용하여 임시 세션 데이터 처리를 단순화합니다. 응용 프로그램에 간단한 메시지, 경고 또는 알림을 표시하는 데 적합합니다. 데이터는 기본적으로 후속 요청에만 지속됩니다. $ 요청-

Laravel Back End : Part 2, React가있는 React 앱 구축Laravel Back End : Part 2, React가있는 React 앱 구축Mar 04, 2025 am 09:33 AM

이것은 Laravel 백엔드가있는 React Application을 구축하는 데있어 시리즈의 두 번째이자 마지막 부분입니다. 이 시리즈의 첫 번째 부분에서는 기본 제품 목록 응용 프로그램을 위해 Laravel을 사용하여 편안한 API를 만들었습니다. 이 튜토리얼에서는 Dev가 될 것입니다

Laravel 테스트에서 단순화 된 HTTP 응답 조롱Laravel 테스트에서 단순화 된 HTTP 응답 조롱Mar 12, 2025 pm 05:09 PM

Laravel은 간결한 HTTP 응답 시뮬레이션 구문을 제공하여 HTTP 상호 작용 테스트를 단순화합니다. 이 접근법은 테스트 시뮬레이션을보다 직관적으로 만들면서 코드 중복성을 크게 줄입니다. 기본 구현은 다양한 응답 유형 단축키를 제공합니다. Illuminate \ support \ Facades \ http를 사용하십시오. http :: 가짜 ([ 'google.com'=> ​​'Hello World', 'github.com'=> ​​[ 'foo'=> 'bar'], 'forge.laravel.com'=>

PHP의 컬 : REST API에서 PHP Curl Extension 사용 방법PHP의 컬 : REST API에서 PHP Curl Extension 사용 방법Mar 14, 2025 am 11:42 AM

PHP 클라이언트 URL (CURL) 확장자는 개발자를위한 강력한 도구이며 원격 서버 및 REST API와의 원활한 상호 작용을 가능하게합니다. PHP CURL은 존경받는 다중 프로모토콜 파일 전송 라이브러리 인 Libcurl을 활용하여 효율적인 execu를 용이하게합니다.

Codecanyon에서 12 개의 최고의 PHP 채팅 스크립트Codecanyon에서 12 개의 최고의 PHP 채팅 스크립트Mar 13, 2025 pm 12:08 PM

고객의 가장 긴급한 문제에 실시간 인스턴트 솔루션을 제공하고 싶습니까? 라이브 채팅을 통해 고객과 실시간 대화를 나누고 문제를 즉시 해결할 수 있습니다. 그것은 당신이 당신의 관습에 더 빠른 서비스를 제공 할 수 있도록합니다.

2025 PHP 상황 조사 발표2025 PHP 상황 조사 발표Mar 03, 2025 pm 04:20 PM

2025 PHP Landscape Survey는 현재 PHP 개발 동향을 조사합니다. 개발자와 비즈니스에 대한 통찰력을 제공하는 프레임 워크 사용, 배포 방법 및 과제를 탐색합니다. 이 조사는 현대 PHP Versio의 성장을 예상합니다

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기