PHP从零单排(十八)图像处理
1.打开现有的图像
<?php
header("Content-type:image/jpeg");
$img=imagecreatefromjpeg("cc.jpg");
imagejpeg($img);
imagedestroy($img);
? >
函数imagecreatefromjpeg()的參数即文件所在路径。返回值是參数所指图片的资源标识符。
该函数时通过已有图像新建一个图像,并非单纯打开原图像本身。假设将图片的后缀名.jpg强制改为.png,即便是使用函数imagecreatefrompng()。也无法打开文件。由于图片本质还是jpg格式的图片。
2.获取图片的相关属性
<?php
$img=imagecreatefromjpeg("cc.jpg");
$x=imagesx($img);
$y=imagesy($img);
echo "图片cc.jpg的宽为:<b>$x</b> pixels";
echo "<br/>";
echo "<br/>";
echo "图片cc.jpg的高为:<b>$y</b> pixels";
? >
另外,通过一个不属于GD库的函数getimagesize(),能够取得图片的大小等相关属性,该函数的语法例如以下:
array getimagesize(string $filename [, array &imageinfo])
<?php
$img_info=getimagesize("cc.jpg");
for($i=0;$i<4;++$i)
{
echo $img_info[$i];
echo "<br/>";
}
?>
第三个元素是图片的格式,它的取值含义例如以下所看到的:
1:表示该图片是GIF格式
2:表示该图片是JPG格式
3:表示该图片是PNG格式
4:表示该图片是SWF格式
5:表示该图片是PSD格式
6:表示该图片是BMP格式
<?php
$pic_name="ee.png";
$pic_size=getimagesize($pic_name);
? >
<img src="<?php echo $pic_name; ? >"<? php echo $pic_size[3]; ?>>
3.对图片加水印效果
·获取要加入水印的图片的宽、高值
·确定图片大小是否满足水印文字大小
·确定水印效果在图片中的位置
·设定图像的混色模式
·生成水印效果
·释放资源
<? php
function makeimagewatermark($image,$pos,$water_text,$font_size,$color)
{
$font_type="c://WINDOWS//Fonts//SIMYOU.TTF";
if(!empty($image)&& file_exists($image))
{
$img_info=getimagesize($image);
$g_w=$img_info[0];
$g_h=$img_info[1];
switch($img_info[2])
{
case 1:
$img=imagecreatefromgif($image);
break;
case 2:
$img=imagecreatefromjpeg($image);
break;
case 3:
$img=imagecreatefrompng($image);
break;
default:
die("Format Wrong");
}
}
else
{
die("Not exists!");
}
$temp=imagettfbbox(ceil($font_size*2.5),0,$font_type,$water_text);
$w=$temp[2]-$temp[6];
$h=$temp[3]-$temp[7];
if(($g_w<$w) || ($g_h<$h))
{
echo "Too small!";
return;
}
switch($pos)
{
case 0:
$pos_x=rand(0,($g_w-$w));
$pos_y=rand(0,($g_h-$h));
break;
case 1:
$pos_x=0;
$pos_y=0;
break;
case 2:
$pos_x=($g_w-$w)/2;
$pos_y=($g_h-$h)/2;
break;
case 3:
$pos_x=$g_w-$w;
$pos_y=$g_h-$h;
break;
default:
$pos_x=rand(0,($g_w-$w));
$pos_y=rand(0,($g_h-$h));
break;
}
imagealphablending($img,true);//设置图像混色模式 if(!empty($color) && (strlen($color)==7))
{
$R=hexdec(substr($color,1,2));
$G=hexdec(substr($color,3,2));
$B=hexdec(substr($color,5));
}
else
{
die("Format wrong!"); }
$text_color=imagecolorallocate($img,$R,$G,$B);
imagettftext($img,$font_size,0,$pos_x,$pos_y,$text_color,$font_type,$water_text);
switch($img_info[2])
{
case 1 :
imagegif($img,$image);
break;
case 2 :
imagejpeg($img,$image);
break;
case 3:
imagepng($img,$image);
break;
default:
die("Formate unSupport!");
}
imagedestroy($img);
}
if(isset($_FILES) && !empty($_FILES['userfile'])&& $_FILES['userfile']['size']>0)
{$uploadfile="./".time()."_".$_FILES['userfile']['name'];
if(copy($_FILES['userfile']['tmp_name'],$uploadfile))
{
makeimagewatermark($uploadfile,2,"Photo by Mac",16,"#43042A");
echo "<img src=\"".$uploadfile."\" border=\"0\">";
}
else
{
echo "uploadWrong!<br/>";
}
}
?>
<html>
<head>
<title>
19.9.php
</title>
</head>
<body>
<form enctype="multipart/form-data" method="POST">
选择上传图片:<input name="userfile" type="file">
<input type="submit" value="上传">
</form>
</body>
</html>
4.生成已有图片的缩略图
<? php
header("Content-type:image/jpeg");
$img_name="cc.jpg";
$src_img=imagecreatefromjpeg($img_name);
$ow=imagesx($src_img);
$oh=imagesy($src_img);
$nw=round($ow*200.0/$ow);
$nh=round($oh*200.0/$oh);
$desc_img=imagecreate($nw,$nh);
imagecopyresized($desc_img,$src_img,0,0,0,0,$nw,$nh,$ow,$oh);
imagejpeg($desc_img);
imagedestroy($desc_img);
imagedestroy($src_img);
?>
第一个和第二个參数各自是目标图像、原图像的标识符,接下来4个參数是目的图像和原图像的复制位置的坐标,最后4个參数是目的图像和原图像的复制区域的宽高。
!
!使用函数imagecopyresampled()函数
<?php
header("Content-type:image/jpeg");
$img_name="cc.jpg";
$percent=0.2;
$src_img=imagecreatefromjpeg($img_name);
$ow=imagesx($src_img);
$oh=imagesy($src_img);
$nw=$ow*$percent;
$nh=$oh*$percent;
$desc_img=imagecreatetruecolor($nw,$nh);
imagecopyresampled($desc_img,$src_img,0,0,0,0,$nw,$nh,$ow,$oh);
imagejpeg($desc_img);
imagedestroy($desc_img);
imagedestroy($src_img);
?>
版权声明:本文博客原创文章。博客,未经同意,不得转载。
PHP从零单排(十八)图像处理的更多相关文章
- 学好C++必须要注意的十八个问题
转自 http://blog.chinaunix.net/uid-7396260-id-2056691.html 一.#include "filename.h"和#i nclud ...
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十八:SDRAM模块① — 单字读写
实验十八:SDRAM模块① — 单字读写 笔者与SDRAM有段不短的孽缘,它作为冤魂日夜不断纠缠笔者.笔者尝试过许多方法将其退散,不过屡试屡败的笔者,最终心情像橘子一样橙.<整合篇>之际, ...
- ComicEnhancerPro 系列教程十八:JPG文件长度与质量
作者:马健邮箱:stronghorse_mj@hotmail.com 主页:http://www.comicer.com/stronghorse/ 发布:2017.07.23 教程十八:JPG文件长度 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十八):Web代理功能
在Senparc.Weixin.dll v4.5.7版本开始,我们提供了Web代理功能,以方便在受限制的局域网内的应用可以顺利调用接口. 有关的修改都在Senparc.Weixin/Utilities ...
- Bootstrap <基础二十八>列表组
列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 cl ...
- Bootstrap <基础十八>面包屑导航(Breadcrumbs)
面包屑导航(Breadcrumbs)是一种基于网站层次信息的显示方式.以博客为例,面包屑导航可以显示发布日期.类别或标签.它们表示当前页面在导航层次结构内的位置. Bootstrap 中的面包屑导航( ...
- 最全的MySQL基础【燕十八传世】
1.课前准备! 开启mysql服务:1).配置环境变量;2).net start mysql 将该sql文件导入到你的数据库中,以下所有操作都是基于该数据库表操作的!!! [此笔记是本人看着视频加上自 ...
- Web 前端开发人员和设计师必读文章推荐【系列二十八】
<Web 前端开发精华文章推荐>2014年第7期(总第28期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- Web 前端开发精华文章集锦(jQuery、HTML5、CSS3)【系列十八】
<Web 前端开发精华文章推荐>2013年第六期(总第十八期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 C ...
- NeHe OpenGL教程 第四十八课:轨迹球
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
随机推荐
- Git使用总结-so easy
一.Git的特性 Speed 速度(git是用c语言写的.一般都是提交到本地) Simple design Strong support for non-linear development (tho ...
- JAVA学习课第二十八届(多线程(七))- 停止-threaded多-threaded面试题
主密钥 /* * wait 和 sleep 差别? * 1.wait能够指定时间也能够不指定 * sleep必须指定时间 * 2.在同步中,对CPU的运行权和锁的处理不同 * wait释放运 ...
- how to fix the cwm/miui recovery status 2 error
Frequent issues: --------------------- If you report an issue without a log and/or without details, ...
- HDU 4508 沼泽湿地系列故事——记住减肥I (2013腾讯编程马拉松预赛第一)
pid=4508">http://acm.hdu.edu.cn/showproblem.php?pid=4508 题目大意: 给定一些数据. 每组数据以一个整数n開始,表示每天的食物清 ...
- 认识Backbone (四)
Backbone.View(视图) 视图的核心是处理数据业务逻辑.绑定DOM元素事件.渲染模型或者集合数据. 添加DOM元素 render view.render() render 默认实现是没有操 ...
- javascript 正则匹配 提取所有 preg_match_all matchAll方法
javascript 提取全部的的方法.javascript中没有matchAll这种方法. 用while来实现类似 PHP 中的preg_match_all() :(by default7#zbph ...
- 【rman,1】经典案例增量备份
一.备份策略: 1.星期天晚上 -level 0 backup performed(全备份) 2.星期一晚上 -level 2 backup performed 3.星期二晚上 ...
- Apple Watch 1.0 开发介绍 2.1 WatchKit Apps UI要点
实现app的开始是定义storyboard场景.每个场景定义了app的一部分界面.可以为不同的尺寸自定义场景. 组装storyboard界面 WatchKit app和iOS app的布局模式不同.组 ...
- 最小二乘法拟合非线性函数及其Matlab/Excel 实现(转)
1.最小二乘原理 Matlab直接实现最小二乘法的示例: close x = 1:1:100; a = -1.5; b = -10; y = a*log(x)+b; yrand = y + 0.5*r ...
- [原创].NET 分布式架构开发实战之三 数据访问深入一点的思考
原文:[原创].NET 分布式架构开发实战之三 数据访问深入一点的思考 .NET 分布式架构开发实战之三 数据访问深入一点的思考 前言:首先,感谢园子里的朋友对文章的支持,感谢大家,希望本系列的文章能 ...