其实是因为一些业务上的需求,所以需要对用户上传后的图片进行压缩,因为上传的图片比较大,显示的时候加载起来如果网速不给力的话就很吃力了,而且大图片也浪费空间,于是找了一下相关的资源,主要方法在开源中国上找到了:
http://www.oschina.net/question/814955_115750
然后,图片压缩后显示出来了,但是要保存,所以还需要进行处理,然后看到了另外一篇文章:
http://www.nowamagic.net/php/php_CreateJpg.php
这里就将这篇文章转载回来了,具体原文如下:
imagejpeg() 从 image 图像以 filename 为文件名创建一个 JPEG 图像。image 参数是 imagecreatetruecolor() 函数的返回值。
1 |
bool imagejpeg ( resource image [, string filename [, int quality]] ) |
filename 参数为可选,如果省略,则原始图像流将被直接输出。要省略 filename 参数而提供 quality 参数,使用空字符串('')。通过 header() 发送 Content-type: image/jpeg 可以使 PHP 脚本直接输出 JPEG 图像。JPEG 支持仅在 PHP 与 GD-1.8 或更高版本一起编译时可用。
quality 为可选项,范围从 0(最差质量,文件更小)到 100(最佳质量,文件最大)。默认为 IJG 默认的质量值(大约 75)。
1 |
<? |
2 |
Header( "Content-type: image/jpeg" ); |
3 |
$im = imagecreatefromjpeg( "./test.jpg" ); |
4 |
Imagejpeg( $im , '' ,20); |
5 |
ImageDestroy( $im ); |
6 |
?> |
假如有如下需求,用户上传的图片,我需要将它的图片质量降低到70%左右,可以缺省 filename 参数,然后指定原始图片与quality的值即可。当然你可以指定第二个参数作为新生成图片的文件名。
01 |
<?php |
02 |
// 图片的质量参数 |
03 |
$quality = 70; |
04 |
05 |
if (isset( $_FILES [ 'watermarkee' ]) && $_FILES [ 'watermarkee' ][ 'error' ]==0)\ |
06 |
{ |
07 |
$original = $_FILES [ 'watermarkee' ][ 'tmp_name' ]; |
08 |
// 创建原始图片 |
09 |
$resultImage = imagecreatefromjpeg( $original ); |
10 |
11 |
// 定义生成的图片的名字 |
12 |
$target_name = date ( 'YmdHis' ). '_' .preg_replace( '`[^a-z0-9-_.]`i' , '' , $_FILES [ 'watermarkee' ][ 'name' ]); |
13 |
$target = dirname( __FILE__ ). '/results/' . $target_name ; |
14 |
15 |
// 生成新图片 |
16 |
imagejpeg( $resultImage , $target , $quality ); |
17 |
} |
18 |
?> |
这里谈一下 imagecreatefromjpeg() 函数。
表单上传至服务器后,会产生$_FILES数组。如果数据有效。
01 |
$_FILES [ 'userfile' ][ 'name' ] |
02 |
// 客户端机器文件的原名称 |
03 |
04 |
$_FILES [ 'userfile' ][ 'type' ] |
05 |
// 文件的 MIME 类型,如果浏览器提供此信息的话。一个例子是“image/gif”。不过此 MIME 类型在 PHP 端并不检查,因此不要想当然认为有这个值 |
06 |
07 |
$_FILES [ 'userfile' ][ 'size' ] |
08 |
// 已上传文件的大小,单位为字节 |
09 |
10 |
$_FILES [ 'userfile' ][ 'tmp_name' ] |
11 |
// 文件被上传后在服务端储存的临时文件名 |
12 |
13 |
$_FILES [ 'userfile' ][ 'error' ] |
14 |
15 |
$_FILES [ 'userfile' ][ 'tmp_name' ] |
16 |
// 临时文件已经可以作为有效的jpeg文件进行处理了。但最终通过image一系列函数处理的图像,最终的存储是要移动至目标目录的 |
17 |
18 |
imagecreatefromjpeg( $_FILES [ 'userfile' ][ 'tmp_name' ]) // 即可生成有效的image资源 |
一段上传jpg图片,服务器端保存原图片和缩略图,并显示缩略图的方法。
01 |
<?php |
02 |
// 保存文件缩略图 |
03 |
function thumbnail( $filename , $newWidth , $imgName ) |
04 |
{ |
05 |
list ( $width , $height ) = getimagesize ( $filename ); |
06 |
$newHeight = $height / ( $width / $newWidth ); |
07 |
$newImage = imagecreatetruecolor ( $newWidth , $newHeight ); |
08 |
$oldImage = imagecreatefromjpeg ( $filename ); |
09 |
imagecopyresampled ( $newImage , $oldImage , 0, 0, 0, 0, $newWidth , $newHeight , $width , $height ); |
10 |
|
11 |
//输出jpeg图像 |
12 |
header ( 'Content-type: image/jpeg' ); |
13 |
imagejpeg ( $newImage , $imgName , 99 ); |
14 |
//imagedestroy ( $filename ); //若不用于显示则不用该方法。 |
15 |
} |
16 |
|
17 |
//jpg文件上传并显示缩略图 |
18 |
function uploadImageFiles() |
19 |
{ |
20 |
$uploaddir = getcwd () . "/uploads/" ; |
21 |
$uploadfile = $uploaddir . $_FILES [ "upfile" ] [ "name" ]; |
22 |
//global $uploadfile; |
23 |
if ( $_FILES [ "upfile" ] [ "size" ] > 5000000) |
24 |
{ |
25 |
echo "<script language='javascript'>alert('上传文件不得大于5M!');history.go(-1)</script>" ; |
26 |
} |
27 |
else |
28 |
{ |
29 |
if ( $_FILES [ "upfile" ] [ "type" ] != "image/gif" and $_FILES [ "upfile" ] [ "type" ] != "image/pjpeg" ) |
30 |
{ |
31 |
echo "<script language='javascript'>alert('上传文件类型必须是gif/jpeg/jpg格式!');history.go(-1)</script>" ; |
32 |
} |
33 |
else |
34 |
{ |
35 |
$this ->thumbnail ( $_FILES [ "upfile" ][ "tmp_name" ], 100, $uploaddir . "miniImg/" . $_FILES [ "upfile" ][ "name" ] ); |
36 |
if (move_uploaded_file ( $_FILES [ "upfile" ] [ "tmp_name" ], $uploadfile )) |
37 |
{ |
38 |
echo "文件上传成功。" ; |
39 |
echo "<img src=\"uploads/miniImg/" . $_FILES [ "upfile" ] [ "name" ] . "\"/>" ; |
40 |
} |
41 |
} |
42 |
} |
43 |
} |
44 |
?> |
其实经过以上的学习后,我单独做了一个图片压缩的没什么问题,但是整合到我用的系统中时始终不行,为此还特地在OSC上发了帖子(依然是关于“PHP图片压缩的返回地址”问题):
http://www.oschina.net/question/59519_142458
最后也解决了,实际上很简单,还是没有好好读PHP的关于这个图片处理的手册,最后掉了一个imagedestory函数。
p.s. csdn这个功能不错,我直接覆盖上面的这篇文章,代码的格式什么的都一起过来了,很爽有木有