国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

php中如何使用ImageMagick生成base64圖片(代碼)

2020-03-24 18:12:24
字體:
供稿:網(wǎng)友
本篇文章給大家?guī)淼膬?nèi)容是關(guān)于php中如何使用ImageMagick生成base64圖片(代碼) ,有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。

最近的PHP項(xiàng)目中,需要用到畫圖和圖片拼接效果,這里是一些開發(fā)過程里用到的一些點(diǎn)還有就是一些踩過的坑。通過ImageMagick生成base64圖片格式,為前端所使用。

一些需要的知識(shí)點(diǎn)

PHP將圖片轉(zhuǎn)base64編碼以及base64圖片轉(zhuǎn)換為圖片并保存代碼

圖片轉(zhuǎn)base64編碼

/*圖片轉(zhuǎn)換為 base64格式編碼*/$img = 'uploads/about.png';$base64_img = base64EncodeImage($img);echo '<img src="' . $base64_img . '" />'; 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圖片轉(zhuǎn)換為圖片并保存

/*  base64格式編碼轉(zhuǎn)換為圖片并保存對(duì)應(yīng)文件夾 */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)){            //檢查是否有該文件夾,如果沒有就創(chuàng)建,并給予最高權(quán)限            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個(gè)字符來表示任意二進(jìn)制數(shù)據(jù)的方法。
Base64的原理很簡單,首先,準(zhǔn)備一個(gè)包含64個(gè)字符的數(shù)組:

['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/']
然后,對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行處理,每3個(gè)字節(jié)一組,一共是3x8=24bit,劃為4組,每組正好6個(gè)bit

如果要編碼的二進(jìn)制數(shù)據(jù)不是3的倍數(shù),最后會(huì)剩下1個(gè)或2個(gè)字節(jié)怎么辦?Base64用x00字節(jié)在末尾補(bǔ)足后,再在編碼的末尾加上1個(gè)或2個(gè)=號(hào),表示補(bǔ)了多少字節(jié),解碼的時(shí)候,會(huì)自動(dòng)去掉。

使用jpg圖片體積要比png小
使用PHP的Imagick類進(jìn)行圖像的操作

Imagick具體操作

(1).創(chuàng)建一個(gè)底圖,寬750px,高1046px,白色背景,格式為jpg的圖片

// 初始化一個(gè)畫板        $img =new Imagick();        $img->newImage(750,1046,'white','jpg') ;

(2).在底圖上添加需求圖片

前提是我們已經(jīng)知道了需要合并的圖片鏈接地址

$item_img='https://img.alicdn.com/bao/uploaded/i1/1750208593/TB1rgM3hhtnkeRjSZSgXXXAuXXa_!!0-item_pic.jpg'第一步:實(shí)例化圖片$imgtwo = new Imagick($item_img);第二步:設(shè)置添加圖片的大小$imgtwo->resizeImage(750,764,Imagick::FILTER_LANCZOS,1);關(guān)于resizeImage參數(shù)說明    bool Imagick::resizeImage ( int $columns , int $rows , int $filter , float $blur [, bool $bestfit = false ] )參數(shù):  ● columns 圖片的寬度  ● rows 圖片高度  ● filter 過濾器,用于過濾圖片,有高斯filte根據(jù)情況而定  ● 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 ] )參數(shù):  ● composite_object :用于合并的圖片的Imagick對(duì)象  ● composite:合并操作,定義操作常量。 具體請(qǐng)查看 合并操作常量列表  ● x:相對(duì)圖像頂點(diǎn)左上位置(0,0)的橫坐標(biāo)  ● y:相對(duì)圖像頂點(diǎn)左上位置(0,0)的縱坐標(biāo)  ● channel:通過傳入一個(gè)通道常量,來開啟通道模式。為了支持多個(gè)通道,可以通過二進(jìn)制運(yùn)算的操作來合并多個(gè)通道常量。到這里就可以得到一個(gè)合并的圖片了1、加一個(gè)header信息,可以直接在網(wǎng)頁上查看圖片    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;    //要生成的圖片的路徑,隨機(jī)生成圖片名稱

(3).圖片上拼接文字

寫入文字以添加店鋪文字為例,逐步完成文字的寫入。

    $shop_title='測(cè)試店鋪';    // 添加店鋪文字    $drawQr = new ImagickDraw(); // 實(shí)例化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);  // 畫在地板上

詳細(xì)解讀:

1、實(shí)例化ImagickDraw類:

$drawQr = new ImagickDraw();

2、設(shè)置字體顏色

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

3、設(shè)置字體大小

$drawQr -> setFontSize('24');

4、設(shè)置字體格式

$drawQr -> setFont('../../conf/Microsoftyahei.ttf');

5、設(shè)置字體方向

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

ps: Imagick::ALIGN_RIGHT 朝右邊 Imagick::ALIGN_LEFT 左邊 Imagick::ALIGN_CENTER 中間

6、設(shè)置字體編碼

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

7、畫出文字

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

8、在底圖上寫入字體

$img -> drawImage($drawQr);

寫入文字這個(gè)地方的一些坑:

沒有設(shè)置字體格式時(shí),中文字會(huì)解析錯(cuò)誤
(英文沒有問題)

1194728351-5b9a125260081_articlex.png

(漢字解析失敗)

1919625869-5b9a12527be91_articlex.png

(設(shè)置字體格式正常顯示)

4066479041-5b9a1252748db_articlex.png

(4).圖片base64導(dǎo)出

最終得到的圖片我們組要以base64的格式傳遞給前端,進(jìn)行以下操作,把我們最后拼接的到的圖片base64轉(zhuǎn)換輸出。

    $dest_img='/data/tmp/' . md5(microtime(true)).'.'.$type; //要生成的圖片的路徑    $Return = array();    // *圖片轉(zhuǎn)換為 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數(shù)據(jù)里包含有'/r/n'回車字符,需要特殊處理才可以正確顯示圖片。

2665486350-5b9a1253b1c6e_articlex.png

最后會(huì)得到的合并圖片,可以調(diào)整拼接圖片大小得到不同的圖片。

相關(guān)推薦:

圖片上傳并使用ImageMagick生成縮略圖

php實(shí)現(xiàn)圖片上傳并利用ImageMagick生成縮略圖,

以上就是php中如何使用ImageMagick生成base64圖片(代碼)的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注 其它相關(guān)文章!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 五指山市| 青阳县| 卓尼县| 娄底市| 巴林左旗| 泌阳县| 万山特区| 布拖县| 比如县| 东乌珠穆沁旗| 鹿泉市| 班戈县| 崇州市| 马龙县| 波密县| 临颍县| 平度市| 定边县| 嘉峪关市| 华蓥市| 利津县| 高陵县| 天镇县| 木里| 高安市| 信丰县| 额敏县| 杭州市| 灵川县| 葵青区| 界首市| 民权县| 邵阳市| 仁寿县| 南江县| 金寨县| 武鸣县| 阜城县| 郎溪县| 文登市| 双牌县|