极品分享

PHP图片处理:转换格式JPG、等比缩放、图片压缩!

imagejpeg() 从 image 图像以 filename 为文件名创建一个 JPEG 图像。image 参数是 imagecreatetruecolor() 函数的返回值。


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)。


程序示例:

<? 
Header("Content-type: image/jpeg"); 
$im = imagecreatefromjpeg("./test.jpg"); 
Imagejpeg($im,'',20); 
ImageDestroy($im); 
?>

假如有如下需求,用户上传的图片,我需要将它的图片质量降低到70%左右,可以缺省 filename 参数,然后指定原始图片与quality的值即可。当然你可以指定第二个参数作为新生成图片的文件名。

<?php
// 图片的质量参数
$quality = 70;	

if(isset($_FILES['watermarkee']) && $_FILES['watermarkee']['error']==0)\
{
	$original = $_FILES['watermarkee']['tmp_name'];
	// 创建原始图片
	$resultImage = imagecreatefromjpeg($original);

	// 定义生成的图片的名字
	$target_name = date('YmdHis').'_'.preg_replace('`[^a-z0-9-_.]`i','',$_FILES['watermarkee']['name']);
	$target = dirname(__FILE__).'/results/'.$target_name;

	// 生成新图片
	imagejpeg($resultImage, $target, $quality); 
}
?>


这里谈一下 imagecreatefromjpeg() 函数。

表单上传至服务器后,会产生$_FILES数组。如果数据有效。

$_FILES['userfile']['name']
// 客户端机器文件的原名称

$_FILES['userfile']['type']
// 文件的 MIME 类型,如果浏览器提供此信息的话。一个例子是“image/gif”。不过此 MIME 类型在 PHP 端并不检查,因此不要想当然认为有这个值

$_FILES['userfile']['size']
// 已上传文件的大小,单位为字节

$_FILES['userfile']['tmp_name']
// 文件被上传后在服务端储存的临时文件名

$_FILES['userfile']['error']

$_FILES['userfile']['tmp_name']
// 临时文件已经可以作为有效的jpeg文件进行处理了。但最终通过image一系列函数处理的图像,最终的存储是要移动至目标目录的

imagecreatefromjpeg($_FILES['userfile']['tmp_name'])	// 即可生成有效的image资源


一段上传jpg图片,服务器端保存原图片和缩略图,并显示缩略图的方法。

处理类:

<?php
// 保存文件缩略图
function thumbnail($filename, $newWidth, $imgName) 
{
	list ( $width, $height ) = getimagesize ( $filename );
	$newHeight = $height / ($width / $newWidth);
	$newImage = imagecreatetruecolor ( $newWidth, $newHeight );
	$oldImage = imagecreatefromjpeg ( $filename );
	imagecopyresampled ( $newImage, $oldImage, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height );
        
	//输出jpeg图像
	header ( 'Content-type: image/jpeg' );
	imagejpeg ( $newImage, $imgName, 99 );
	//imagedestroy ( $filename );  //若不用于显示则不用该方法。
}
    
//jpg文件上传并显示缩略图
function uploadImageFiles() 
{
	$uploaddir = getcwd () . "/uploads/";
	$uploadfile = $uploaddir . $_FILES ["upfile"] ["name"];
	//global $uploadfile;
	if ($_FILES ["upfile"] ["size"] > 5000000) 
	{
		echo "<script language='javascript'>alert('上传文件不得大于5M!');history.go(-1)</script>";
	} 
	else 
	{
		if ($_FILES ["upfile"] ["type"] != "image/gif" and $_FILES ["upfile"] ["type"] != "image/pjpeg") 
		{
			echo "<script language='javascript'>alert('上传文件类型必须是gif/jpeg/jpg格式!');history.go(-1)</script>";
		} 
		else 
		{
   			$this->thumbnail ( $_FILES["upfile"]["tmp_name"], 100, $uploaddir . "miniImg/" . $_FILES ["upfile"]["name"] );
          	if (move_uploaded_file ( $_FILES ["upfile"] ["tmp_name"], $uploadfile )) 
			{
            	echo "文件上传成功。";
            	echo "<img src=\"uploads/miniImg/" . $_FILES ["upfile"] ["name"] . "\"/>";
       		}
     	}
	}
}
?>


附1、另一个可分别处理不同图片格式的图片压缩类(无等比缩放功能)

<?php
/**
 * 将图片以自定义品质,另存为JPG格式,将会删除源图片
 *
 * @param string $filename 图片名称,包含路径
 * @param int    $quality  图片品质,0到100,默认90,100为最高品质
 */
public function resaveToJpeg($filename, $quality = 90) {
    $path       = dirname($filename);
    $path       = rtrim($path, '/').'/';
    $basename   = pathinfo($filename, PATHINFO_FILENAME);
    $extName    = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
    switch($extName) {
        case 'jpg':
            $im = imagecreatefromjpeg($filename);
            break;
        case 'png':
            $im = imagecreatefrompng($filename);
            break;
        case 'gif':
            $im = imagecreatefromgif($filename);
            break;
    }
    imagejpeg($im, $path.$basename.'.jpg', $quality);
     
    if(in_array($extName, array('png','gif'))) {
        @unlink($filename);
    }
    imagedestroy($im);
}
?>

