ホームページ  >  記事  >  バックエンド開発  >  ImageMagick を使用して PHP で Base64 画像を生成する方法 (コード)

ImageMagick を使用して PHP で Base64 画像を生成する方法 (コード)

不言
不言オリジナル
2018-09-13 17:34:073960ブラウズ

この記事の内容は、PHP で ImageMagick を使用して Base64 の画像 (コード) を生成する方法に関するもので、一定の参考価値があります。必要な友人が参照することができます。お役に立てれば幸いです。

最近の PHP プロジェクトでは、描画や画像の継ぎ合わせ効果を使用する必要がありますが、開発プロセスで使用されるいくつかのポイントと遭遇した落とし穴をいくつか紹介します。フロントエンドで使用するために、ImageMagick を通じて Base64 画像形式を生成します。

いくつかの必要な知識ポイント

PHP は画像を Base64 エンコードに変換し、Base64 画像を画像に変換してコードを保存します

画像を Base64 エンコードに変換します

/*图片转换为 base64格式编码*/
$img = 'uploads/about.png';
$base64_img = base64EncodeImage($img);
echo '<img  alt="ImageMagick を使用して PHP で Base64 画像を生成する方法 (コード)" >';
 
function base64EncodeImage ($image_file) {
    $base64_image = '';
    $image_info = getimagesize($image_file);
    $image_data = fread(fopen($image_file, 'r'), filesize($image_file));
    $base64_image = 'data:' . $image_info['mime'] . ';base64,' . chunk_split(base64_encode($image_data));
    return $base64_image;
}

base64 ピクチャはピクチャに変換されて保存されます

/*  base64格式编码转换为图片并保存对应文件夹 */
function base64_image_content($base64_image_content,$path){
    //匹配出图片的格式
    if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)){
        $type = $result[2];
        $new_file = $path."/".date('Ymd',time())."/";
        if(!file_exists($new_file)){
            //检查是否有该文件夹,如果没有就创建,并给予最高权限
            mkdir($new_file, 0700);
        }
        $new_file = $new_file.time().".{$type}";
        if (file_put_contents($new_file, base64_decode(str_replace($result[1], '', $base64_image_content)))){
            return '/'.$new_file;
        }else{
            return false;
        }
    }else{
        return false;
    }
}
 
echo base64_image_content($base64_img,"uploads/");

base64

Base64 は、64 文字を使用して任意のバイナリ データを表現する方法です。
Base64 の原理は非常に単純で、まず 64 文字を含む配列を用意します:

['A', 'B', 'C', ... 'a', ' b', 'c', ... '0', '1', ... ' ', '/']
次に、バイナリ データが 3 バイトごとに処理され、合計は 3x8=24 ビットで、4 つのグループに分割され、各グループはちょうど 6 ビットです。

エンコードされるバイナリ データが 3 の倍数ではなく、最後に 1 バイトまたは 2 バイトが残る場合はどうなるでしょうか? Base64 が末尾を x00 バイトでパディングした後、エンコードの最後に 1 または 2 = 記号を追加して、パディングされるバイト数を示します。これはデコード中に自動的に削除されます。

png よりも小さい jpg 画像を使用する
PHP の Imagick クラスを使用して画像を操作する

Imagick 固有の操作

(1). ベース マップ、画像を作成する幅 750 ピクセル、高さ 1046 ピクセル、背景が白、jpg 形式の

// 初始化一个画板
        $img =new Imagick();
        $img->newImage(750,1046,'white','jpg') ;

(2)。既にわかっている場合、必要な画像をベース マップ

に追加します。結合する必要がある画像のリンク アドレス

$item_img='https://img.alicdn.com/bao/uploaded/i1/1750208593/TB1rgM3hhtnkeRjSZSgXXXAuXXa_!!0-item_pic.jpg'

第一步:实例化图片
$imgtwo = new Imagick($item_img);

第二步:设置添加图片的大小
$imgtwo->resizeImage(750,764,Imagick::FILTER_LANCZOS,1);

关于resizeImage参数说明
    bool Imagick::resizeImage ( int $columns , int $rows , int $filter , float $blur [, bool $bestfit = false ] )

参数:
  ● columns 图片的宽度
  ● rows 图片高度
  ● filter 过滤器,用于过滤图片,有高斯filte根据情况而定
  ● blur blur=1 为虚化, blur =-1 为锐化

第三步:与底图合并
$img->compositeImage($imgtwo,$imgtwo->getImageCompose(),0,0);

使用compositeImage();
    bool Imagick::compositeImage ( Imagick $composite_object , int $composite , int $x , int $y [, int $channel = Imagick::CHANNEL_ALL ] )

