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相关推荐

  1. php gd测试代码,PHP: GD - Manual

    gd_info - 取得当前安装的 GD 库的信息 image_type_to_mime_type - 取得 getimagesize,exif_read_data,exif_thumbnail,ex ...

  2. 利用PHP GD库生成位图

    关于PHP在apache中的安装配置请参考 Apache 配置CGI脚本操作数据库 位图 位图图像(bitmap), 亦称为点阵图像或绘制图像,是由称作像素(图片元素)的单个点组成的.这些点可以进行不 ...

  3. PHP 使用GD库生成验证码 在图像上绘制汉字

    PHP 并不仅限于创建 HTML 输出, 它也可以创建和处理包括 GIF, PNG, JPEG, WBMP 以及 XPM 在内的多种格式的图像. 更加方便的是,PHP 可以直接将图像数据流输出到浏览器 ...

  4. Centos安装GD库

    tar zxvf ncurses-5.6.tar.gz 进入目录 cd ncurses-5.6 生成 makefile文件, 再进一步编译 ./configure --prefix=/usr --wi ...

  5. IIS+PHP+MySQL+Zend Optimizer+GD库+phpMyAdmin安装配置[完整修正实用版]

    IIS+PHP+MySQL+Zend Optimizer+GD库+phpMyAdmin安装配置[完整修正实用版] IIS+PHP+MySQL+Zend Optimizer+GD库+phpMyAdmin ...

  6. php上传漏洞绕过gd库,jQuery File Upload任意文件上传漏洞

    事件背景 jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个JavaScript代码库(或JavaScript框架).jQuery File Upload一个jQ ...

  7. centos php 开启libgdgd_Linux下开启PHP GD库支持

    在linux系统中开启GD库支持,有以下几种方法. 1,检测GD库是否安装命令 代码示例: php5 -m | grep -i gd 或者 php -i | grep -i --color gd 2, ...

  8. 华胜天成1.18亿美元收购美国GD公司

    "2016年软件产业实现营业收入7267亿元,收入增速约为10.3%,软件业在北京市GDP占比4.8%,超越批发零售业,在第三产业中居于第二位,仅次于金融业."近日,北京市经信委软 ...

  9. React-Native 之 GD (一)目录结构与第三方框架使用与主题框架搭建

    1.APP效果图 2.工程环境配置 IOS: 将压缩包内的 Images.xcassets 文件夹直接替换掉我们iOS工程中的 Images.xcassets 文件夹. 这时候我们可以看到所有图片资源 ...

最新文章

  1. css中display设置为table、table-row、table-cell后的作用及其注意点
  2. spring (由Rod Johnson创建的一个开源框架)
  3. tflearn anaconda 安装过程记录
  4. Buuctf(pwn) ez_pz_hackover_2016 泄露栈地址,retshellcode;调试计算
  5. Caffe查看每一层学习出来的pattern
  6. Hello Qt(在Linux下编写运行Qt程序)
  7. firefox flash-plugin怎样安装
  8. listrecord根据某个属性去重_去哪网开发实战记录(9):城市选择页(中)
  9. 华云网际:虚拟机+廉价服务器 一体机就这么简单
  10. JarvisOJ Basic 熟悉的声音
  11. is present but cannot be translated into a null value due to being declared as a primitive type
  12. 基于情感词典的情感值分析
  13. 框架应该弄明白的理论问题
  14. 是否优化更新主题浏览量:_主题306:能力规划
  15. 历年奥斯卡获奖影片(1927—2015)
  16. 矸石称重自动化系统有什么功能性要求
  17. 毕业设计-基于微信小程序房屋安全管理系统
  18. 故杀敌者,怒也;取敌之利者,货也
  19. 目前绝大多数处理语言先验性文章总结
  20. 基于MFC的圆环的消隐实现

热门文章

  1. android如何释放图片缓存
  2. 凸优化“傻瓜”教程-----凸优化基础知识
  3. python:实现绘制粽子(附完整源码)
  4. Git 学习日记-01
  5. 用html中表单标签实现QQ登录注册静态页面
  6. 计算机类专业教指委委员名单,教育部高等学校计算机类专业教学指导委员会举办《高校计算机系统能力培养教学研讨会》...
  7. 计算机屏保是不是休眠,计算机上屏保、待机、休眠、睡眠、关机的区别
  8. matlab 画图基本
  9. (下)开发一款微信小程序的个性简历,能打开大厂之门并获得门票?(附源码)
  10. 1. 语音类实现 (实现读取wav/pcm,STFT)