前回の記事からの続きです。 GD ライブラリはさまざまな方法で使用できます。もちろん、以前の検証コードやウォーターマークに加えて、画像の拡大縮小、トリミング、回転などの操作も実行できます。アプリケーション。
1.透かしを追加します
ウォーターマークの目的を達成するために、imagechar または imagestring を使用して画像に文字または文字列 (漢字も) を描画できることはすでに知っています。文字のウォーターマークを追加するだけでなく、画像のウォーターマークも追加できる、より良い方法があります。 : 画像コピー。
プロトタイプ: bool imagecopy (resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h ) これがコピーであることがわかります。 、 1 番目と 2 番目の 2 つのパラメータは、それぞれターゲット画像ハンドルとソース ファイル ハンドルです。透かし画像が小さい画像であり、大きい画像に追加される場合、最初のパラメータは大きい画像ハンドルとソース ファイル ハンドルです。 2 番目のパラメータは小さな画像ハンドルです。 3 番目と 4 番目のパラメータは、ターゲット画像上の透かしの x 座標と y 座標です。5 番目と 6 番目のパラメータは、透かし画像の開始 x 座標と y 座標です。7 番目と 8 番目のパラメータは、透かし画像として使用されます。ウォーターマーク画像 src_im の幅と高さなので、このメソッドの意味はウォーターマーク画像 src_im の左上隅の頂点座標 (src_x, src_y) の部分をコピーすることであり、幅と高さはそれぞれ src_w, src_h です。を画像 dst_im にコピーし、この dst_im 画像をキャンバスに描画して保存または出力すると、透かし入りの画像になります。コード:
リーリー効果:
ここでは、透かし画像を画像の右下隅に配置するだけなので、画像の右下隅に配置するには、imagecopy を呼び出すときに、左上隅の頂点 (座標 0,0) から開始する簡単な計算が必要です。透かし画像の幅と高さの転送 (透かしを入れる画像の幅と高さ) を透かしを入れる画像にコピーし、imagejpeg で画像を描画して保存します。 imagejpeg などの関数を描画する場合に注意してください (ここでは単純に使用します)。 ) 2 番目のパラメーターに渡すと、画像はブラウザーに出力されるのではなくファイルとして保存されるため、ヘッダー情報を送信するために header 関数を調整する必要はありません。
もちろん、どちらがソースファイル(src)でどちらがターゲットファイル(dst)であるかを把握する必要もあります。大きな画像上の小さな画像にウォーターマークを追加する場合、ソースファイルは小さな画像のウォーターマークになります。それを全体像にコピーするのが目標です。
imagecopy の 2 番目のパラメータは画像ハンドルなので、既存の画像から画像を作成できます (imagecreatefromjpeg など)。もちろん、既存の文字から文字画像ハンドル変数を作成することもできます。 - imagecreatefromstring メソッドを使用するため、これはより一般的です。
2.画像ズーム
多くのアプリケーションでは、画像リストは小さな画像であり、特定の画像をクリックすると、完全な大きな画像が表示されますが、これには画像の縮小処理が必要です。 imagecopyresize と imagecopyresampled の 2 つの方法があり、どちらもほぼ同じです。違いは、後者の方が画像をリサンプリングするため (私の専門用語のようです)、画質が向上します (リサンプリングもどちらの方法が使用されるかによって異なります)。いくつかの方法は悪化します)、1 つを選んで次のように言います:
bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )
1番目と2番目のパラメータは上記と同様です。スケーリングを実現するにはどうすればよいですか?たとえば、ここでは、元の画像の左上隅の頂点にある、座標 (src_x, src_y)、幅と高さ src_w、src_h の画像の一部が、座標 (dst_x, dst_y) のターゲット画像に描画されます。 widthとheightはdst_w、dst_hに置きますので、対象画像の幅と高さが元の画像の選択部分の幅と高さより小さい場合は、当然縮小版の座標値になります。左上隅の 2 つの頂点は同じである必要があります。例として jpg タイプを取り上げます。 リーリー
効果:ここでは、元の写真と小さな写真を2セットで保存し、小さな写真をリストに表示し、元の写真を下位検索で表示することができます。
3.画像のトリミング
上記の imagecopyresampled メソッドを考慮すると、元の画像の左上隅から開始するのではなく、左上隅の右下隅の点から開始すると、切り取られた画像の幅と高さは失われます。ソースファイルの完全な幅と高さに等しいが、部分的な幅と高さの場合、新しいリサンプリングされた画像はソース画像の一部となり、トリミングの効果が得られるため、トリミングとスケーリングに使用される方法は同じです
リーリー
効果:一般的なアプリケーションでは、アプリケーションのアバターを変更するときに、アバターが大きすぎる場合にトリミングを使用して、シミュレーションの実装を行うことができます。
4. 画像の回転
图片旋转也十分常见,主要用到函数imagerotate,原型:resource imagerotate ( resource $image , float $angle , int $bgd_color [, int $ignore_transparent = 0 ] ),第一个参数是待旋转图像句柄,第二个参数angle 是旋转的角度数值,第三个参数指定一个颜色,即当旋转后出现空的地方是使用哪种颜色填充,第四个参数是指定一个透明色,默认0表示保留透明色。该方法返回一个新的图像句柄,就是经过旋转后的图像资源变量,将它绘制保存即可。还要注意的是,旋转的角度可以指定0到360之间,为逆时针旋转,以jpg为例:
<?<span>php date_default_timezone_set(</span>'Asia/Shanghai'<span>); </span><span>define</span>('DS',<span> DIRECTORY_SEPARATOR); </span><span>/*</span><span>* * 图片旋转 * @param angular 旋转角度值 0-360 </span><span>*/</span> <span>function</span> rotatePic(<span>$srcFile</span> = '', <span>$angular</span> = 0, <span>$dstFile</span> = ''<span>) { </span><span>if</span>(!<span>file_exists</span>(<span>$srcFile</span><span>)) { </span><span>echo</span> 'file not exists<br/>'<span>; </span><span>return</span> <span>false</span><span>; } </span><span>$srcImg</span> = imagecreatefromjpeg(<span>$srcFile</span><span>); </span><span>//</span><span> 处理保存文件地址</span> <span>$fileinfo</span> = <span>pathinfo</span>(<span>$srcFile</span><span>); </span><span>if</span>(<span>empty</span>(<span>$dstFile</span><span>)) { </span><span>$dstFile</span> = <span>rtrim</span>(<span>$fileinfo</span>['dirname'], DS).DS.'rotate_'.<span>$fileinfo</span>['filename'].<span>date</span>('YmdHis').<span>mt_rand</span>(1, 1000).'.jpeg'<span>; } </span><span>$white</span> = imagecolorallocate(<span>$srcImg</span>, 0xff, 0xff, 0xf1<span>); </span><span>//</span><span> 执行旋转,注意是逆时针方向</span> <span>$dstImg</span> = imagerotate(<span>$srcImg</span>, <span>$angular</span>, <span>$white</span><span>); </span><span>//</span><span> 画到画布,保存文件</span> imagejpeg(<span>$dstImg</span>, <span>$dstFile</span><span>); imagedestroy(</span><span>$dstImg</span><span>); imagedestroy(</span><span>$srcImg</span><span>); </span><span>return</span> <span>true</span><span>; } </span><span>//</span><span> 测试</span> <span>$srcFile</span> = 'G:\wamp\www\html\image\p219.jpg'<span>; rotatePic(</span><span>$srcFile</span>, 220);
效果:原图 旋转后
5. 图片翻转
这个在应用中不那么常见。所谓翻转,就是对图像进行镜面翻转,比如以图片中间竖直线为轴线,左边换到右边,右边换到左边,对调一下位置,就是左右翻转。想象一下,以中间竖直线为对称轴的情况,Y轴像素点不变,X轴上的像素点左右对调,仍可以使用imagecopy方法,对于源文件,在复制到目标图像时,进行这个操作,以绕Y轴旋转,jpg类型图片为例
<?<span>php </span><span>//</span><span> 图片翻转</span> date_default_timezone_set('Asia/Shanghai'<span>); </span><span>define</span>('DS',<span> DIRECTORY_SEPARATOR); </span><span>//</span><span> 沿Y轴翻转,x坐标值对调</span> <span>function</span> turnY(<span>$srcFile</span> = '', <span>$dstFile</span> = ''<span>) { </span><span>if</span>(!<span>file_exists</span>(<span>$srcFile</span><span>)) { </span><span>return</span> <span>false</span><span>; } </span><span>//</span><span> 原图像句柄和宽高获取</span> <span>$srcImg</span> = imagecreatefromjpeg(<span>$srcFile</span><span>); </span><span>$srcWidth</span> = imagesx(<span>$srcImg</span><span>); </span><span>$srcHeight</span> = imagesy(<span>$srcImg</span><span>); </span><span>$dstImg</span> = imagecreatetruecolor(<span>$srcWidth</span>, <span>$srcHeight</span><span>); </span><span>//</span><span> 沿Y轴翻转,x轴上的像素点左右对调</span> <span>for</span>(<span>$i</span> = 0; <span>$i</span> < <span>$srcWidth</span>; <span>$i</span>++<span>) { imagecopy(</span><span>$dstImg</span>, <span>$srcImg</span>, <span>$srcWidth</span>-<span>$i</span>-1, 0, <span>$i</span>, 0, 1, <span>$srcHeight</span><span>); } </span><span>//</span><span> 画像保存路径处理</span> <span>$fileinfo</span> = <span>pathinfo</span>(<span>$srcFile</span><span>); </span><span>if</span>(<span>empty</span>(<span>$dstFile</span><span>)) { </span><span>$dstFile</span> = <span>rtrim</span>(<span>$fileinfo</span>['dirname'], DS).DS.'turnx_'.<span>$fileinfo</span>['filename'].<span>date</span>('YmdHis').<span>mt_rand</span>(1, 1000).'.jpeg'<span>; } </span><span>//</span><span> 绘制图像,保存文件</span> imagejpeg(<span>$dstImg</span>, <span>$dstFile</span><span>); imagedestroy(</span><span>$dstImg</span><span>); imagedestroy(</span><span>$srcImg</span><span>); </span><span>return</span> <span>false</span><span>; } </span><span>//</span><span> 测试</span> <span>$srcFile</span> = 'G:\wamp\www\html\image\p311.jpg'<span>; turnY(</span><span>$srcFile</span>);
效果: 翻转前 翻转后
主要就是for循环那儿,得到源文件的宽度$srcWidth后,如果源文件上坐标是($i, 0)则对应目标图像上坐标($srcWidth-$i-1, 0),然后将宽度为1个像素,高为源文件整个高度$srcHeight的资源复制过去,循环完成后就全部复制到一个图片上了,相当于是一条一条线的画过去的。
无意浏览手册感觉被坑,看到imageflip函数猜到是这个功能,一看果然是的,可是看的书已经落后几年了,原型:bool imageflip ( resource $image , int $mode ),第一个参数是目标图像资源,第二个参数是翻转的方式,使用php自带的枚举变量即可,有IMG_FLIP_HORIZONTAL(水平)、IMG_FLIP_HORIZONTAL(竖直)、IMG_FLIP_BOTH(水平竖直)三种方式,一个函数即可实现。
反正都挺简单,不如练练手玩玩 :-D