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下MAIL的另一解决方案
Oct 09 PHP
用ODBC的分页显示
Oct 09 PHP
php MsSql server时遇到的中文编码问题
Jun 11 PHP
php 判断访客是否为搜索引擎蜘蛛的函数代码
Jul 29 PHP
PHP基础教程(php入门基础教程)一些code代码
Jan 06 PHP
php获取目标函数执行时间示例
Mar 04 PHP
神盾加密解密教程(一)PHP变量可用字符
May 28 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
Jun 23 PHP
php脚本运行时的超时机制详解
Feb 17 PHP
PHP查看SSL证书信息的方法
Sep 22 PHP
PHP count()函数讲解
Feb 03 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
May 29 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
通过文字传递创建的图形按钮
2006/10/09 PHP
PHP判断数据库中的记录是否存在的方法
2014/11/14 PHP
php集成套件服务器xampp安装使用教程(适合第一次玩PHP的新手)
2015/06/03 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
2019/10/15 PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
2020/02/10 PHP
设置下载不需要倒计时cookie(倒计时代码)
2008/11/19 Javascript
javascript jscroll模拟html元素滚动条
2012/12/18 Javascript
jquery获取tr并更改tr内容示例代码
2014/02/13 Javascript
ajaxFileUpload.js插件支持多文件上传的方法
2014/09/02 Javascript
ECMAScript6块级作用域及新变量声明(let)
2015/06/12 Javascript
layer实现弹窗提交信息
2016/12/12 Javascript
Bootstrap实现圆角、圆形头像和响应式图片
2016/12/14 Javascript
js自定义QQ菜单效果
2017/01/10 Javascript
jquery使用FormData实现异步上传文件
2018/10/25 jQuery
Vue 处理表单input单行文本框的实例代码
2019/05/09 Javascript
JS开发常用工具函数(小结)
2019/07/04 Javascript
小程序实现图片预览裁剪插件
2019/11/22 Javascript
js实现上下左右键盘控制div移动
2020/01/16 Javascript
js实现验证码功能
2020/07/24 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
[20:57]Ti4主赛事第三天开幕式
2014/07/21 DOTA
Python解析网页源代码中的115网盘链接实例
2014/09/30 Python
Python 实现王者荣耀中的敏感词过滤示例
2019/01/21 Python
python 函数中的内置函数及用法详解
2019/07/02 Python
Django框架model模型对象验证实现方法分析
2019/10/02 Python
Python中无限循环需要什么条件
2020/05/27 Python
html5+css3实现一款注册表单实例
2013/04/17 HTML / CSS
英国女性化妆品收纳和家具网站:Beautify
2019/12/07 全球购物
三年级科学教学反思
2014/01/29 职场文书
机电一体化求职信
2014/03/10 职场文书
霸气押韵的班级口号
2014/06/09 职场文书
国贸专业求职信
2014/06/28 职场文书
机电专业毕业生自我鉴定2014
2014/10/04 职场文书
留学推荐信英文范文
2015/03/26 职场文书
劳动者解除劳动合同通知书
2015/04/16 职场文书
Zabbix对Kafka topic积压数据监控的解决方案
2022/07/07 Servers