torlee 发表于 2017-4-14 08:53:58

php学习笔记(十六)图片的处理缩放、旋转、透明、锐化、翻转、裁剪

<?php
/**
* 图片处理
* 缩放、旋转、透明、锐化、翻转、裁剪
*
* 一、创建资源
$imagejpg = imagecreatefromjpeg($jpg);
$imagepng = imagecreatefrompng($png);
$imagegif = imagecreatefromgif($gif);
* 二、获取图片的属性
*         imagesx(resource)
*         imagesy(resource)
*         
*         getimagesize(filename)
*         
* 三、缩放thum()
*         自己实现的imagecopyresampled方法
*         可以加入判断图片格式,然后做不同的缩放,一万年设计了图名处理
*
* 四、透明处理thum()
*         png、jpeg透明色都是正常的,只有gif的处理之后透明色不正常
*         imagecolortransparent()将某个颜色指定为透明色
*         imagecolorstotal()判断颜色是否在调色板的颜色上
*         imagecolorsforindex()
*
* 五、图片的裁剪
*         imagecopyresampled
*         imagecopyresized
*
* 六、加水印(文字水印、图片水印)
*         imagettftext
*         imagecopy
*
* 七、图片的旋转
*         imagerotate
*
* 八、图片的翻转(水平、垂直)
*         imagecopy
*
* 九、锐化
*         //获取某个像素的颜色索引值
*         imagecolorat($image, $x, $y);
*         //根据索引值取出数组
*         imagecolorsforindex($image, $index);
*/

//图片的基本修改
$jpg = "image/b.jpg";
$png = "image/c.png";
$gif = "image/a.gif";
$imagejpg = imagecreatefromjpeg($jpg);
$imagepng = imagecreatefrompng($png);
$imagegif = imagecreatefromgif($gif);
$green = imagecolorallocate($imagejpg, 0, 255, 0);
imageline($imagejpg, 0, 0, 111, 111, $green);
//输出宽度和高度
echo "imagejpg width:".imagesx($imagejpg)."height:".imagesy($imagejpg)."<br>";
echo "imagepng width:".imagesx($imagepng)."height:".imagesy($imagepng)."<br>";
echo "imagegif width:".imagesx($imagegif)."height:".imagesy($imagegif)."<br>";
//返回图片信息(宽、高、类型等)
$arr = getimagesize($jpg);
var_dump($arr);
//保存更改后的图片
imagejpeg($imagejpg,"image/jpg.jpg");
imagepng($imagepng,"image/png.jpg");
imagegif($imagegif,"image/gif.gif");
//释放资源
imagedestroy($imagejpg);
imagedestroy($imagepng);
imagedestroy($imagegif);
//缩放图片50%
$filename ="image/b.jpg";
$per = 0.5;
list($width,$height) = getimagesize($filename);
$n_w = $width*$per;
$n_h = $height*$per;
$new = imagecreatetruecolor($n_w, $n_h);
$img = imagecreatefromjpeg($filename);
//拷贝原图片到新图片,并设置宽高
imagecopyresized($new, $img, 0, 0, 0, 0, $n_w, $n_h, $width, $height);
//等比例缩放
imagejpeg($new,"image/new.jpg");
//资源释放
imagedestroy($new);
imagedestroy($img);

