>  기사  >  백엔드 개발  >  php는 이미지 썸네일을 생성합니다(지원: JPEG, GIT, PNG, BMP)

php는 이미지 썸네일을 생성합니다(지원: JPEG, GIT, PNG, BMP)

WBOY
WBOY원래의
2016-07-25 08:45:091291검색
  1. class Thumb
  2. {
  3. 공개 함수 생성($srcPath, $dstPath, $dstWidth, $dstHeight)
  4. {
  5. if (!file_exists($srcPath)) {
  6. return false;
  7. }
  8. @$srcSize = getimagesize($srcPath);
  9. if (empty($srcSize) ) {
  10. false 반환;
  11. }
  12. $srcWith = intval($srcSize[0]);
  13. $srcHeight = intval($srcSize[1]);
  14. //원본 이미지의 크기가 지정된 썸네일의 크기보다 큰 경우 썸네일을 생성하고, 그렇지 않으면 원본 파일을 복사합니다.
  15. if ($srcWith <= $dstWidth && $srcHeight <= $dstHeight) {
  16. return copy($srcPath, $dstPath);
  17. }
  18. //원본 이미지 리소스 읽기
  19. @$srcImage = imagecreatefromjpeg($srcPath);
  20. if (비어 있음) ($srcImage)) {
  21. @$srcImage = imagecreatefromgif($srcPath);
  22. }
  23. if (empty($srcImage)) {
  24. @$srcImage = imagecreatefrompng($srcPath);
  25. }
  26. if (empty($srcImage)) {
  27. @$srcImage = $this->_imageCreateFromBMP($srcPath);
  28. }
  29. if (empty($srcImage)) {
  30. return false;
  31. }
  32. //썸네일의 크기를 가져오고 이에 따라 새 이미지를 생성합니다
  33. $dstSize = $this->_getDstSize(
  34. $srcWith, $srcHeight, $ dstWidth, $dstHeight
  35. );
  36. @$dstImage = imagecreatetruecolor(
  37. $dstSize['width'], $dstSize['height']
  38. );
  39. @imagecopyresampled(
  40. $dstImage, $srcImage , 0, 0, 0, 0,
  41. $dstSize['width'], $dstSize['height'],
  42. $srcWith, $ srcHeight
  43. );
  44. return @imagepng($srcPath, $dstPath);
  45. }
  46. 비공개 함수 _imageCreateFromBMP($filePath)
  47. {
  48. $fileHandle = fopen($filePath , 'rb');
  49. if (empty($fileHandle)) {
  50. return false;
  51. }
  52. $file = unpack(
  53. 'vfile_type/Vfile_size /Vreserved/Vbitmap_offset ',
  54. fread($fileHandle, 14)
  55. );
  56. if ($file['file_type'] != 19778) {
  57. return false;
  58. }
  59. $bmp = unpack(
  60. 'Vheader_size/Vwidth/Vheight/vplanes/'.
  61. 'vbits_per_pixel/Vcompression/Vsize_bitmap/'.
  62. 'Vhoriz_solution/Vvert_solution/Vcolors_used/Vcolors_important' ,
  63. fread($fileHandle, 40)
  64. );
  65. $bmp['colors'] = pow(2, $bmp['bits_per_pixel']);
  66. if ($bmp['size_bitmap) '] == 0) {
  67. $bmp['size_bitmap'] = $file['file_size'] - $file['bitmap_offset'];
  68. }
  69. $bmp['bytes_per_pixel'] = $ bmp['bits_per_pixel'] / 8;
  70. $bmp['bytes_per_pixel2'] = ceil($bmp['bytes_per_pixel']);
  71. $bmp['decal'] = $bmp['width'] * $bmp[' bytes_per_pixel'] / 4;
  72. $bmp['decal'] -= Floor($bmp['width'] * $bmp['bytes_per_pixel'] / 4);
  73. $bmp[' 데칼'] = 4 - (4 * $bmp['decal']);
  74. if ($bmp['decal'] == 4) {
  75. $bmp['decal'] = 0;
  76. }
  77. $palette = array();
  78. if ($bmp['colors'] < 16777216) {
  79. $palette = unpack(
  80. 'V' . $bmp[ 'colors'] ,
  81. fread($fileHandle, $bmp['colors'] * 4)
  82. );
  83. }
  84. $image = fread($fileHandle, $bmp['size_bitmap'] );
  85. $vide = chr(0);
  86. $res = imagecreatetruecolor($bmp['width'], $bmp['height']);
  87. $p = 0;
  88. $y = $bmp['height'] - 1;
  89. while ($y >= 0) {
  90. $x = 0;
  91. while ($x < $bmp['width ']) {
  92. if ($bmp['bits_per_pixel'] == 24) {
  93. $color = unpack('V', substr($image, $p, 3) . $vide);
  94. } else if ($bmp['bits_per_pixel'] == 16) {
  95. $color = unpack('n', substr($image, $p, 2));
  96. $color[1] = $palette[$ color[1] 1];
  97. } else if ($bmp['bits_per_pixel'] == 8) {
  98. $color = unpack('n', $vide . substr ($image, $p, 1 ));
  99. $color[1] = $palette[$color[1] 1];
  100. } else if ($bmp['bits_per_pixel'] ==4) {
  101. $ color = unpack( 'n', $vide . substr($image, Floor($p), 1));
  102. if (($p * 2) % 2 == 0) {
  103. $color[ 1] = ( $color[1] >> 4);
  104. } else {
  105. $color[1] = ($color[1] & 0x0F);
  106. }
  107. $color [1] = $palette[$color[1] 1];
  108. }else if ($bmp['bits_per_pixel'] == 1) {
  109. $color = unpack('n', $vide . substr($image, Floor($p), 1));
  110. 스위치( ($p * 8) % 8) {
  111. 사례 0:
  112. $color[1] = ($color[1] >> 7);
  113. 중단;
  114. 사례 1:
  115. $color[1] = ($color[1] & 0x40) >> 6;
  116. 중단;
  117. 사례 2:
  118. $color[1] = ($color[1] & 0x20) >> 5;
  119. 중단;
  120. 사례 3:
  121. $color[1] = ($color[1] & 0x10) >> 4;
  122. 중단;
  123. 사례 4:
  124. $color[1] = ($color[1] & 0x8) >> 3;
  125. 중단;
  126. 사례 5:
  127. $color[1] = ($color[1] & 0x4) >> 2;
  128. 중단;
  129. 사례 6:
  130. $color[1] = ($color[1] & 0x2) >> 1;
  131. 중단;
  132. 사례 7:
  133. $color[1] = ($color[1] & 0x1);
  134. 중단;
  135. }
  136. $color[1] = $palette[$color[1] 1];
  137. } else {
  138. return false;
  139. }
  140. imagesetpixel($res, $x, $y, $color[1]);
  141. $x ;
  142. $p = $bmp['bytes_per_pixel'];
  143. }
  144. $y--;
  145. $p = $bmp['decal'];
  146. }
  147. fclose($fileHandle);
  148. $res 반환;
  149. }
  150. 개인 함수 _getDstSize($srcWith, $srcHeight, $dstWidth, $dstHeight)
  151. {
  152. $size = array('width' => $srcWith, 'height' => $srcHeight);
  153. if ($dstWidth > 0 && $dstHeight > 0) {
  154. if ($srcWith > 0 && $srcHeight > 0) {
  155. if ($srcWith / $srcHeight >= $dstWidth / $dstHeight) {
  156. if ($srcWith > $dstWidth) {
  157. $size['width'] = $dstWidth;
  158. $size['height'] = $srcHeight * $dstWidth / $srcWith;
  159. }
  160. } else {
  161. if ($srcHeight > $dstHeight) {
  162. $size['width'] = $srcWith * $dstHeight / $srcHeight;
  163. $size['height'] = $dstHeight;
  164. }
  165. }
  166. }
  167. }
  168. $size 반환;
  169. }
  170. }
复代码

JPEG, PHP, GIT


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.