给骨头系统开发的图像库的 imagick 部分 ,支持 gif , 完美支持裁切、生成缩略图、添加水印 。
支持按方位生成缩略图像, 如:
// 把左上角优先 $image->resize_to(100, 100, 'north_west'); // 右边优先 $image->resize_to(100, 100, 'east'); ...
更多参数看源代码
原图
效果图:
调用方式:
include 'imagick.class.php'; $image = new lib_image_imagick(); $image->open('a.gif'); $image->resize_to(100, 100, 'scale_fill'); $image->add_text('1024i.com', 10, 20); $image->add_watermark('1024i.gif', 10, 50); $image->save_to('x.gif');
imagick.class.php
<?php /* @版本日期: 版本日期: 2012年1月18日 @著作权所有: 1024 intelligence ( http://www.1024i.com ) 获得使用本类库的许可, 您必须保留著作权声明信息. 报告漏洞,意见或建议, 请联系 Lou Barnes(iua1024@gmail.com) */ class lib_image_imagick { private $image = null; private $type = null; // 构造函数 public function __construct(){} // 析构函数 public function __destruct() { if($this->image!==null) $this->image->destroy(); } // 载入图像 public function open($path) { $this->image = new Imagick( $path ); if($this->image) { $this->type = strtolower($this->image->getImageFormat()); } return $this->image; } public function crop($x=0, $y=0, $width=null, $height=null) { if($width==null) $width = $this->image->getImageWidth()-$x; if($height==null) $height = $this->image->getImageHeight()-$y; if($width<=0 || $height<=0) return; if($this->type=='gif') { $image = $this->image; $canvas = new Imagick(); $images = $image->coalesceImages(); foreach($images as $frame){ $img = new Imagick(); $img->readImageBlob($frame); $img->cropImage($width, $height, $x, $y); $canvas->addImage( $img ); $canvas->setImageDelay( $img->getImageDelay() ); $canvas->setImagePage($width, $height, 0, 0); } $image->destroy(); $this->image = $canvas; } else { $this->image->cropImage($width, $height, $x, $y); } } /* * 更改图像大小 $fit: 适应大小方式 'force': 把图片强制变形成 $width X $height 大小 'scale': 按比例在安全框 $width X $height 内缩放图片, 输出缩放后图像大小 不完全等于 $width X $height 'scale_fill': 按比例在安全框 $width X $height 内缩放图片,安全框内没有像素的地方填充色, 使用此参数时可设置背景填充色 $bg_color = array(255,255,255)(红,绿,蓝, 透明度) 透明度(0不透明-127完全透明)) 其它: 智能模能 缩放图像并载取图像的中间部分 $width X $height 像素大小 $fit = 'force','scale','scale_fill' 时: 输出完整图像 $fit = 图像方位值 时, 输出指定位置部分图像 字母与图像的对应关系如下: north_west north north_east west center east south_west south south_east */ public function resize_to($width = 100, $height = 100, $fit = 'center', $fill_color = array(255,255,255,0) ) { switch($fit) { case 'force': if($this->type=='gif') { $image = $this->image; $canvas = new Imagick(); $images = $image->coalesceImages(); foreach($images as $frame){ $img = new Imagick(); $img->readImageBlob($frame); $img->thumbnailImage( $width, $height, false ); $canvas->addImage( $img ); $canvas->setImageDelay( $img->getImageDelay() ); } $image->destroy(); $this->image = $canvas; } else { $this->image->thumbnailImage( $width, $height, false ); } break; case 'scale': if($this->type=='gif') { $image = $this->image; $images = $image->coalesceImages(); $canvas = new Imagick(); foreach($images as $frame){ $img = new Imagick(); $img->readImageBlob($frame); $img->thumbnailImage( $width, $height, true ); $canvas->addImage( $img ); $canvas->setImageDelay( $img->getImageDelay() ); } $image->destroy(); $this->image = $canvas; } else { $this->image->thumbnailImage( $width, $height, true ); } break; case 'scale_fill': $size = $this->image->getImagePage(); $src_width = $size['width']; $src_height = $size['height']; $x = 0; $y = 0; $dst_width = $width; $dst_height = $height; if($src_width*$height > $src_height*$width) { $dst_height = intval($width*$src_height/$src_width); $y = intval( ($height-$dst_height)/2 ); } else { $dst_width = intval($height*$src_width/$src_height); $x = intval( ($width-$dst_width)/2 ); } $image = $this->image; $canvas = new Imagick(); $color = 'rgba('.$fill_color[0].','.$fill_color[1].','.$fill_color[2].','.$fill_color[3].')'; if($this->type=='gif') { $images = $image->coalesceImages(); foreach($images as $frame) { $frame->thumbnailImage( $width, $height, true ); $draw = new ImagickDraw(); $draw->composite($frame->getImageCompose(), $x, $y, $dst_width, $dst_height, $frame); $img = new Imagick(); $img->newImage($width, $height, $color, 'gif'); $img->drawImage($draw); $canvas->addImage( $img ); $canvas->setImageDelay( $img->getImageDelay() ); $canvas->setImagePage($width, $height, 0, 0); } } else { $image->thumbnailImage( $width, $height, true ); $draw = new ImagickDraw(); $draw->composite($image->getImageCompose(), $x, $y, $dst_width, $dst_height, $image); $canvas->newImage($width, $height, $color, $this->get_type() ); $canvas->drawImage($draw); $canvas->setImagePage($width, $height, 0, 0); } $image->destroy(); $this->image = $canvas; break; default: $size = $this->image->getImagePage(); $src_width = $size['width']; $src_height = $size['height']; $crop_x = 0; $crop_y = 0; $crop_w = $src_width; $crop_h = $src_height; if($src_width*$height > $src_height*$width) { $crop_w = intval($src_height*$width/$height); } else { $crop_h = intval($src_width*$height/$width); } switch($fit) { case 'north_west': $crop_x = 0; $crop_y = 0; break; case 'north': $crop_x = intval( ($src_width-$crop_w)/2 ); $crop_y = 0; break; case 'north_east': $crop_x = $src_width-$crop_w; $crop_y = 0; break; case 'west': $crop_x = 0; $crop_y = intval( ($src_height-$crop_h)/2 ); break; case 'center': $crop_x = intval( ($src_width-$crop_w)/2 ); $crop_y = intval( ($src_height-$crop_h)/2 ); break; case 'east': $crop_x = $src_width-$crop_w; $crop_y = intval( ($src_height-$crop_h)/2 ); break; case 'south_west': $crop_x = 0; $crop_y = $src_height-$crop_h; break; case 'south': $crop_x = intval( ($src_width-$crop_w)/2 ); $crop_y = $src_height-$crop_h; break; case 'south_east': $crop_x = $src_width-$crop_w; $crop_y = $src_height-$crop_h; break; default: $crop_x = intval( ($src_width-$crop_w)/2 ); $crop_y = intval( ($src_height-$crop_h)/2 ); } $image = $this->image; $canvas = new Imagick(); if($this->type=='gif') { $images = $image->coalesceImages(); foreach($images as $frame){ $img = new Imagick(); $img->readImageBlob($frame); $img->cropImage($crop_w, $crop_h, $crop_x, $crop_y); $img->thumbnailImage( $width, $height, true ); $canvas->addImage( $img ); $canvas->setImageDelay( $img->getImageDelay() ); $canvas->setImagePage($width, $height, 0, 0); } } else { $image->cropImage($crop_w, $crop_h, $crop_x, $crop_y); $image->thumbnailImage( $width, $height, true ); $canvas->addImage( $image ); $canvas->setImagePage($width, $height, 0, 0); } $image->destroy(); $this->image = $canvas; } } // 添加水印图片 public function add_watermark($path, $x = 0, $y = 0) { $watermark = new Imagick($path); $draw = new ImagickDraw(); $draw->composite($watermark->getImageCompose(), $x, $y, $watermark->getImageWidth(), $watermark->getimageheight(), $watermark); if($this->type=='gif') { $image = $this->image; $canvas = new Imagick(); $images = $image->coalesceImages(); foreach($image as $frame) { $img = new Imagick(); $img->readImageBlob($frame); $img->drawImage($draw); $canvas->addImage( $img ); $canvas->setImageDelay( $img->getImageDelay() ); } $image->destroy(); $this->image = $canvas; } else { $this->image->drawImage($draw); } } // 添加水印文字 public function add_text($text, $x = 0 , $y = 0, $angle=0, $style=array()) { $draw = new ImagickDraw(); if(isset($style['font'])) $draw->setFont($style['font']); if(isset($style['font_size'])) $draw->setFontSize($style['font_size']); if(isset($style['fill_color'])) $draw->setFillColor($style['fill_color']); if(isset($style['under_color'])) $draw->setTextUnderColor($style['under_color']); if($this->type=='gif') { foreach($this->image as $frame) { $frame->annotateImage($draw, $x, $y, $angle, $text); } } else { $this->image->annotateImage($draw, $x, $y, $angle, $text); } } // 保存到指定路径 public function save_to( $path ) { if($this->type=='gif') { $this->image->writeImages($path, true); } else { $this->image->writeImage($path); } } // 输出图像 public function output($header = true) { if($header) header('Content-type: '.$this->type); echo $this->image->getImagesBlob(); } public function get_width() { $size = $this->image->getImagePage(); return $size['width']; } public function get_height() { $size = $this->image->getImagePage(); return $size['height']; } // 设置图像类型, 默认与源类型一致 public function set_type( $type='png' ) { $this->type = $type; $this->image->setImageFormat( $type ); } // 获取源图像类型 public function get_type() { return $this->type; } // 当前对象是否为图片 public function is_image() { if( $this->image ) return true; else return false; } public function thumbnail($width = 100, $height = 100, $fit = true){ $this->image->thumbnailImage( $width, $height, $fit );} // 生成缩略图 $fit为真时将保持比例并在安全框 $width X $height 内生成缩略图片 /* 添加一个边框 $width: 左右边框宽度 $height: 上下边框宽度 $color: 颜色: RGB 颜色 'rgb(255,0,0)' 或 16进制颜色 '#FF0000' 或颜色单词 'white'/'red'... */ public function border($width, $height, $color='rgb(220, 220, 220)') { $color=new ImagickPixel(); $color->setColor($color); $this->image->borderImage($color, $width, $height); } public function blur($radius, $sigma){$this->image->blurImage($radius, $sigma);} // 模糊 public function gaussian_blur($radius, $sigma){$this->image->gaussianBlurImage($radius, $sigma);} // 高斯模糊 public function motion_blur($radius, $sigma, $angle){$this->image->motionBlurImage($radius, $sigma, $angle);} // 运动模糊 public function radial_blur($radius){$this->image->radialBlurImage($radius);} // 径向模糊 public function add_noise($type=null){$this->image->addNoiseImage($type==null?imagick::NOISE_IMPULSE:$type);} // 添加噪点 public function level($black_point, $gamma, $white_point){$this->image->levelImage($black_point, $gamma, $white_point);} // 调整色阶 public function modulate($brightness, $saturation, $hue){$this->image->modulateImage($brightness, $saturation, $hue);} // 调整亮度、饱和度、色调 public function charcoal($radius, $sigma){$this->image->charcoalImage($radius, $sigma);} // 素描 public function oil_paint($radius){$this->image->oilPaintImage($radius);} // 油画效果 public function flop(){$this->image->flopImage();} // 水平翻转 public function flip(){$this->image->flipImage();} // 垂直翻转 }

PHPは、現代のWeb開発、特にコンテンツ管理とeコマースプラットフォームで依然として重要です。 1)PHPには、LaravelやSymfonyなどの豊富なエコシステムと強力なフレームワークサポートがあります。 2)パフォーマンスの最適化は、Opcacheとnginxを通じて達成できます。 3)PHP8.0は、パフォーマンスを改善するためにJITコンパイラを導入します。 4)クラウドネイティブアプリケーションは、DockerおよびKubernetesを介して展開され、柔軟性とスケーラビリティを向上させます。

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。

