- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
我们在上网登录网页的时候,绝大多数都要输入验证码,进行验证,才能登录,而PHP程序员可以根据情况自己绘制验证码,在PHP中,简单的验证码,我们可以使用PHP自带的绘图功能来绘制,并且我们也可以使用PHP的绘图对图片进行水印的增加……
我们学数学的时候都要学习坐标系,这里就不在进行阐述,在编程语言中也是有坐标系的存在,但是编程语言的坐标系和数学上的坐标系是不一样的。
在PHP坐标系中,坐标原点位于左上角
,X轴为水平方向,Y轴是当前位置的垂直方向,同时坐标系的单位是像素。
上面说到坐标系的坐标点是像素,像素是一个密度单位,它的大小和用户的屏幕有关系。
像素:计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的,例如,计算机显示器的分辨率是800×600,表示计算机屏幕上的每一行由800个点组成,共有600行,整个计算机屏幕共有480000个像素。
注意:像素是密度单位,厘米是长度单位。
在PHP中如果要使用绘图技术,必须打开gd2扩展库。在PHP.ini文件中进行打开,打开后重启服务器。
在PHP绘图功能中的函数都是以image开头的。并且整个函数都是小写。在帮助文档中有很多函数。在我们需要的时候可以在里面找:函数参考-图像生成和处理-GD-GD和图像处理函数。我们在进行PHP绘图中,一般可以按照步骤一步步完成。
$canva = imagecreatetruecolor(宽,高)
$paint = imagecolorallocate(画布,三原色(r,g,b));
imageline(画布,startX,startY,endX,endY,画笔);
imagedestroy(画布);
我们可以按照上面的步骤进行绘制不同的图形,在进行绘制图形的时候,我们可以进行不同的操作进行图形的拼接,同时我们也可以创建不同的画笔,进行不同颜色的绘制。
我们可以根据上面的步骤进行不同图案的绘制。只不过是绘制不同的图形需要不同的函数。函数的参数可以在帮助文档中进行查询。
<?php
//创建一个画布
$canvas = imagecreatetruecolor(300, 300);
//创建一个画笔
$paint = imagecolorallocate($canvas, 255, 0, 0);
//绘制不同的图形,可以修改函数进行不同图形的绘制
//绘制一条直线
imageline($canvas, 10, 10, 50, 50, $paint);
//绘制一个矩形
imagerectangle($canvas, 10, 100, 30, 120, $paint);
//绘制一个椭圆
imageellipse($canvas, 100, 121, 100, 50, $paint);
//绘制一个圆,也是上面的函数,不过是把宽和高写成一样的就行了。
imageellipse($canvas,200,100,50,50,$paint);
//绘制弧形
imagearc($canvas, 200,50,40, 40, 0, 90, $paint);
//画一个填充的圆形
imagefilledellipse($canvas, 250, 230, 60, 60, $paint);
//输出到浏览器
header("content-type:image/png");
//以png的形式输出到浏览器上
imagepng($canvas);
//销毁图形,释放内存
imagedestroy($canvas);
上面的代码使用不同的函数创建不同的图形,但是我们在上面的代码中只有一个对图像进行填充,比如我们画一个圆里面填充上颜色。可以使用imagefilledellipse()函数,这个函数只是比imageellipse()函数多了一个filled,里面的参数还是一样的。在绘制图形中,如果要填充图形,一般是在image后面添加filled这个字母就可以了。
PHP绘制图形是还可以使用现成的图片进行绘制,使用这种方式可以理解为画布开始就有图案了,我们只是在图案上进行绘制。
<?php
//使用现有的图形进行绘制
$canvas = imagecreatefromjpeg('Desert.jpg');
//创建画笔
$paint_red = imagecolorallocate($canvas,255,0,0);
//在创建一个蓝色的笔。
$paint_blue = imagecolorallocate($canvas,0,0,255);
//绘制一个填充的弧形,最后一个参数是连接的样式。
imagefilledarc($canvas, 100, 100, 100, 100, 0, 180, $paint_blue,IMG_ARC_PIE
);
//输出到浏览器
header("content-type:image/png");
//以png的形式输出到浏览器上
imagepng($canvas);
//销毁图形,释放内存
imagedestroy($canvas);
从结果中可以看到在图形的左上角画了一个填充的半圆形。
当然,如果我们不想修改原来的图形,可以使用copy方法把现有的图形复制下来。这样你对图形的修改就不会形象到原来的图形。
<?php
//创建一个空白的画布
$canvas = imagecreatetruecolor(500,500);
//创建一个图片
$image = imagecreatefromjpeg('Desert.jpg');
//使用函数获取图片的信息,里面包括了图片的宽高。
$image_info = getimagesize('Desert.jpg');
//使用imagecopy()方法进行拷贝
//第一个参数是把图形拷贝到那个画布,第二个参数是从哪里拷贝,第三,四个参数是拷贝到的画布从哪里开始,第五六七八个参数是被拷贝的图形从哪里开始,宽和高是多少
imagecopy($canvas, $image, 0, 0, 0, 0, $image_info[0], $image_info[1]);
//在拷贝的图形上绘制一个填充的矩形。
$paint = imagecolorallocate($canvas,0,255,0);
imagefilledrectangle($canvas, 100, 100, 300, 300, $paint);
//输出到浏览器
header("content-type:image/png");
//以png的形式输出到浏览器上
imagepng($canvas);
//销毁图形,释放内存
imagedestroy($canvas);
上面使用imagecopy()函数进行,我们在使用这个函数的时候需要注意里面的参数。
在开发中我们会遇到在一张图片上打印上水印。这里我们有两个函数都可以进行imagestring()函数和imagettftext()函数,但是这两个函数是有不同的,imagestring()函数不支持中文,并且它支持的字体太少,只有五种字体,imagettftext()函数可以很好的输出中文,并且它的字体可以自由的设置,但是这个函数需要一个字体文件。
<?php
//创建一个空白的画布
$canvas = imagecreatetruecolor(500,500);
//创建一个图片
$image = imagecreatefromjpeg('Desert.jpg');
//使用函数获取图片的信息,里面包括了图片的宽高。
$image_info = getimagesize('Desert.jpg');
//使用imagecopy()方法进行拷贝
imagecopy($canvas, $image, 0, 0, 0, 0, $image_info[0], $image_info[1]);
//绘制水印的
$paint = imagecolorallocate($canvas, 255, 0, 0);
//使用imagestring()函数
$str = 'lijiafei';
//这个函数第二个参数是设置字体的,只能是1-5,
imagestring($canvas, 5, 100, 300, $str, $paint);
//使用imagettftext()函数
$text = '这是一张中文的水印';
imagettftext($canvas, 30, 0, 100, 200, $paint, 'STXINGKA.TTF', $text);
header("content-type:image/png");
//以png的形式输出到浏览器上
imagepng($canvas);
//销毁图形,释放内存
imagedestroy($canvas);
在上面的代码中我们可以看到使用两个函数进行水印的打印。
imagestring(resource $image , int $font , int $x , int $y , string $s , int $col )
第一个参数可以理解为是一个画布,
第二个参数是水印的字体大小,这里只支持1-5五种字体。
第三、四个参数是水印位于图片的那个位置,坐标位于字体的左上角。
第五个参数是需要打印的字体。
第六个参数字体的颜色。
imagettftext(resource $image,float $size,float $angle,int $x,int $y,int $color,string $fontfile,string $text)这个函数的参数有点多,但是也不难理解。
第一个参数是一个画布
第二个参数是字体的大小,这里的字体的大小我们可以自由的设置,数字越大,字体越大。
第三个参数是字体倾斜的度数,按照逆时针的顺序进行倾斜。
第四、五个参数是字体位于图片的位置,这里的坐标是从字体的左下角计算的,和上面的不同。
第六个参数是字体的颜色。
第七个参数是一个字体文件的名字,在我们的C:\Windows\Fonts下有很多字体,我们可以选择一种字体,字体文件我们需要粘贴到当前文件下面才能生效。
第八个参数是需要打印的字。
上面我们介绍了大多数函数的介绍,这里我们做一个案列,这个案例说白了就是利用不同的函数进行拼接图形。
代码:
<?php
//创建一个画布
$canvas = imagecreatetruecolor(500, 500);
//蓝色的笔
$blue = imagecolorallocate($canvas, 0, 0, 255);
//白的的笔
$white = imagecolorallocate($canvas,255,255,255);
//黑色的笔
$black = imagecolorallocate($canvas,0,0,0);
//红色的笔
$red = imagecolorallocate($canvas,255,0,0);
//画头,画一个填充颜色是蓝色的圆。
imagefilledellipse($canvas, 150, 150, 130, 105, $blue);
//画脸,画一个填充颜色是白色的圆。但是圆的原点比头的原点要往下一点。
imagefilledellipse($canvas, 150, 160, 110, 90, $white);
//画两个眼睛
imageellipse($canvas, 140, 130, 20, 30, $black);
imageellipse($canvas, 160, 130, 20, 30, $black);
//画两个眼珠
imagefilledellipse($canvas, 140, 130, 5, 5, $black);
imagefilledellipse($canvas, 160, 130, 5, 5, $black);
//画鼻子
imagefilledellipse($canvas, 150, 150, 10, 10, $red);
//画鼻子下面的一条线
imageline($canvas,150,155,150,165,$black);
//画嘴
imagefilledarc($canvas, 150,165, 75, 60, 0, 180, $red,IMG_ARC_PIE);
//画嘴的两个角
imagearc($canvas, 114,156, 20, 20, 90, 270, $black);
imageline($canvas,114,165,187,165,$black);
imagearc($canvas, 187,156, 20, 20, 270, 90, $black);
//把嘴巴画成黑色
imagearc($canvas, 150,165, 75, 60, 0, 180, $black);
header("content-type:image/png");
imagepng($canvas);
imagedestroy($canvas);
我们在开头提到过,我们可以利用绘图技术来进行网站验证码的制作,而验证码的生成可以看成在一张图片上把随机产生的字体打印在图片上。同时在图片上有一些点进行视线的骚扰,这里我们可以创建一个类,然后通过不同的方法进行不同的操作。
/*
生成随机码
*/
private function mkCode(){
//通过类的参数获取需要的随机数的个数。这个值可以自由的指定
$len = $this -> _len;
//我们生成的随机数的字母喝数字就是在这里面进行随机生成。
$str = 'ABCDEFGHIGKLMNOPQRST1234567890';
$code = '';
//通过循环的生成随机数进行获取
for($i = 0; $i < $len; $i++){
//生成随机数
$j = mt_rand(0,strlen($str)-1);
//把随机生成的随机数拼接起来。
$code .= $str[$j];
}
//把生成的随机数,保存在session中,便于当我们输入验证码是验证是否正确。
@session_start();
$_SESSION['code'] = $code;
return $code;
}
我们在生成随机码的时候,可以指定生成的随机数的长度,默认是4个。通过mt_rand(参数1,参数2)函数生成不同的数字。这个函数返回一个参数1和参数2之间(包括这两个数)的int类型的数字。
//生成验证码
public function makeImage(){
//获取随机生成的随机码
$code = $this -> mkCode();
//通过类的属性指定图形的大小,默认是100,20
$canvas = imagecreatetruecolor($this -> _width, $this -> _height);
//随机生成一个颜色的画笔
$paint = imagecolorallocate($canvas,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
//把背景的颜色进行改变,默认是黑色的。
imagefill($canvas, 10, 10, $paint);
//创建一个画随机码的笔,颜色也是随机生成的。
$paint_str = imagecolorallocate($canvas,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
//把随机码打印在画布上。
imagestring($canvas, 4, 20, 2, $code, $paint_str);
//绘制干扰点的颜色
$paint_pixel = imagecolorallocate($canvas,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
//通过类的属性指定需要多少个干扰点。
for($i = 0; $i < $this -> _pixel; $i++){
//绘制不同的干扰点,而绘制的位置也是随机生成的。
imagesetpixel($canvas, mt_rand(0,imagesx($canvas)), mt_rand(0,imagesy($canvas)), $paint_pixel);
}
header("content-type:image/png");
imagepng($canvas);
imagedestroy($canvas);
}
源代码:
<?php
Class Cap{
//生成的字符的长度
private $_len = 4;
//干扰点的个数
private $_pixel = 100;
private $_width = 100;
private $_height = 20;
public function __set($pro,$val){
if(property_exists($this, $pro)){
$this -> $pro = $val;
}
}
/*
生成随机码
*/
private function mkCode(){
//通过类的参数获取需要的随机数的个数。这个值可以自由的指定
$len = $this -> _len;
//我们生成的随机数的字母喝数字就是在这里面进行随机生成。
$str = 'ABCDEFGHIGKLMNOPQRST1234567890';
$code = '';
//通过循环的生成随机数进行获取
for($i = 0; $i < $len; $i++){
//生成随机数
$j = mt_rand(0,strlen($str)-1);
//把随机生成的随机数拼接起来。
$code .= $str[$j];
}
//把生成的随机数,保存在session中,便于当我们输入验证码是验证是否正确。
@session_start();
$_SESSION['code'] = $code;
return $code;
}
//生成验证码
public function makeImage(){
//获取随机生成的随机码
$code = $this -> mkCode();
//通过类的属性指定图形的大小,默认是100,20
$canvas = imagecreatetruecolor($this -> _width, $this -> _height);
//随机生成一个颜色的画笔
$paint = imagecolorallocate($canvas,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
//把背景的颜色进行改变,默认是黑色的。
imagefill($canvas, 10, 10, $paint);
//创建一个画随机码的笔,颜色也是随机生成的。
$paint_str = imagecolorallocate($canvas,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
//把随机码打印在画布上。
imagestring($canvas, 4, 20, 2, $code, $paint_str);
//绘制干扰点的颜色
$paint_pixel = imagecolorallocate($canvas,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
//通过类的属性指定需要多少个干扰点。
for($i = 0; $i < $this -> _pixel; $i++){
//绘制不同的干扰点,而绘制的位置也是随机生成的。
imagesetpixel($canvas, mt_rand(0,imagesx($canvas)), mt_rand(0,imagesy($canvas)), $paint_pixel);
}
header("content-type:image/png");
imagepng($canvas);
imagedestroy($canvas);
}
//判断验证码和填写的验证码是否正确
public function checkCode($code){
@session_start();
if(strtolower($code) === strtolower($_SESSION['code'])){
return true;
}
return false;
}
}
$cap = new Cap();
$cap -> makeImage();
运行代码,每次刷新都可以生成一个不同的验证码。
PHP的图形绘制,简单的可以理解为不同的函数的利用。上面的案列几乎都是函数的利用。同时也要理解绘制图形的步骤,在绘制图形时,注意坐标是那几个参数。
Java 库和 android 库有什么区别,各自有什么优点/缺点? 最佳答案 您可以在 Android 应用程序中包含标准 Java .jar 文件库。它们在 .apk 构建时被翻译成 Dalvik
所以,我现在的代码就像从 Java 层加载库(比如 liba.so),并在内部 liba.so 加载 libb.so。因此,如果我必须将所有库打包到 APK 中并将其安装在没有 root 访问权限的设
我想在我的系统中设置 LEDA 库。 我已经从以下链接下载了 LEDA 库 http://www.algorithmic-solutions.info/free/d5.php Instruct
我想用 autoconf 创建一个共享库。但是,我希望共享库具有“.so”扩展名,而不是以“lib”开头。基本上,我想制作一个加载 dlopen 的插件。 .是否有捷径可寻? 当我尝试使用 autoc
我需要在 Apps 脚本应用程序上修改 PDF。为此,我想使用 JS 库:PDF-LIB 我的代码: eval(UrlFetchApp.fetch("https://unpkg.com/pdf-lib
我正在构建一个使用以下 Boost header 的程序(我使用的是 Microsoft Visual C++ 10), #include #include #include #include
当我通过 cygwin 在 hadoop 上运行此命令时: $bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+' 我
我已经通过 vcpgk 成功安装了一个 C++ 库,名为:lmdb:x64-windows 我还安装了lmdb通过 Cabal 安装的 Haskell 绑定(bind)包 在尝试测试 lmdb 包时:
我该如何解决这个问题? 我刚刚将 javacv jar 文件复制到我的项目 Lib 文件夹下,但出现了这个错误! 我可以找到这个thread来自谷歌,但不幸的是,由于我国的谷歌限制政策,该页面无法打开
我有一个 Android 库项目 FooLib。 FooLib 引用 Android Context 之类的东西,但不需要任何资源文件(res/ 中的东西)所以我目前将其打包为供我的应用使用的 JAR
我正在开发一个 Android 应用程序(使用 Android Studio),它能够通过手势识别算法了解您正在进行的 Activity 。对于我使用 nickgillian ithub 帐户上可用的
关于从 .NET Framework 项目中引用 .NET Standard 类库的问题有很多类似的问题,其中 netstandard 库中的 NuGet 包依赖项不会流向 netframework
我已经从互联网上下载了 jna-4.2.2.jar,现在想将这个 jar 导入到我的项目中。但是当我试图将这个 jar 导入我的项目时,出现以下错误。 [2016-06-20 09:35:01 - F
我正在尝试通过编译在 Mac 上安装 rsync 3.2.3。但是,我想安装所有功能。为此,它需要一些库,此处 ( https://download.samba.org/pub/rsync/INSTA
进入 Web 开发有点困难。过去 5 年我一直致力于 winforms 工作。所以我正在努力从一种切换到另一种。前段时间,我使用过 JavaScript,但现在还没有大量的 JavaScript 库
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我正在寻找一个用Python编写的与logstash(ruby + java)类似的工具/库。 我的目标是: 从 syslog 中解析所有系统日志 解析应用程序特定日志(apache、django、m
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我花了几天时间试图寻找用于 JavaPOS 实现的 .jar 库,但我找不到任何可以工作的东西。我找到了很多像这样的文档:http://jpos.1045706.n5.nabble.com/file/
这个问题在这里已经有了答案: Merge multiple .so shared libraries (2 个答案) 关闭 9 年前。 我有我在代码中使用的第三方库的源代码和对象。该库附带有关如何使
我是一名优秀的程序员,十分优秀!