PHP缩略图等比例无损压缩,可填充空白区域补充色


Posted in PHP onJune 10, 2011
<?php 
error_reporting( E_ALL ); 
// 测试 
imagezoom('1.jpg', '2.jpg', 400, 300, '#FFFFFF'); 
/* 
php缩略图函数: 
等比例无损压缩,可填充补充色 author: 华仔 
主持格式: 
bmp 、jpg 、gif、png 
param: 
@srcimage : 要缩小的图片 
@dstimage : 要保存的图片 
@dst_width: 缩小宽 
@dst_height: 缩小高 
@backgroundcolor: 补充色 如:#FFFFFF 支持 6位 不支持3位 
*/ 
function imagezoom( $srcimage, $dstimage, $dst_width, $dst_height, $backgroundcolor ) { 
// 中文件名乱码 
if ( PHP_OS == 'WINNT' ) { 
$srcimage = iconv('UTF-8', 'GBK', $srcimage); 
$dstimage = iconv('UTF-8', 'GBK', $dstimage); 
} 
$dstimg = imagecreatetruecolor( $dst_width, $dst_height ); 
$color = imagecolorallocate($dstimg 
, hexdec(substr($backgroundcolor, 1, 2)) 
, hexdec(substr($backgroundcolor, 3, 2)) 
, hexdec(substr($backgroundcolor, 5, 2)) 
); 
imagefill($dstimg, 0, 0, $color); 
if ( !$arr=getimagesize($srcimage) ) { 
echo "要生成缩略图的文件不存在"; 
exit; 
} 
$src_width = $arr[0]; 
$src_height = $arr[1]; 
$srcimg = null; 
$method = getcreatemethod( $srcimage ); 
if ( $method ) { 
eval( '$srcimg = ' . $method . ';' ); 
} 
$dst_x = 0; 
$dst_y = 0; 
$dst_w = $dst_width; 
$dst_h = $dst_height; 
if ( ($dst_width / $dst_height - $src_width / $src_height) > 0 ) { 
$dst_w = $src_width * ( $dst_height / $src_height ); 
$dst_x = ( $dst_width - $dst_w ) / 2; 
} elseif ( ($dst_width / $dst_height - $src_width / $src_height) < 0 ) { 
$dst_h = $src_height * ( $dst_width / $src_width ); 
$dst_y = ( $dst_height - $dst_h ) / 2; 
} 
imagecopyresampled($dstimg, $srcimg, $dst_x 
, $dst_y, 0, 0, $dst_w, $dst_h, $src_width, $src_height); 
// 保存格式 
$arr = array( 
'jpg' => 'imagejpeg' 
, 'jpeg' => 'imagejpeg' 
, 'png' => 'imagepng' 
, 'gif' => 'imagegif' 
, 'bmp' => 'imagebmp' 
); 
$suffix = strtolower( array_pop(explode('.', $dstimage ) ) ); 
if (!in_array($suffix, array_keys($arr)) ) { 
echo "保存的文件名错误"; 
exit; 
} else { 
eval( $arr[$suffix] . '($dstimg, "'.$dstimage.'");' ); 
} 
imagejpeg($dstimg, $dstimage); 
imagedestroy($dstimg); 
imagedestroy($srcimg); 
} 
function getcreatemethod( $file ) { 
$arr = array( 
'474946' => "imagecreatefromgif('$file')" 
, 'FFD8FF' => "imagecreatefromjpeg('$file')" 
, '424D' => "imagecreatefrombmp('$file')" 
, '89504E' => "imagecreatefrompng('$file')" 
); 
$fd = fopen( $file, "rb" ); 
$data = fread( $fd, 3 ); 
$data = str2hex( $data ); 
if ( array_key_exists( $data, $arr ) ) { 
return $arr[$data]; 
} elseif ( array_key_exists( substr($data, 0, 4), $arr ) ) { 
return $arr[substr($data, 0, 4)]; 
} else { 
return false; 
} 
} 
function str2hex( $str ) { 
$ret = ""; 
for( $i = 0; $i < strlen( $str ) ; $i++ ) { 
$ret .= ord($str[$i]) >= 16 ? strval( dechex( ord($str[$i]) ) ) 
: '0'. strval( dechex( ord($str[$i]) ) ); 
} 
return strtoupper( $ret ); 
} 
// BMP 创建函数 php本身无 
function imagecreatefrombmp($filename) 
{ 
if (! $f1 = fopen($filename,"rb")) return FALSE; 
$FILE = unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread($f1,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($f1,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($f1,$BMP['colors']*4)); 
} 
$IMG = fread($f1,$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($IMG,$P,3).$VIDE); 
elseif ($BMP['bits_per_pixel'] == 16) 
{ 
$COLOR = unpack("n",substr($IMG,$P,2)); 
$COLOR[1] = $PALETTE[$COLOR[1]+1]; 
} 
elseif ($BMP['bits_per_pixel'] == 8) 
{ 
$COLOR = unpack("n",$VIDE.substr($IMG,$P,1)); 
$COLOR[1] = $PALETTE[$COLOR[1]+1]; 
} 
elseif ($BMP['bits_per_pixel'] == 4) 
{ 
$COLOR = unpack("n",$VIDE.substr($IMG,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]; 
} 
elseif ($BMP['bits_per_pixel'] == 1) 
{ 
$COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1)); 
if (($P*8)%8 == 0) $COLOR[1] = $COLOR[1] >>7; 
elseif (($P*8)%8 == 1) $COLOR[1] = ($COLOR[1] & 0x40)>>6; 
elseif (($P*8)%8 == 2) $COLOR[1] = ($COLOR[1] & 0x20)>>5; 
elseif (($P*8)%8 == 3) $COLOR[1] = ($COLOR[1] & 0x10)>>4; 
elseif (($P*8)%8 == 4) $COLOR[1] = ($COLOR[1] & 0x8)>>3; 
elseif (($P*8)%8 == 5) $COLOR[1] = ($COLOR[1] & 0x4)>>2; 
elseif (($P*8)%8 == 6) $COLOR[1] = ($COLOR[1] & 0x2)>>1; 
elseif (($P*8)%8 == 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($f1); 
return $res; 
} 
// BMP 保存函数,php本身无 
function imagebmp ($im, $fn = false) 
{ 
if (!$im) return false; 
if ($fn === false) $fn = 'php://output'; 
$f = fopen ($fn, "w"); 
if (!$f) return false; 
$biWidth = imagesx ($im); 
$biHeight = imagesy ($im); 
$biBPLine = $biWidth * 3; 
$biStride = ($biBPLine + 3) & ~3; 
$biSizeImage = $biStride * $biHeight; 
$bfOffBits = 54; 
$bfSize = $bfOffBits + $biSizeImage; 
fwrite ($f, 'BM', 2); 
fwrite ($f, pack ('VvvV', $bfSize, 0, 0, $bfOffBits)); 
fwrite ($f, pack ('VVVvvVVVVVV', 40, $biWidth, $biHeight, 1, 24, 0, $biSizeImage, 0, 0, 0, 0)); 
$numpad = $biStride - $biBPLine; 
for ($y = $biHeight - 1; $y >= 0; --$y) 
{ 
for ($x = 0; $x < $biWidth; ++$x) 
{ 
$col = imagecolorat ($im, $x, $y); 
fwrite ($f, pack ('V', $col), 3); 
} 
for ($i = 0; $i < $numpad; ++$i) 
fwrite ($f, pack ('C', 0)); 
} 
fclose ($f); 
return true; 
} 
?>
PHP 相关文章推荐
PHP 面向对象 final类与final方法
May 05 PHP
PHP关联数组的10个操作技巧
Jan 21 PHP
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
Jul 15 PHP
PHP zip扩展Linux下安装过程分享
May 05 PHP
PHP获取一个字符串中间一部分字符的方法
Aug 19 PHP
php实现图片局部打马赛克的方法
Feb 11 PHP
php中有关合并某一字段键值相同的数组合并的改进
Mar 10 PHP
总结PHP中数值计算的注意事项
Aug 14 PHP
Fleaphp常见函数功能与用法示例
Nov 15 PHP
curl 出现错误的调试方法(必看)
Feb 13 PHP
PHP获取文件扩展名的方法实例总结
Jun 10 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
Oct 15 PHP
PHP网站备份程序代码分享
Jun 10 #PHP
php在页面中调用fckeditor编辑器的方法
Jun 10 #PHP
PHP中遍历stdclass object的实现代码
Jun 09 #PHP
IIS7.X配置PHP运行环境小结
Jun 09 #PHP
php基础学习之变量的使用
Jun 09 #PHP
php学习之数据类型之间的转换介绍
Jun 09 #PHP
php学习之运算符相关概念
Jun 09 #PHP
You might like
php FLEA中二叉树数组的遍历输出
2012/09/26 PHP
简单的php新闻发布系统教程
2014/05/09 PHP
ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法
2014/11/04 PHP
Yii核心组件AssetManager原理分析
2014/12/02 PHP
Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
2016/11/10 PHP
JavaScript和JQuery实用代码片段(一)
2010/04/07 Javascript
电子商务网站上的常用的js放大镜效果
2011/12/08 Javascript
js获取元素到文档区域document的(横向、纵向)坐标的两种方法
2013/05/17 Javascript
JS中eval函数的使用示例
2013/07/21 Javascript
js使用for循环查询数组中是否存在某个值
2014/08/12 Javascript
jQuery中next()方法用法实例
2015/01/07 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
2015/04/17 Javascript
JavaScript实现添加、查找、删除元素
2015/07/02 Javascript
AngularJS 工作原理详解
2016/08/18 Javascript
购物车前端开发(jQuery和bootstrap3)
2016/08/27 Javascript
Avalonjs 实现简单购物车功能(实例代码)
2017/02/07 Javascript
vue之nextTick全面解析
2017/05/17 Javascript
微信页面弹出键盘后iframe内容变空白的解决方案
2017/09/20 Javascript
js实时监控文本框输入字数的实例代码
2018/01/18 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
Vue3.0结合bootstrap创建多页面应用
2019/05/28 Javascript
vue遍历生成的输入框 绑定及修改值示例
2019/10/30 Javascript
webpack DllPlugin xxx is not defined解决办法
2019/12/13 Javascript
[03:12]完美世界DOTA2联赛PWL DAY7集锦
2020/11/06 DOTA
Python排序搜索基本算法之希尔排序实例分析
2017/12/09 Python
python3反转字符串的3种方法(小结)
2019/11/07 Python
numpy库reshape用法详解
2020/04/19 Python
CSS3圆角边框和边界图片效果实例
2016/07/01 HTML / CSS
国际礼品店:GiftsnIdeas
2018/05/03 全球购物
C和C++经典笔试题附答案解析
2014/08/18 面试题
自荐信怎么写好
2013/11/11 职场文书
毕业证丢失证明范本
2014/09/20 职场文书
组织生活会表态发言材料
2014/10/17 职场文书
2015年宣传部工作总结范文
2015/03/31 职场文书
python基础之模块的导入
2021/10/24 Python
Apache Pulsar集群搭建部署详细过程
2022/02/12 Servers