附2、图片等比缩放不失真的php处理类(无压缩功能)

<?php
function resizeImage($im,$maxwidth,$maxheight,$name,$filetype)
{
    $pic_width = imagesx($im);
    $pic_height = imagesy($im);

    if(($maxwidth && $pic_width > $maxwidth) || ($maxheight && $pic_height > $maxheight))
    {
        if($maxwidth && $pic_width>$maxwidth)
        {
            $widthratio = $maxwidth/$pic_width;
            $resizewidth_tag = true;
        }

        if($maxheight && $pic_height>$maxheight)
        {
            $heightratio = $maxheight/$pic_height;
            $resizeheight_tag = true;
        }

        if($resizewidth_tag && $resizeheight_tag)
        {
            if($widthratio<$heightratio)
                $ratio = $widthratio;
            else
                $ratio = $heightratio;
        }

        if($resizewidth_tag && !$resizeheight_tag)
            $ratio = $widthratio;
        if($resizeheight_tag && !$resizewidth_tag)
            $ratio = $heightratio;

        $newwidth = $pic_width * $ratio;
        $newheight = $pic_height * $ratio;

        if(function_exists("imagecopyresampled"))
        {
            $newim = imagecreatetruecolor($newwidth,$newheight);
           imagecopyresampled($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height);
        }
        else
        {
            $newim = imagecreate($newwidth,$newheight);
           imagecopyresized($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height);
        }

        $name = $name.$filetype;
        imagejpeg($newim,$name);
        imagedestroy($newim);
    }
    else
    {
        $name = $name.$filetype;
        imagejpeg($im,$name);
    }           
}
?>

参数说明:

$im 图片对象,应用函数之前,你需要用imagecreatefromjpeg()读取图片对象,如果PHP环境支持PNG,GIF,也可使用imagecreatefromgif(),imagecreatefrompng();

$maxwidth 定义生成图片的最大宽度(单位:像素)

$maxheight 生成图片的最大高度(单位:像素)

$name 生成的图片名

$filetype 最终生成的图片类型(.jpg/.png/.gif)

代码注释:

第3~4行:读取需要缩放的图片实际宽高

第8~26行:通过计算实际图片宽高与需要生成图片的宽高的压缩比例最终得出进行图片缩放是根据宽度还是高度进行缩放,当前程序是根据宽度进行图片缩放。如果你想根据高度进行图片缩放,你可以将第22行的语句改成$widthratio>$heightratio

第28~31行:如果实际图片的长度或者宽度小于规定生成图片的长度或者宽度,则要么根据长度进行图片缩放,要么根据宽度进行图片缩放。

第33~34行:计算最终缩放生成的图片长宽。

第36~45行:根据计算出的最终生成图片的长宽改变图片大小,有两种改变图片大小的方法:ImageCopyResized()函数在所有GD版本中有效,但其缩放图像的算法比较粗糙。ImageCopyResamples(),其像素插值算法得到的图像边缘比较平滑,但该函数的速度比ImageCopyResized()慢。

第47~49行:最终生成经过处理后的图片,如果你需要生成GIF或PNG,你需要将imagejpeg()函数改成imagegif()或imagepng()

第51~56行:如果实际图片的长宽小于规定生成的图片长宽,则保持图片原样,同理,如果你需要生成GIF或PNG,你需要将imagejpeg()函数改成imagegif()或imagepng()。

特别说明:

  GD库1.6.2版以前支持GIF格式,但因GIF格式使用LZW演算法牵涉专利权,因此在GD1.6.2版之后不支持GIF的格式。如果你是WINDOWS的环境,你只要进入PHP.INI文件找到extension=php_gd2.dll,将#去除,重启APACHE即可,如果你是Linux环境,又想支持GIF,PNG,JPEG,你需要去下载libpng,zlib,以及freetype字体并安装。


附3、将图片格式文件不失真转换成jpg图片,并实现等比缩放(无压缩功能)

<?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 ; 
} 

// 烈火網 veryhuo.COM 欢迎复制,拒绝恶意采集 liehuo.net 

function ImageToJPG($srcFile,$dstFile,$towidth,$toheight) 
{ 
$quality=80; 
$data = @GetImageSize($srcFile); 
switch ($data['2']) 
{ 

case 1: 

$im = imagecreatefromgif($srcFile); 
break; 
case 2: 

$im = imagecreatefromjpeg($srcFile); 
break; 
case 3: 
$im = imagecreatefrompng($srcFile); 

break; 

case 6: 

$im = ImageCreateFromBMP( $srcFile ); 

break; 
} 

// $dstX=$srcW=@ImageSX($im); 

// $dstY=$srcH=@ImageSY($im); 

$srcW=@ImageSX($im); 
$srcH=@ImageSY($im); 
$dstX=$towidth; 
$dstY=$toheight; 

$ni=@imageCreateTrueColor($dstX,$dstY); 

@ImageCopyResampled($ni,$im,0,0,0,0,$dstX,$dstY,$srcW,$srcH); 
@ImageJpeg($ni,$dstFile,$quality); 
@imagedestroy($im); 
@imagedestroy($ni); 

} 

//用法: 

//ImageToJPG('源文件名','目标文件名',目标宽,目标高); 

?>


2014-12-11 0 /
PHP学习
/
标签: 

评论回复

回到顶部