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管线 ...
随机推荐
- js缓冲运动
缓冲运动 现象:逐渐变慢,最后停止 原理:距离越远,速度越大 速度的计算方式: 1,速度由距离决定 2,速度=(目标值-当前值)/缩放系数 说明:速度为正负数时,也决定了物体移动的方向 示例:div缓 ...
- 一份关于jvm内存调优及原理的学习笔记
JVM 一.虚拟机的基本结构 1.jvm整体架构 类加载子系统:负责从文件系统或者网络中加载class信息,存入方法区中. 方法区(Perm):存放加载后的class信息,包括静态方法,jdk1.6以 ...
- C++类实现最大数的输出
Description 判断整数的大小,输入n个数,找出最大的数并输出. Input 有多组测试实例,输入n,并输入n个数. Output 输出的最大的数,每个输出结果占一行. Sample Inpu ...
- node.js基础:HTTP服务器
一个HTTP服务器响应 var http = require('http'); http.createServer(function(request,response){ response.end(' ...
- WebAPI 15 CORS
WebAPI 15 CORS 同源策略 首先基于安全的原因,浏览器是存在同源策略这个机制的,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. 对于同源必须要求URL在如下几个方 ...
- 开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器
原文:[原创]开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器 本博客所有文章分类的总目录:http://www.cnblogs.com/asxiny ...
- Python计算&绘图——曲线拟合问题(转)
题目来自老师的课后作业,如下所示.很多地方应该可以直接调用函数,但是初学Python,对里面的函数还不是很了解,顺便带着学习的态度,尽量自己动手code. 测试版代码,里面带有很多注释和测试代码: # ...
- C#中调用c++的dll
C#中调用c++的dll具体创建与调用步骤,亲测有效~ 使用的工具是VS2010哦~其他工具暂时还没试过 我新建的工程名是my21dll,所以会生成2个同名文件.接下来需要改动的只有画横线的部分 ...
- JMS ActiveMQ研究文档
1. 背景 当前,CORBA.DCOM.RMI等RPC中间件技术已广泛应用于各个领域.但是面对规模和复杂度都越来越高的分布式系统,这些技术也显示出其局限性:(1)同步通信:客户发出调用后,必须等待服务 ...
- Swing 组件焦点设置
在Swing中,焦点默认是在第一个组件上,所以在项目中想将焦点设置在其他的组件上,如JTextField!但通过requestFocus()方法不起作用,有人提供以下解决方法: 全部初始化之后,jTe ...