PHPとPythonにはそれぞれ独自の利点があり、さまざまなシナリオに適しています。 1.PHPはWeb開発に適しており、組み込みのWebサーバーとRich Functionライブラリを提供します。 2。Pythonは、簡潔な構文と強力な標準ライブラリを備えたデータサイエンスと機械学習に適しています。選択するときは、プロジェクトの要件に基づいて決定する必要があります。

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

PHPが多くのWebサイトよりも優先テクノロジースタックである理由には、その使いやすさ、強力なコミュニティサポート、広範な使用が含まれます。 1)初心者に適した学習と使用が簡単です。 2)巨大な開発者コミュニティと豊富なリソースを持っています。 3)WordPress、Drupal、その他のプラットフォームで広く使用されています。 4)Webサーバーとしっかりと統合して、開発の展開を簡素化します。

PHPは、特にWeb開発の分野で、最新のプログラミングで強力で広く使用されているツールのままです。 1)PHPは使いやすく、データベースとシームレスに統合されており、多くの開発者にとって最初の選択肢です。 2)動的コンテンツ生成とオブジェクト指向プログラミングをサポートし、Webサイトを迅速に作成および保守するのに適しています。 3)PHPのパフォーマンスは、データベースクエリをキャッシュおよび最適化することで改善でき、その広範なコミュニティと豊富なエコシステムにより、今日のテクノロジースタックでは依然として重要になります。

PHPでは、弱い参照クラスを通じて弱い参照が実装され、ガベージコレクターがオブジェクトの回収を妨げません。弱い参照は、キャッシュシステムやイベントリスナーなどのシナリオに適しています。オブジェクトの生存を保証することはできず、ごみ収集が遅れる可能性があることに注意する必要があります。

\ _ \ _ Invokeメソッドを使用すると、オブジェクトを関数のように呼び出すことができます。 1。オブジェクトを呼び出すことができるように\ _ \ _呼び出しメソッドを定義します。 2。$ obj(...)構文を使用すると、PHPは\ _ \ _ Invokeメソッドを実行します。 3。ロギングや計算機、コードの柔軟性の向上、読みやすさなどのシナリオに適しています。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

Dreamweaver Mac版
ビジュアル Web 開発ツール

WebStorm Mac版
便利なJavaScript開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。
