>  기사  >  php教程  >  生成图像缩略图(支持:JPEG,GIT,PNG,BMP)

生成图像缩略图(支持:JPEG,GIT,PNG,BMP)

PHP中文网
PHP中文网원래의
2016-05-25 17:10:17948검색

<?php
class Thumb
{

 public function create($srcPath, $dstPath, $dstWidth, $dstHeight)
{
 if (!file_exists($srcPath)) {
 return false;
}

 @$srcSize = getimagesize($srcPath);
 if (empty($srcSize)) {
 return false;
}

 $srcWith = intval($srcSize[0]);
 $srcHeight = intval($srcSize[1]);

//如果原始图片的尺寸大于指定缩略图的尺寸,则生成缩略图,否则拷贝原始文件
 if ($srcWith <= $dstWidth && $srcHeight <= $dstHeight) {
 return copy($srcPath, $dstPath);
}

//读取原始图片资源
 @$srcImage = imagecreatefromjpeg($srcPath);
 if (empty($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[&#39;width&#39;], $dstSize[&#39;height&#39;]
);

@imagecopyresampled(
 $dstImage, $srcImage , 0, 0, 0, 0,
 $dstSize[&#39;width&#39;], $dstSize[&#39;height&#39;],
 $srcWith, $srcHeight
);

 return @imagepng($srcPath, $dstPath);
}

 private function _imageCreateFromBMP($filePath)
{
 $fileHandle = fopen($filePath, &#39;rb&#39;);
 if (empty($fileHandle)) {
 return false;
}

 $file = unpack(
&#39;vfile_type/Vfile_size/Vreserved/Vbitmap_offset&#39;,
 fread($fileHandle, 14)
);

 if ($file[&#39;file_type&#39;] != 19778) {
 return false;
}

 $bmp = unpack(
&#39;Vheader_size/Vwidth/Vheight/vplanes/&#39;.
&#39;vbits_per_pixel/Vcompression/Vsize_bitmap/&#39;.
&#39;Vhoriz_resolution/Vvert_resolution/Vcolors_used/Vcolors_important&#39;,
 fread($fileHandle, 40)
);
 $bmp[&#39;colors&#39;] = pow(2, $bmp[&#39;bits_per_pixel&#39;]);
 if ($bmp[&#39;size_bitmap&#39;] == 0) {
 $bmp[&#39;size_bitmap&#39;] = $file[&#39;file_size&#39;] - $file[&#39;bitmap_offset&#39;];
}
 $bmp[&#39;bytes_per_pixel&#39;] = $bmp[&#39;bits_per_pixel&#39;] / 8;
 $bmp[&#39;bytes_per_pixel2&#39;] = ceil($bmp[&#39;bytes_per_pixel&#39;]);
 $bmp[&#39;decal&#39;] = $bmp[&#39;width&#39;] * $bmp[&#39;bytes_per_pixel&#39;] / 4;
 $bmp[&#39;decal&#39;] -= floor($bmp[&#39;width&#39;] * $bmp[&#39;bytes_per_pixel&#39;] / 4);
 $bmp[&#39;decal&#39;] = 4 - (4 * $bmp[&#39;decal&#39;]);
 if ($bmp[&#39;decal&#39;] == 4) {
 $bmp[&#39;decal&#39;] = 0;
}

 $palette = array();
 if ($bmp[&#39;colors&#39;] < 16777216) {
 $palette = unpack(
 &#39;V&#39; . $bmp[&#39;colors&#39;],
 fread($fileHandle, $bmp[&#39;colors&#39;] * 4)
);
}
 $image = fread($fileHandle, $bmp[&#39;size_bitmap&#39;]);
 $vide = chr(0);
 $res = imagecreatetruecolor($bmp[&#39;width&#39;], $bmp[&#39;height&#39;]);
 $p = 0;

 $y = $bmp[&#39;height&#39;] - 1;
 while ($y >= 0) {
 $x = 0;
 while ($x < $bmp[&#39;width&#39;]) {
 if ($bmp[&#39;bits_per_pixel&#39;] == 24) {
 $color = unpack(&#39;V&#39;, substr($image, $p, 3) . $vide);
 } else if ($bmp[&#39;bits_per_pixel&#39;] == 16) {
 $color = unpack(&#39;n&#39;, substr($image, $p, 2));
 $color[1] = $palette[$color[1]+1];
 } else if ($bmp[&#39;bits_per_pixel&#39;] == 8) {
 $color = unpack(&#39;n&#39;, $vide . substr ($image, $p, 1));
 $color[1] = $palette[$color[1]+1];
 } else if ($bmp[&#39;bits_per_pixel&#39;] ==4) {
 $color = unpack(&#39;n&#39;, $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[&#39;bits_per_pixel&#39;] == 1) {
 $color = unpack(&#39;n&#39;, $vide . substr($image, floor($p), 1));
 switch (($p * 8) % 8) {
 case 0:
 $color[1] = ($color[1] >> 7);
break;
 case 1:
 $color[1] = ($color[1] & 0x40) >> 6;
break;
 case 2:
 $color[1] = ($color[1] & 0x20) >> 5;
break;
 case 3:
 $color[1] = ($color[1] & 0x10) >> 4;
break;
 case 4:
 $color[1] = ($color[1] & 0x8) >> 3;
break;
 case 5:
 $color[1] = ($color[1] & 0x4) >> 2;
break;
 case 6:
 $color[1] = ($color[1] & 0x2) >> 1;
break;
 case 7:
 $color[1] = ($color[1] & 0x1);
break;
}
 $color[1] = $palette[$color[1] + 1];
 } else {
 return false;
}
 imagesetpixel($res, $x, $y, $color[1]);
$x++;
 $p += $bmp[&#39;bytes_per_pixel&#39;];
}
$y--;
 $p += $bmp[&#39;decal&#39;];
}
fclose($fileHandle);
 return $res;
}

 private function _getDstSize($srcWith, $srcHeight, $dstWidth, $dstHeight)
{
 $size = array(&#39;width&#39; => $srcWith, &#39;height&#39; => $srcHeight);
 if ($dstWidth > 0 && $dstHeight > 0) {
 if ($srcWith > 0 && $srcHeight > 0) {
 if ($srcWith / $srcHeight >= $dstWidth / $dstHeight) {
 if ($srcWith > $dstWidth) {
 $size[&#39;width&#39;] = $dstWidth;
 $size[&#39;height&#39;] = $srcHeight * $dstWidth / $srcWith;
}
 } else {
 if ($srcHeight > $dstHeight) {
 $size[&#39;width&#39;] = $srcWith * $dstHeight / $srcHeight;
 $size[&#39;height&#39;] = $dstHeight;
}
}
}
}
 return $size;
}
}

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