php gd imageaffine
gd库里面的函数有一大堆,不可能一次性分门别类的都整理完,所以用到的时候再整理一下。imageaffine官方的文档地址是 http://php.net/manual/zh/function.imageaffine.php。虽然官方的例子举了一大堆,但是对这个函数的使用方法并没有作详细的说明,甚至连举得例子都有问题。看了一遍只知道是对图片进行矩阵运算进行仿射变换的,所以只能一边自学一边调试。
resource imageaffine ( resource $image , array $affine [, array $clip ] )
首先,imageaffine这个函数对php版本还是有一定的要求,要php5(>5.5)的版本以上或者php7。
然后,这个函数有三个参数,两个必填,一个可选。
官方的参数说明跟没有一样。。等我慢慢调试看参数的功能是什么。
$image,这个还是很好理解的,图像资源,gd库里面有很多函数可以将原始输入读取或是转换成图片资源
$affine,从后面的例子来看这是个有6个元素的数组。应该就是将图像进行转换的矩阵参数。参数的顺序:
$affine = [ a0, a1, b0, b1, a2, b2 ];
x' = a0x + a1y + a2
y' = b0x + b1y + b2
$clip,从例子中知道是对图像进行剪裁的,格式是array['x' => , 'y' => , 'width' => , 'height'=>]但是具体怎么用还是要靠调试。慢慢调试发现,其中‘x’是定义图像距x轴正向平移的距离,'y'是图像距离y轴正向平移的距离,‘width’剪裁图片保留的宽度,‘height’是剪裁图片保留的高度
当时的需求是将汉字转换为斜体,并旋转一定的角度。
先准备一段将文字转换为图片的代码:
$font_file = 'fonts/fangzheng.ttf'; //字体文件
$font = iconv("UTF-8","gb2312",$font_file);
$font_size = 25; //字体大小if (isset($_GET['text'])){$text = $_GET['text'];
} else{die('invalid text');
}$fontarea = imagettfbbox($font_size,0,$font,$text); //确定会变化的字符串的位置
$text_width = $fontarea[2]-$fontarea[0]+($font_size/3); //字符串文本框长度
$text_height = $fontarea[1]-$fontarea[7]+($font_size/3); 字符串文本框高度
$im = imagecreate( $text_width , $text_height );
$white = imagecolorallocate($im, 255,255,255); //定义透明色
$red = imagecolorallocate ( $im , 255 , 0 , 0); //文本色彩
imagettftext ( $im , $font_size , 0 , 0, $text_height-($font_size/2.5) , $red , $font , $text );
imagecolortransparent($im,$white);
header("Content-type: image/png");
imagepng($im);
输入GET参数,并打印到页面,结果是这样的
然后建个坐标系,由于文档没说坐标系是怎么建的,我自然而然建成了如下:
然而。。。坑爹的是,经过不断地调试,发现这个函数默认的坐标系是这样:
现在要目标就是实现下面变化:
先转换成平行四边形
x' = x
y' = x/tan(β) + y
用代码调试:
if (isset($_GET['beta'])){$beta = $_GET['beta'] * M_PI / 180 ;
} else{die('invalid beta');
}$w = imagesx($im);
$h = imagesy($im);$affine = [1, 0, 1/tan($beta), 1, 0, 0];
$arr_clip = [ 'x' => 0, 'y' => 0, 'width' => $w, 'height' => $h ];$im_result = imageaffine($im, $affine, $arr_clip);header("Content-type: image/png");
imagepng($im_result);
传入$_GET['beta']=120输出到页面上的结果:
最后一步,对图片进行旋转
x'' = cos(α)x' + sin(α)y '
y'' = -sin(α)x' + cos(α)y '
用代码调试:
if (isset($_GET['alpha'])){$alpha = $_GET['alpha'] * M_PI / 180 ;
} else{die('invalid beta');
}$w2 = imagesx($im_result);
$h2 = imagesy($im_result);$affine2 = [cos($alpha), sin($alpha), -sin($alpha), cos($alpha), 0, 0];
$arr_clip2 = [ 'x' => 0, 'y' => 0, 'width' => $w2, 'height' => $h2 ];$im_final = imageaffine($im_result, $affine2, $arr_clip2);
header("Content-type: image/png");
imagepng($im_final);
最后的输出结果:
大功告成~调试至此对imageaffine这个函数的用法有了一定的理解,希望以后在使用时能有更多新的发现~
php gd imageaffine相关推荐
- php gd测试代码,PHP: GD - Manual
gd_info - 取得当前安装的 GD 库的信息 image_type_to_mime_type - 取得 getimagesize,exif_read_data,exif_thumbnail,ex ...
- 利用PHP GD库生成位图
关于PHP在apache中的安装配置请参考 Apache 配置CGI脚本操作数据库 位图 位图图像(bitmap), 亦称为点阵图像或绘制图像,是由称作像素(图片元素)的单个点组成的.这些点可以进行不 ...
- PHP 使用GD库生成验证码 在图像上绘制汉字
PHP 并不仅限于创建 HTML 输出, 它也可以创建和处理包括 GIF, PNG, JPEG, WBMP 以及 XPM 在内的多种格式的图像. 更加方便的是,PHP 可以直接将图像数据流输出到浏览器 ...
- Centos安装GD库
tar zxvf ncurses-5.6.tar.gz 进入目录 cd ncurses-5.6 生成 makefile文件, 再进一步编译 ./configure --prefix=/usr --wi ...
- IIS+PHP+MySQL+Zend Optimizer+GD库+phpMyAdmin安装配置[完整修正实用版]
IIS+PHP+MySQL+Zend Optimizer+GD库+phpMyAdmin安装配置[完整修正实用版] IIS+PHP+MySQL+Zend Optimizer+GD库+phpMyAdmin ...
- php上传漏洞绕过gd库,jQuery File Upload任意文件上传漏洞
事件背景 jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个JavaScript代码库(或JavaScript框架).jQuery File Upload一个jQ ...
- centos php 开启libgdgd_Linux下开启PHP GD库支持
在linux系统中开启GD库支持,有以下几种方法. 1,检测GD库是否安装命令 代码示例: php5 -m | grep -i gd 或者 php -i | grep -i --color gd 2, ...
- 华胜天成1.18亿美元收购美国GD公司
"2016年软件产业实现营业收入7267亿元,收入增速约为10.3%,软件业在北京市GDP占比4.8%,超越批发零售业,在第三产业中居于第二位,仅次于金融业."近日,北京市经信委软 ...
- React-Native 之 GD (一)目录结构与第三方框架使用与主题框架搭建
1.APP效果图 2.工程环境配置 IOS: 将压缩包内的 Images.xcassets 文件夹直接替换掉我们iOS工程中的 Images.xcassets 文件夹. 这时候我们可以看到所有图片资源 ...
最新文章
- css中display设置为table、table-row、table-cell后的作用及其注意点
- spring (由Rod Johnson创建的一个开源框架)
- tflearn anaconda 安装过程记录
- Buuctf(pwn) ez_pz_hackover_2016 泄露栈地址,retshellcode;调试计算
- Caffe查看每一层学习出来的pattern
- Hello Qt(在Linux下编写运行Qt程序)
- firefox flash-plugin怎样安装
- listrecord根据某个属性去重_去哪网开发实战记录(9):城市选择页(中)
- 华云网际:虚拟机+廉价服务器 一体机就这么简单
- JarvisOJ Basic 熟悉的声音
- is present but cannot be translated into a null value due to being declared as a primitive type
- 基于情感词典的情感值分析
- 框架应该弄明白的理论问题
- 是否优化更新主题浏览量:_主题306:能力规划
- 历年奥斯卡获奖影片(1927—2015)
- 矸石称重自动化系统有什么功能性要求
- 毕业设计-基于微信小程序房屋安全管理系统
- 故杀敌者,怒也;取敌之利者,货也
- 目前绝大多数处理语言先验性文章总结
- 基于MFC的圆环的消隐实现
热门文章
- android如何释放图片缓存
- 凸优化“傻瓜”教程-----凸优化基础知识
- python:实现绘制粽子(附完整源码)
- Git 学习日记-01
- 用html中表单标签实现QQ登录注册静态页面
- 计算机类专业教指委委员名单,教育部高等学校计算机类专业教学指导委员会举办《高校计算机系统能力培养教学研讨会》...
- 计算机屏保是不是休眠,计算机上屏保、待机、休眠、睡眠、关机的区别
- matlab 画图基本
- (下)开发一款微信小程序的个性简历,能打开大厂之门并获得门票?(附源码)
- 1. 语音类实现 (实现读取wav/pcm,STFT)