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 相关文章推荐
BBS(php &amp; mysql)完整版(五)
Oct 09 PHP
福利彩票幸运号码自动生成器
Oct 09 PHP
ThinkPHP php 框架学习笔记
Oct 30 PHP
php实现的遍历文件夹下所有文件,编辑删除
Jan 05 PHP
PHP的加密方式及原理
Jun 14 PHP
thinkphp浏览历史功能实现方法
Oct 29 PHP
php实现使用正则将文本中的网址转换成链接标签
Dec 03 PHP
PHP获取数组最大值下标的方法
May 12 PHP
PHP代码维护,重构变困难的4种原因分析
Jan 25 PHP
如何使用php等比例缩放图片
Oct 12 PHP
PHP 计算两个特别大的整数实例代码
May 07 PHP
Laravel 实现添加多语言提示信息
Oct 25 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面向对象——访问修饰符介绍
2012/11/08 PHP
PHP获取网页所有连接的方法(附demo源码下载)
2016/03/30 PHP
PHP实现的获取文件mimes类型工具类示例
2018/04/08 PHP
php使用socket调用http和smtp协议实例小结
2019/07/26 PHP
css动画效果之animation的常用样式
2021/03/09 HTML / CSS
用JavaScript脚本实现Web页面信息交互
2006/10/11 Javascript
基于jquery DOM写的类似微博发布的效果
2012/10/20 Javascript
JS简单的轮播的图片滚动实例
2013/06/17 Javascript
javascript ajax的5种状态介绍
2014/08/18 Javascript
JavaScript实现弹出子窗口并传值给父窗口
2014/12/18 Javascript
javascript实现继承的简单实例
2015/07/26 Javascript
通过设置CSS中的position属性来固定层的位置
2015/12/14 Javascript
完美JQuery图片切换效果的简单实现
2016/07/21 Javascript
微信小程序 MINA文件结构
2016/10/17 Javascript
web前端开发upload上传头像js示例代码
2016/10/22 Javascript
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
老生常谈js中0到底是 true 还是 false
2017/03/08 Javascript
JS处理一些简单计算题
2018/02/24 Javascript
vue中的$emit 与$on父子组件与兄弟组件的之间通信方式
2018/05/13 Javascript
详解vue-router 命名路由和命名视图
2018/06/01 Javascript
解决vue使用vant轮播组件swipe + flex时文字抖动问题
2021/01/07 Vue.js
[02:44]DOTA2英雄基础教程 钢背兽
2013/12/19 DOTA
[00:32]2018DOTA2亚洲邀请赛Mineski出场
2018/04/04 DOTA
Python 文本文件内容批量抽取实例
2018/12/10 Python
python实现同一局域网下传输图片
2020/03/20 Python
SkinCeuticals官网:美国药妆品牌
2018/04/19 全球购物
TripAdvisor斯洛伐克:阅读评论、比较价格和酒店预订
2018/04/25 全球购物
运动会入场解说词300字
2014/01/25 职场文书
初中学生期末评语
2014/04/24 职场文书
学雷锋标语
2014/06/25 职场文书
服务标语口号
2014/07/01 职场文书
食品安全汇报材料
2014/08/18 职场文书
公司授权委托书范本
2014/09/18 职场文书
婚庆答谢词
2015/01/04 职场文书
高三语文复习计划
2015/01/19 职场文书
在CSS中映射鼠标位置并实现通过鼠标移动控制页面元素效果(实例代码)
2021/04/22 HTML / CSS