参数:
  ● composite_object :用于合并的图片的Imagick对象
  ● composite:合并操作,定义操作常量。 具体请查看 合并操作常量列表
  ● x:相对图像顶点左上位置(0,0)的横坐标
  ● y:相对图像顶点左上位置(0,0)的纵坐标
  ● channel:通过传入一个通道常量,来开启通道模式。为了支持多个通道,可以通过二进制运算的操作来合并多个通道常量。

到这里就可以得到一个合并的图片了
1、加一个header信息,可以直接在网页上查看图片
    header("Content-Type: img/png");
    echo $img;
2、可以把图片在指定目录中生成,在指定目录下生成为img.png
    $file="./img.png";
    $img->writeImage($file);


我这里是这样处理:
    header ( 'Content-type: ' . strtolower ($img->getImageFormat ()) );
    $type = strtolower($img->getImageFormat());
    $dest_img='/data/tmp/' . md5(microtime(true)).'.'.$type;    //要生成的图片的路径,随机生成图片名称

(3). 画像にテキストを結合する

テキストの書き込み ストア テキストの追加を例として、徐々にテキストの書き込みを完了します。

    $shop_title='测试店铺';
    // 添加店铺文字
    $drawQr = new ImagickDraw(); // 实例化ImagickDraw
    $drawQr -> setFillColor(new ImagickPixel('#999999')); // 颜色
    $drawQr -> setFontSize('24'); // 大小
    $drawQr -> setFont('../../conf/Microsoftyahei.ttf'); // 字体
    $drawQr -> setTextAlignment(Imagick::ALIGN_LEFT); // 字体方向
    // ps: Imagick::ALIGN_RIGHT 朝右边    Imagick::ALIGN_LEFT 左边   Imagick::ALIGN_CENTER 中间
    $drawQr -> setTextEncoding("utf-8"); // 字体编码
    $drawQr -> annotation(114,990,$shop_title); // 画出文字
    $img -> drawImage($drawQr);  // 画在地板上

詳細な解釈:

1. ImagickDraw クラスのインスタンス化:

$drawQr = new ImagickDraw();

2. フォントの色の設定

$drawQr -> setFillColor(new ImagickPixel(&#39;#999999&#39;));

3. フォント サイズの設定

$drawQr -> setFontSize(&#39;24&#39;);

4. フォント形式を設定します

$drawQr -> setFont(&#39;../../conf/Microsoftyahei.ttf&#39;);

5. フォント方向を設定します

$draw->setTextAlignment(Imagick::ALIGN_RIGHT);

ps: Imagick::ALIGN_RIGHT を右に Imagick::ALIGN_LEFT を左に Imagick: :ALIGN_CENTER (中央)

6. フォントエンコーディングを設定します

$drawQr -> setTextEncoding("utf-8");

7. テキストを描画します

$drawQr -> annotation(114,990,$shop_title);

8. ベースマップにフォントを書き込みます

$img -> drawImage($drawQr);

テキストの書き込み ここでの落とし穴 :

フォント形式が設定されていない場合、中国語の文字が正しく解析されません
(英語では問題ありません)

ImageMagick を使用して PHP で Base64 画像を生成する方法 (コード) ## (漢字解析失敗)

ImageMagick を使用して PHP で Base64 画像を生成する方法 (コード)#(通常表示するフォント形式の設定)

ImageMagick を使用して PHP で Base64 画像を生成する方法 (コード)(4). イメージのエクスポートbase64

私たちのグループがbase64形式でフロントエンドに渡す必要がある最終イメージ。以下を実行します。最終的に結合された画像を Base64 に変換して出力する操作。

    $dest_img='/data/tmp/' . md5(microtime(true)).'.'.$type; //要生成的图片的路径
    $Return = array();
    // *图片转换为 base64格式编码*
    $base64_image = '';
    $image_info = getimagesize($dest_img);
    $image_data = fread(fopen($dest_img, 'r'), filesize($dest_img));
    $base64_image = 'data:' . $image_info['mime'] . ';base64,' . chunk_split(base64_encode($image_data));
    $Return['data']=$base64_image;
    return  $Return;

$base64_image

は、base64 形式の画像です。

フロントエンドによって取得されたbase64データには'\r\n'

キャリッジリターン文字が含まれており、画像を正しく表示するには特別な処理が必要であることに注意してください。

ImageMagick を使用して PHP で Base64 画像を生成する方法 (コード)最終的に結合された画像が得られます。結合された画像のサイズを調整して、別の画像を取得することができます。

関連する推奨事項:

画像をアップロードし、ImageMagick を使用してサムネイルを生成する


php を使用して画像をアップロードし、使用しますImageMagick はサムネイルを生成します、

以上がImageMagick を使用して PHP で Base64 画像を生成する方法 (コード)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。