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这个函数的用法有了一定的理解,希望以后在使用时能有更多新的发现~