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


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值