- class Thumb
- {
- 공개 함수 생성($srcPath, $dstPath, $dstWidth, $dstHeight)
- {
- if (!file_exists($srcPath)) {
- return false;
- }
- @$srcSize = getimagesize($srcPath);
- if (empty($srcSize) ) {
- false 반환;
- }
- $srcWith = intval($srcSize[0]);
- $srcHeight = intval($srcSize[1]);
- //원본 이미지의 크기가 지정된 썸네일의 크기보다 큰 경우 썸네일을 생성하고, 그렇지 않으면 원본 파일을 복사합니다.
- if ($srcWith <= $dstWidth && $srcHeight <= $dstHeight) {
- return copy($srcPath, $dstPath);
- }
- //원본 이미지 리소스 읽기
- @$srcImage = imagecreatefromjpeg($srcPath);
- if (비어 있음) ($srcImage)) {
- @$srcImage = imagecreatefromgif($srcPath);
- }
- if (empty($srcImage)) {
- @$srcImage = imagecreatefrompng($srcPath);
- }
- if (empty($srcImage)) {
- @$srcImage = $this->_imageCreateFromBMP($srcPath);
- }
-
- if (empty($srcImage)) {
- return false;
- }
-
- //썸네일의 크기를 가져오고 이에 따라 새 이미지를 생성합니다
- $dstSize = $this->_getDstSize(
- $srcWith, $srcHeight, $ dstWidth, $dstHeight
- );
-
- @$dstImage = imagecreatetruecolor(
- $dstSize['width'], $dstSize['height']
- );
-
- @imagecopyresampled(
- $dstImage, $srcImage , 0, 0, 0, 0,
- $dstSize['width'], $dstSize['height'],
- $srcWith, $ srcHeight
- );
-
- return @imagepng($srcPath, $dstPath);
- }
-
- 비공개 함수 _imageCreateFromBMP($filePath)
- {
- $fileHandle = fopen($filePath , 'rb');
- if (empty($fileHandle)) {
- return false;
- }
-
- $file = unpack(
- 'vfile_type/Vfile_size /Vreserved/Vbitmap_offset ',
- fread($fileHandle, 14)
- );
-
- if ($file['file_type'] != 19778) {
- return false;
- }
-
- $bmp = unpack(
- 'Vheader_size/Vwidth/Vheight/vplanes/'.
- 'vbits_per_pixel/Vcompression/Vsize_bitmap/'.
- 'Vhoriz_solution/Vvert_solution/Vcolors_used/Vcolors_important' ,
- fread($fileHandle, 40)
- );
- $bmp['colors'] = pow(2, $bmp['bits_per_pixel']);
- if ($bmp['size_bitmap) '] == 0) {
- $bmp['size_bitmap'] = $file['file_size'] - $file['bitmap_offset'];
- }
- $bmp['bytes_per_pixel'] = $ bmp['bits_per_pixel'] / 8;
- $bmp['bytes_per_pixel2'] = ceil($bmp['bytes_per_pixel']);
- $bmp['decal'] = $bmp['width'] * $bmp[' bytes_per_pixel'] / 4;
- $bmp['decal'] -= Floor($bmp['width'] * $bmp['bytes_per_pixel'] / 4);
- $bmp[' 데칼'] = 4 - (4 * $bmp['decal']);
- if ($bmp['decal'] == 4) {
- $bmp['decal'] = 0;
- }
-
- $palette = array();
- if ($bmp['colors'] < 16777216) {
- $palette = unpack(
- 'V' . $bmp[ 'colors'] ,
- fread($fileHandle, $bmp['colors'] * 4)
- );
- }
- $image = fread($fileHandle, $bmp['size_bitmap'] );
- $vide = chr(0);
- $res = imagecreatetruecolor($bmp['width'], $bmp['height']);
- $p = 0;
- $y = $bmp['height'] - 1;
- while ($y >= 0) {
- $x = 0;
- while ($x < $bmp['width ']) {
- if ($bmp['bits_per_pixel'] == 24) {
- $color = unpack('V', substr($image, $p, 3) . $vide);
- } else if ($bmp['bits_per_pixel'] == 16) {
- $color = unpack('n', substr($image, $p, 2));
- $color[1] = $palette[$ color[1] 1];
- } else if ($bmp['bits_per_pixel'] == 8) {
- $color = unpack('n', $vide . substr ($image, $p, 1 ));
- $color[1] = $palette[$color[1] 1];
- } else if ($bmp['bits_per_pixel'] ==4) {
- $ color = unpack( 'n', $vide . substr($image, Floor($p), 1));
- if (($p * 2) % 2 == 0) {
- $color[ 1] = ( $color[1] >> 4);
- } else {
- $color[1] = ($color[1] & 0x0F);
- }
- $color [1] = $palette[$color[1] 1];
- }else if ($bmp['bits_per_pixel'] == 1) {
- $color = unpack('n', $vide . substr($image, Floor($p), 1));
- 스위치( ($p * 8) % 8) {
- 사례 0:
- $color[1] = ($color[1] >> 7);
- 중단;
- 사례 1:
- $color[1] = ($color[1] & 0x40) >> 6;
- 중단;
- 사례 2:
- $color[1] = ($color[1] & 0x20) >> 5;
- 중단;
- 사례 3:
- $color[1] = ($color[1] & 0x10) >> 4;
- 중단;
- 사례 4:
- $color[1] = ($color[1] & 0x8) >> 3;
- 중단;
- 사례 5:
- $color[1] = ($color[1] & 0x4) >> 2;
- 중단;
- 사례 6:
- $color[1] = ($color[1] & 0x2) >> 1;
- 중단;
- 사례 7:
- $color[1] = ($color[1] & 0x1);
- 중단;
- }
- $color[1] = $palette[$color[1] 1];
- } else {
- return false;
- }
- imagesetpixel($res, $x, $y, $color[1]);
- $x ;
- $p = $bmp['bytes_per_pixel'];
- }
- $y--;
- $p = $bmp['decal'];
- }
- fclose($fileHandle);
- $res 반환;
- }
-
- 개인 함수 _getDstSize($srcWith, $srcHeight, $dstWidth, $dstHeight)
- {
- $size = array('width' => $srcWith, 'height' => $srcHeight);
- if ($dstWidth > 0 && $dstHeight > 0) {
- if ($srcWith > 0 && $srcHeight > 0) {
- if ($srcWith / $srcHeight >= $dstWidth / $dstHeight) {
- if ($srcWith > $dstWidth) {
- $size['width'] = $dstWidth;
- $size['height'] = $srcHeight * $dstWidth / $srcWith;
- }
- } else {
- if ($srcHeight > $dstHeight) {
- $size['width'] = $srcWith * $dstHeight / $srcHeight;
- $size['height'] = $dstHeight;
- }
- }
- }
- }
- $size 반환;
- }
- }
复代码
|