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

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['width'], $dstSize['height']

);

@imagecopyresampled(

$dstImage, $srcImage , 0, 0, 0, 0,

$dstSize['width'], $dstSize['height'],

$srcWith, $srcHeight

);

return @imagepng($srcPath, $dstPath);

}

private function _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_resolution/Vvert_resolution/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['decal'] = 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));

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['bytes_per_pixel'];

}

$y--;

$p += $bmp['decal'];

}

fclose($fileHandle);

return $res;

}

private function _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;

}

}

}

}

return $size;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值