摘要:指定字體和顏色創(chuàng)建一個(gè)底圖創(chuàng)建一個(gè)白色的底圖,我們可以在上面繪制文字創(chuàng)建一個(gè)底圖并且加上一些文字要生成的圖片的路徑可以在服務(wù)器端看到這里需要注意一下文字的繪制命令順序,否則會(huì)出現(xiàn)沒(méi)有生效的問(wèn)題。
[原文鏈接]https://duanruilong.github.io...://duanruilong.github.io/blog/2018/09/18/%E5%9C%A8PHP%E9%87%8C%E5%BE%88%E5%A5%BD%E7%9A%84%E4%BD%BF%E7%94%A8ImageMagick-convert%E7%AF%87/)
ImageMagick 包括一組命令行工具來(lái)操作圖片,之前的ImageMagick實(shí)現(xiàn)base64圖片的邏輯在服務(wù)器端可能會(huì)造成溢出的事故,所以在接下的文章里會(huì)介紹另外一種好的實(shí)現(xiàn)方式就是----convert命令。使用命令格式的形式去生成圖片和大小的裁剪數(shù)據(jù)格式的轉(zhuǎn)換。
基本命令與格式 1、基本命令magick: 創(chuàng)建、編輯圖像,轉(zhuǎn)換圖像格式,以及調(diào)整圖像大小、模糊、裁切、除去雜點(diǎn)、抖動(dòng) ( dither )、繪圖、翻轉(zhuǎn)、合并、重新采樣等。
convert: 等同于 magick 命令。
identify: 輸出一個(gè)或多個(gè)圖像文件的格式和特征信息,如分辨率、大小、尺寸、色彩空間等。
mogrify: 與 magick 功能一樣,不過(guò)不需要指定輸出文件,自動(dòng)覆蓋原始圖像文件。
composite: 將一個(gè)圖片或多個(gè)圖片組合成新圖片。
montage: 組合多個(gè)獨(dú)立的圖像來(lái)創(chuàng)建合成圖像。每個(gè)圖像都可以用邊框,透明度等特性進(jìn)行裝飾。
compare: 從數(shù)學(xué)和視覺(jué)角度比較源圖像與重建圖像之間的差異。
display: 在任何 X server 上顯示一個(gè)圖像或圖像序列。
animate: 在任何 X server 上顯示圖像序列。
import: 保存 X server 上的任何可見(jiàn)窗口并把它作為圖像文件輸出。可以捕捉單個(gè)窗口,整個(gè)屏幕或屏幕的任意矩形部分。
conjure: 解釋并執(zhí)行 MSL ( Magick Scripting Language ) 寫(xiě)的腳本。
stream: 一個(gè)輕量級(jí)工具,用于將圖像或部分圖像的一個(gè)或多個(gè)像素組件流式傳輸?shù)酱鎯?chǔ)設(shè)備。在處理大圖像或原始像素組件時(shí)很有用。
2、命令格式基本命令的使用,遵循 Unix 風(fēng)格的標(biāo)準(zhǔn)格式,例如 command [options] input_image output_image
將一張寬高 300x300 的圖片 goods.png 轉(zhuǎn)換成 200x200 的goods.jpg,可以這樣用
convert -resize 200x200 goods.png goods.jpg開(kāi)始繪制生成圖片 一些前期參數(shù) 1、入?yún)?/b>
$item_img="https://img.alicdn.com/bao/uploaded/i1/1750208593/TB1rgM3hhtnkeRjSZSgXXXAuXXa_!!0-item_pic.jpg"; $item_title="測(cè)試字體"; $shop_title="測(cè)試店鋪"; $shop_img="http://q.aiyongbao.com/item/web/images/qap_img/mobile/userAvatar.png"; $qr_img="https://img.alicdn.com/tfscom/TB1uJDStYZnBKNjSZFKwu3GOVXa.png"; $numid_share="0000000"; $qr_title="長(zhǎng)按識(shí)別二維碼"; // 對(duì)寶貝標(biāo)題裁剪 $drawtitone=mb_substr($item_title,0,13, "utf-8"); $drawtittow=mb_substr($item_title,13,13, "utf-8"); $drawtitthree=mb_substr($item_title,26,13, "utf-8"); $time_date = time(); // 時(shí)間戳 $workDir = "/data/tmp/".$numid_share."_con".$time_date; // 目標(biāo)路徑---->指定一個(gè)文件夾保存生成圖片過(guò)程里的圖片2、先下載素材文件
我們這里需要一個(gè)拼接圖片的鏈接,所以先下載到之前的創(chuàng)建的文件夾下,因?yàn)檫@些素材圖片只是為了最后的拼接,最后可以完全刪除。
$item_img_down = $workDir."/itemimage.jpg"; $shop_img_down = $workDir."/shopimage.jpg"; $qr_img_down = $workDir."/qrimage.jpg"; // 下載寶貝主圖 NetworkUtils::curlDownload($item_img, $item_img_down); // 下載店鋪圖片 NetworkUtils::curlDownload($shop_img, $shop_img_down); // 下載二維碼 NetworkUtils::curlDownload($qr_img, $qr_img_down);
NetworkUtils::curlDownload($item_img, $item_img_down); 下載$item_img保存在目標(biāo)路徑文件夾下的$workDir."/itemimage.jpg"路徑。
3、指定字體和顏色$fontFamily = "/usr/share/fonts/chinese/msyh.ttf"; $fontColor = "#333333"; $fontColor_shoptitle = "#999999"; $fontColor_qrtitlt = "#666666";4、創(chuàng)建一個(gè)底圖
創(chuàng)建一個(gè)750x1046白色的底圖,我們可以在上面繪制文字
// 創(chuàng)建一個(gè)底圖(并且加上一些文字) $back_img=$workDir."/bg.jpg"; //要生成的圖片的路徑---->可以在服務(wù)器端看到 $back_cmds="convert "xc:[750x1046!]" -background white -font {$fontFamily} -draw "text 580,994 "{$qr_title}"" -fill "{$fontColor_qrtitlt}" -pointsize 20 -draw "text 114,990 "{$shop_title}"" -font {$fontFamily} -pointsize 22 -fill "#999999" {$workDir}/bg.jpg"; $result_back_cmds = SystemCommon::runningCmd($back_cmds);
這里需要注意一下文字的繪制命令順序,否則會(huì)出現(xiàn)沒(méi)有生效的問(wèn)題。
-font {$fontFamily} -draw "text 580,994 "{$qr_title}"" -fill "{$fontColor_qrtitlt}" -pointsize 20
解釋一下:
xc:[100x40!]: 設(shè)置畫(huà)布大小的一種簡(jiǎn)寫(xiě)方式,方括號(hào)里寫(xiě)入畫(huà)布寬高,注意要加 !
-fill "rgba(0, 0, 0, 0)":設(shè)置了文本的填充顏色
text 114,990: 對(duì)文字進(jìn)行定位
-font:指定字體
-pointsize:指定文本的字體大小
-draw:繪圖選項(xiàng),text 聲明繪制文本, 0,0 聲明文本距離圖片左上角的偏移值,繪制文本的格式為 text x,y string,當(dāng)然還可以繪制其他類型,諸如圓 ( circle )、折線 ( polyline )
繼續(xù)添加文字:
$back_img_shoptitle=$workDir."/btitle.jpg"; //要生成的圖片的路徑 $back_cmds_shoptitle="convert -draw "text 40,820 "{$drawtitone}"" -font {$fontFamily} -pointsize 32 -fill "{$fontColor}" -draw "text 40,866 "{$drawtittow}"" -font {$fontFamily} -pointsize 32 -fill "{$fontColor}" -draw "text 40,912 "{$drawtitthree}"" -font {$fontFamily} -pointsize 32 -fill "{$fontColor}" {$back_img} {$workDir}/btitle.jpg"; $result_back_cmds_shoptitle = SystemCommon::runningCmd($back_cmds_shoptitle);
效果:
(白色的背景可能顯示不是很好)
現(xiàn)在就可以在之前得到的圖片上拼接所需要的圖片了
// 在底圖上合并商品主圖 $back_img_itemimg="/data/tmp/" . md5(microtime(true)).".jpg"; //要生成的圖片的路徑 $geometryX = "+" . 0; // 定位 $geometryY = "+" . 0; // 定位 $customPicPos = "northwest"; $back_cmds_itemimg = "convert {$back_img_shoptitle} {$workDir}/item_img_mag.jpg -gravity {$customPicPos} -geometry {$geometryX}{$geometryY} -compose over -composite -antialias -set colorspace sRGB -colorspace sRGB {$workDir}/result.jpg"; $result_back_cmds_itemimg = SystemCommon::runningCmd($back_cmds_itemimg);
解釋一下:
-geometry: 設(shè)置文本在圖片里的排列方式 ( 類似 CSS 里的 align-items + justify-content ),center 表示水平垂直都居中,其他值還可以是:NorthWest, North, NorthEast, West, East, SouthWest, South, SouthEast,不記大小寫(xiě)
composite: 將一個(gè)圖片或多個(gè)圖片組合成新圖片。
這里是把{$workDir}/item_img_mag.jpg路徑的圖片繪制到之前繪制文字的圖片上$back_img_shoptitle,最終得到的圖片保存路徑是在{$workDir}/result.jpg
讓我們繼續(xù)操作圖片
// 合并二維碼 $geometryXshop = "+" . 40; $geometryYshop = "+" . 950; $back_cmds_shopimg = "convert {$workDir}/result.jpg {$workDir}/shop_img_mag.jpg -gravity {$customPicPos} -geometry {$geometryXshop}{$geometryYshop} -compose over -composite -antialias -set colorspace sRGB -colorspace sRGB {$workDir}/result1.jpg"; $result_back_cmds_shopimg = SystemCommon::runningCmd($back_cmds_shopimg); // 合并店鋪圖標(biāo) $geometryXqr = "+" . 520; $geometryYqr = "+" . 784; $back_cmds_qrimg = "convert {$workDir}/result1.jpg {$workDir}/qr_img_mag.jpg -gravity {$customPicPos} -geometry {$geometryXqr}{$geometryYqr} -compose over -composite -antialias -set colorspace sRGB -colorspace sRGB {$workDir}/result2.jpg"; $result_back_cmds_qrimg = SystemCommon::runningCmd($back_cmds_qrimg);
效果:
發(fā)現(xiàn)圖片并不是我們預(yù)期的效果,拼接我們也設(shè)置了圖片的大小,但是沒(méi)有起作用,嘗試過(guò)不同的方案后決定在拼接之前把圖片統(tǒng)一放大為需要拼接的尺寸來(lái)操作。
6、放大拼接圖片尺寸需要對(duì)多拼接的圖片都進(jìn)行操作
// 看來(lái)需要先放大主圖 $item_img_m="convert -resize "750x766!" {$item_img_down} {$workDir}/item_img_mag.jpg"; $item_img_mag = SystemCommon::runningCmd($item_img_m); // 看來(lái)需要先放大二維碼 $shop_img_m="convert -resize 64x64 {$shop_img_down} {$workDir}/shop_img_mag.jpg"; $shop_img_mag = SystemCommon::runningCmd($shop_img_m); // 看來(lái)需要先放大店鋪圖標(biāo) $qr_img_m="convert -resize 200x200 {$qr_img_down} {$workDir}/qr_img_mag.jpg"; $qr_img_mag = SystemCommon::runningCmd($qr_img_m);
-resize 延伸解讀
IamgeMagick 提供了幾種符號(hào)來(lái)定義縮放
convert -resize "150x100!" goods.jpg thumbnail.jpg convert -resize "150x100>" goods.jpg thumbnail.jpg convert -resize "150x100<" goods.jpg thumbnail.jpg
!:不管圖片寬高如何,都縮放成 150x100 這樣的尺寸。
>:只有寬高均大于 150x100 的圖片才縮放成該尺寸 ( 按比例取最大值 ),小于的圖片不做處理。
<:與 > 功能相反
縮放對(duì)比
這樣的結(jié)果也不是我們需要的
只有convert -resize "750x766!" {$item_img_down} {$workDir}/item_img_mag.jpg這樣固定尺寸之后可以得到:
7、圖片轉(zhuǎn)換為 base64格式我們最后同樣的以base64格式輸出給前端
$stdout = trim($result_back_cmds_qrimg["stdout"]); $Return = array(); if (empty($stdout) || strpos($result_back_cmds_qrimg["stderr"], "identify") != false) { // runningCmd執(zhí)行成功 $dest_img = $workDir."/result2.jpg"; // /*圖片轉(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["dest_img"]=$dest_img; $Return["type"]="success"; $Return["msg"]=1; return $Return; } $Return["data"]=""; $Return["msg"]=2; return $Return;
$workDir."/result2.jpg是我們最終的拼接圖片,至于文件夾下的其他圖片,可以選擇刪除。我們只要得到結(jié)果就好了。
(小姐姐拼接圖)
這次convert命令的介紹是以解讀整個(gè)方法的形式,對(duì)拼接的開(kāi)始進(jìn)行到結(jié)尾生成最終的圖片,希望對(duì)大家有力所能及的幫助。
歡迎光顧個(gè)人博客Blog
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/97916.html
摘要:指定字體和顏色創(chuàng)建一個(gè)底圖創(chuàng)建一個(gè)白色的底圖,我們可以在上面繪制文字創(chuàng)建一個(gè)底圖并且加上一些文字要生成的圖片的路徑可以在服務(wù)器端看到這里需要注意一下文字的繪制命令順序,否則會(huì)出現(xiàn)沒(méi)有生效的問(wèn)題。 [原文鏈接]https://duanruilong.github.io...://duanruilong.github.io/blog/2018/09/18/%E5%9C%A8PHP%E9%8...
摘要:但是,隨著微服務(wù)架構(gòu)的興起以及容器時(shí)代的到來(lái),這種情況又再次加劇。最重要的是,在微服務(wù)與容器領(lǐng)域有很好的基礎(chǔ),后期系統(tǒng)可完美實(shí)現(xiàn)微服務(wù)化與容器化。 1、Why Not PHP 使用PHP構(gòu)建的WEB程序,隨著業(yè)務(wù)發(fā)展到一定體量之后,都不得不面臨以下一些問(wèn)題: 業(yè)務(wù)功能不斷擴(kuò)張,如何避免某單一業(yè)務(wù)功能故障影響整體,維持系統(tǒng)健壯性 業(yè)務(wù)邏輯復(fù)雜度不斷上升,如何解耦與模塊化,降低系統(tǒng)復(fù)雜性...
摘要:中的解決辦法面對(duì)什么的情況,在中有一個(gè)很好的方法。博客原文地址學(xué)習(xí)篇二在中借鑒的一些使用方法有很多地方都不完善,還望大家指出修正,如果你覺(jué)得這個(gè)對(duì)你有用,還請(qǐng)點(diǎn)個(gè)贊,謝謝 前段時(shí)間本來(lái)準(zhǔn)備學(xué)習(xí) Laravel 的,后來(lái)因?yàn)閾Q了工作的原因,又回到自己常用的 Yii 。現(xiàn)在要將 Laravel 重拾回來(lái),開(kāi)始學(xué)習(xí)這個(gè)被PHPer們喜愛(ài)的東西。 上一篇敢關(guān)于 Laravel 的文章 【Lar...
摘要:很巧的是,我的第一個(gè)網(wǎng)站部落,就是在年月份注冊(cè)的域名,月開(kāi)始正式上線,也就是從那段時(shí)間開(kāi)始我實(shí)現(xiàn)了轉(zhuǎn)變。然而今天,我終于要和那一段曾經(jīng)的歲月說(shuō)一聲再見(jiàn)了,要和那段青春又美好的回憶說(shuō)再見(jiàn)了,要和陪伴著自己近三千多個(gè)日日夜夜的她說(shuō)再見(jiàn)了。6月注定是一個(gè)不平常的時(shí)間。寫(xiě)這篇文章時(shí)正好是全國(guó)高考結(jié)束后的第一天(2017年6月9日),對(duì)于參考完高考的人來(lái)說(shuō)他們即將面臨著人生的一次重要轉(zhuǎn)變。很巧的是,我...
摘要:既然這不是宗教,而是關(guān)于如何面對(duì)新的事物,我認(rèn)為我們應(yīng)該列出所有其他人認(rèn)為不使用來(lái)做開(kāi)發(fā)的理由。在下工作的不好這是一定的。流行度只是衡量使用率,社區(qū)活躍度的一個(gè)指標(biāo),用來(lái)幫助人們判斷技術(shù)的可用性,穩(wěn)定性和支持程度。不幸的是,人們混淆了和。這是一篇贊美 Ruby 的文章!!!看完再噴不遲? 請(qǐng)注意:這是一篇主觀意識(shí)的文章。它的目的并不是要說(shuō)服你使用或者不使用Ruby,或者其他任何技術(shù)。這...
閱讀 1645·2023-04-25 20:36
閱讀 2059·2021-09-02 15:11
閱讀 1197·2021-08-27 13:13
閱讀 2656·2019-08-30 15:52
閱讀 4656·2019-08-29 17:13
閱讀 1006·2019-08-29 11:09
閱讀 1496·2019-08-26 11:51
閱讀 840·2019-08-26 10:56