$filename ="image/a.gif";
/**
* 等比例缩放
* @param 源 $res
* @param 缩放后的最大宽 $width
* @param 缩放后的最大高 $height
* @param 目标 $new
*/
function thum($res,$width,$height,$newname){
list($s_w,$s_h) = getimagesize($res);
if ($width && ($s_w < $s_h)) {
$width = ($height / $s_h) * $s_w;
} else {
$height = ($width / $s_w) * $s_h;
}
$newfile = imagecreatetruecolor($width, $height);
$img = imagecreatefromgif($res);
$otsc = imagecolortransparent($img);
//如果存在透明色
if ($otsc>=0 && $otsc < imagecolorstotal($img)){
//查找索引颜色的值
$tran = imagecolorsforindex($img, $otsc);
//去除透明色的背景颜色
$newcolor = imagecolorallocate($newfile, $tran["red"], $tran["green"], $tran["blue"]);
imagefill($newfile, 0, 0, $newcolor);
//将新图片的地方指定透明色
imagecolortransparent($newfile,$newcolor);
}
//开始拷贝,透明色的时候用imagecopyresized才没有雪花
imagecopyresized($newfile, $img, 0, 0, 0, 0, $width, $height, $s_w, $s_h);
imagegif($newfile,$newname);
imagedestroy($img);
imagedestroy($newfile);
}
thum($filename, 100, 200, "image/thum.gif");
/**
* 裁剪图片
* @param 源 $res
* @param 从源的x哪里开始裁剪 $c_x
* @param 从源的y哪里开始裁剪 $c_y
* @param 裁剪的宽度 $c_w
* @param 裁剪的高度 $c_h
* @param 目标 $newname
*/
$filename ="image/b.jpg";
function cut($res,$c_x,$c_y,$c_w,$c_h,$newname){
$img = imagecreatefromjpeg($res);
$new = imagecreatetruecolor($c_w, $c_h);
imagecopyresized($new, $img, 0, 0, $c_x, $c_y, $c_w, $c_h, $c_w, $c_h);
imagejpeg($new,$newname);
imagedestroy($img);
imagedestroy($new);
}
cut($filename, 12, 12, 50, 50, "image/cut.jpg");
/**
* 设置文字水印
* @param 源 $res
* @param 文字 $text
* @param 设置文字位置x $x
* @param 设置文字位置y $y
* @param 设置新图片的名字 $newname
*/
function mark_text($res,$text,$x,$y,$newname){
$img = imagecreatefromjpeg($res);
$color = imagecolorallocate($img, 0, 255, 0);
$text = iconv("GB2312","UTF-8", $text);
imagettftext($img, 20, 0, $x, $y, $color, "../ADOBESONGSTD-LIGHT.OTF", $text);
imagejpeg($img,$newname);
imagedestroy($img);
}
mark_text($filename, "我操", 51, 53,"image/mark_text.jpg");
/**
* 设置图片水印
* @param 源 $res
* @param 图片水印 $text
* @param 设置文字位置x $x
* @param 设置文字位置y $y
* @param 设置新图片的名字 $newname
*/
function mark_pic($res,$pic,$x,$y,$newname){
$img = imagecreatefromjpeg($res);
$water = imagecreatefromjpeg($pic);
$w_w = imagesx($water);
$w_h = imagesy($water);
//将图片拷贝到另一个图片之上
imagecopy($img, $water, $x, $y, 0, 0, $w_w, $w_h);
imagejpeg($img,$newname);
imagedestroy($water);
imagedestroy($img);
}
mark_pic($filename, "image/new.jpg", 51, 53,"image/mark_pic.jpg");
/**
* 旋转角度
* @param 文件源 $res
* @param 旋转角度 $angle
* @param 新颜色的背景颜色 $bgd_color
* @param 生成新图片的名字 $newname
*/
function rotate($res,$angle,$bgd_color,$newname){
$img = imagecreatefromjpeg($res);
$new = imagerotate($img, $angle, $bgd_color);
imagejpeg($new,$newname);
imagedestroy($img);
}
rotate($filename, 45, 0, "image/rotate.jpg");
$filename ="image/b.jpg";
/**
* 图片的翻转
* @param 源 $res
* @param 新文件名字 $newname
* @param 翻转的中心轴 $axle
*/
function turn($res,$newname,$axle="x"){
$img = imagecreatefromjpeg($res);
$i_w = imagesx($img);
$i_h = imagesy($img);
$newfile = imagecreatetruecolor($i_w, $i_h);
if ($axle=="y"){
for ($i = 0; $i < $i_w; $i++) {
imagecopy($newfile, $img, $i_w-$i-1, 0, $i, 0, 1, $i_h);
}
}else{
for ($i = 0; $i < $i_h; $i++) {
imagecopy($newfile, $img, 0, $i_h-$i-1, 0, $i, $i_w, 1);
}
}
imagejpeg($newfile,$newname);
imagedestroy($img);
imagedestroy($newfile);
}
turn($filename,"image/turn_y.jpg","y");
turn($filename,"image/turn_x.jpg");
/**
* 锐化操作
* @param 源 $res
* @param 新文件名字 $newname
* @param 锐化程度 $degree
*/
function sharp($res,$newname,$degree){
$img = imagecreatefromjpeg($res);
$newfile = imagecreatefromjpeg($res);
$i_w = imagesx($img);
$i_h = imagesy($img);
for ($i = 1; $i < $i_w; $i++) {
for ($j = 1; $j < $i_h; $j++) {
$b_c1 = imagecolorsforindex($img, imagecolorat($img, $i-1, $j-1));
$b_c2 = imagecolorsforindex($img, imagecolorat($img, $i, $j));
$r = intval($b_c2["red"]+$degree*($b_c2["red"]-$b_c1["red"]));
$g = intval($b_c2["green"]+$degree*($b_c2["green"]-$b_c1["green"]));
$b = intval($b_c2["blue"]+$degree*($b_c2["blue"]-$b_c1["blue"]));
//限制在0到255之间
$r = min(255,max($r,0));
$g = min(255,max($g,0));
$b = min(255,max($b,0));
if (($d_clr = imagecolorexact($newfile, $r, $g, $b))==-1){
$d_clr = imagecolorexact($newfile, $r, $g, $b);
}
imagesetpixel($newfile, $i, $j, $d_clr);
}
}
imagejpeg($newfile,$newname);
imagedestroy($img);
imagedestroy($newfile);
}
sharp($filename, "image/sharp.jpg", 2);
?>
页: [1]
查看完整版本: php学习笔记(十六)图片的处理缩放、旋转、透明、锐化、翻转、裁剪