日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
數(shù)學(xué)公式轉(zhuǎn)圖片:純Python實現(xiàn),可設(shè)置字體、字號、顏色和分辨率

寫數(shù)學(xué)公式,功能最強(qiáng)大的當(dāng)然是LaTex了。不過,強(qiáng)大不代表易用,駕馭LaTex絕不是一件容易的事兒。這也不難理解:畢竟數(shù)學(xué)公式不是孤立存在的,必然要作為文檔、網(wǎng)頁或者程序輸出的元素,如何無縫地讓LaTex關(guān)聯(lián)到文檔、網(wǎng)頁或程序,的確是個棘手的難題。

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),肥東企業(yè)網(wǎng)站建設(shè),肥東品牌網(wǎng)站建設(shè),網(wǎng)站定制,肥東網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,肥東網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

既然直接使用LaTex有難度,那就退而求其次:借助于工具將數(shù)學(xué)公式轉(zhuǎn)為圖片,然后就可以方便地應(yīng)用到文檔、網(wǎng)頁或者程序中了。這樣的工具,除了在線式的,基本上都是重量級的,安裝和使用極不方便。我曾經(jīng)花了11個C幣從CSDN買過一個數(shù)學(xué)公式轉(zhuǎn)圖片的工具,下載之后發(fā)現(xiàn),竟然只是封裝了一個http請求,圖片仍然是在線生成的!一氣之下,自己寫了個離線的,只是功能比較簡單,不能方便地設(shè)置輸出圖像的大小和顏色。

最近工作中又用到了LaTex,幾經(jīng)嘗試,終于在matplotlib源碼中發(fā)現(xiàn)了一個處理LaTex數(shù)學(xué)公式的好東西。稍加改造,增加了字體、字號、顏色和分辨率的設(shè)置,最終完美解決了LaTex數(shù)學(xué)公式轉(zhuǎn)圖片的問題。

1. 核心代碼

先從最簡單的開始吧。matplotlib有個mathtext子模塊,提供了math_to_image函數(shù)可以直接將LaTex數(shù)學(xué)公式生成圖片。下面的代碼,僅僅兩行,就將質(zhì)能方程轉(zhuǎn)成了圖片。請注意,LaTex數(shù)學(xué)公式一定要包含在兩個$符號之間。

 
 
 
 
  1. >>> from matplotlib import mathtext 
  2. >>> mathtext.math_to_image(r'$E=mc^2$', r'd:\demo_1.png') 

生成的圖片寬度55個像素,高度15個像素,分辨率為100dpi。這么迷你,看上去可憐巴巴的。

雖然指定了png格式,也確實存在透明通道,其背景卻是不透明的。除了png格式外,math_to_image函數(shù)還支持eps, pdf, pgf, png, ps, raw, rgba, svg, svgz等格式,但不支持jpg格式。

2. 設(shè)置字體、字號、分辨率

要設(shè)置字體字號,就得先導(dǎo)入matplotlib的font_manager字體管理模塊。該模塊的FontProperties類可以實例化一個字體對象傳給math_to_image函數(shù),用來設(shè)置family(字體)、size(字號)和weight(筆畫輕重)等。

math_to_image函數(shù)的dpi參數(shù)用于設(shè)置分辨率(每英寸像素數(shù))。如果應(yīng)用于網(wǎng)頁的話,建議分辨率設(shè)置為72dpi就可以了,如果用于印刷,請將dpi設(shè)置為300。

 
 
 
 
  1. >>> import matplotlib.font_manager as mfm 
  2. >>> prop = mfm.FontProperties(family='sans-serif', size=64, weight='normal') 
  3. >>> mathtext.math_to_image(r'$E=mc^2$', r'd:\demo_2.png', prop=prop, dpi=72) 

輸出結(jié)果如下。這次生成的圖片終于不那么可憐了,寬度250個像素,高度59個像素。

如果不知道有哪些字體可用怎么辦?不要擔(dān)心,下面這一行代碼就可以列出當(dāng)前系統(tǒng)中全部的可用字體。在我的電腦上運(yùn)行之后,找到了幾百種可用的字體(重名的字體表示該字體有多個字體文件)。

 
 
 
 
  1. >>> [item.name for item in mfm.fontManager.ttflist] 

3. 設(shè)置顏色

要想對圖片文件做顏色處理,最好的方式是先將math_to_image的輸出暫存到類文件對象中,借助于PIL和NumPy完成顏色設(shè)置后,再保存為文件。為此,要先導(dǎo)入io模塊、pillow模塊和numpy模塊。

在開始寫代碼前,先約定使用浮點(diǎn)型的三元組表示顏色,比如,(0.17, 0.63, 0.17)表示亮度稍暗的綠色。如果喜歡使用其他方式表示顏色,請自行轉(zhuǎn)換。下面的例子換了一個復(fù)雜的數(shù)學(xué)公式(虛構(gòu)的,并無實際意義)來演示如何設(shè)置顏色。

 
 
 
 
  1. >>> from io import BytesIO 
  2. >>> from PIL import Image 
  3. >>> import numpy as np 
  4. >>> text = r'$s(t) = \mathcal{A}\mathrm{sin}(2 \omega \sum_{i=0}^\infty t_i)$' 
  5. >>> color = (0.17, 0.63, 0.17) # 要使用的顏色 
  6. >>> bfo = BytesIO() # 創(chuàng)建二進(jìn)制的類文件對象 
  7. >>> prop = mfm.FontProperties(family='Palatino Linotype', size=256, weight='normal') 
  8. >>> mathtext.math_to_image(text, bfo, prop=prop, dpi=72) 
  9. 209.0 
  10. >>> im = Image.open(bfo) # 打開二進(jìn)制的類文件對象,返回一個PIL圖像對象 
  11. >>> r, g, b, a = im.split() # 分離出RGBA四個通道 
  12. >>> r, g, b = 255-np.array(r), 255-np.array(g), 255-np.array(b) # RGB通道反白 
  13. >>> a = r/3 + g/3 + b/3 # 生成新的alpha通道 
  14. >>> r, g, b = r*color[0], g*color[1], b*color[2] # RGB通道設(shè)置為目標(biāo)顏色 
  15. >>> im = np.dstack((r,g,b,a)).astype(np.uint8) # RGBA四個通道合并為三維的numpy數(shù)組 
  16. >>> im = Image.fromarray(im) # numpy數(shù)組轉(zhuǎn)PIL圖像對象 
  17. >>> im.save(r'd:\demo_3.png') # PIL圖像對象保存為文件 

來看看最終的輸出結(jié)果是什么樣的呢?最終生成了2451x653的一張大圖,公式內(nèi)容、字體、字號、顏色等,正如期望的那樣。大功告成!

4. 封裝成函數(shù)

為了方便使用,將上面的代碼封裝成一個函數(shù),完整代碼如下。

 
 
 
 
  1. # -*- coding: utf-8 -*- 
  2.  
  3. import os 
  4. from io import BytesIO 
  5. from PIL import Image 
  6. import numpy as np 
  7. import matplotlib.font_manager as mfm 
  8. from matplotlib import mathtext 
  9.  
  10. def latex2img(text, size=32, color=(0.1,0.1,0.1), out=None, **kwds): 
  11.     """LaTex數(shù)學(xué)公式轉(zhuǎn)圖片 
  12.  
  13.         text        - 文本字符串,其中數(shù)學(xué)公式須包含在兩個$符號之間 
  14.         size        - 字號,整型,默認(rèn)32 
  15.         color       - 顏色,浮點(diǎn)型三元組,值域范圍[0,1],默認(rèn)深黑色 
  16.         out         - 文件名,僅支持后綴名為.png的文件名。若為None,則返回PIL圖像對象 
  17.         kwds        - 關(guān)鍵字參數(shù) 
  18.                         dpi         - 輸出分辨率(每英寸像素數(shù)),默認(rèn)72 
  19.                         family      - 系統(tǒng)支持的字體,None表示當(dāng)前默認(rèn)的字體 
  20.                         weight      - 筆畫輕重,可選項包括:normal(默認(rèn))、light和bold 
  21.         """ 
  22.  
  23.     assert out is None or os.path.splitext(out)[1].lower() == '.png', '僅支持后綴名為.png的文件名' 
  24.  
  25.     for key in kwds: 
  26.         if key not in ['dpi', 'family', 'weight']: 
  27.             raise KeyError('不支持的關(guān)鍵字參數(shù):%s'%key) 
  28.  
  29.     dpi = kwds.get('dpi', 72) 
  30.     family = kwds.get('family', None) 
  31.     weight = kwds.get('weight', 'normal') 
  32.  
  33.     bfo = BytesIO() # 創(chuàng)建二進(jìn)制的類文件對象 
  34.     prop = mfm.FontProperties(family=family, size=size, weight=weight) 
  35.     mathtext.math_to_image(text, bfo, prop=prop, dpi=dpi) 
  36.     im = Image.open(bfo) 
  37.  
  38.     r, g, b, a = im.split() 
  39.     r, g, b = 255-np.array(r), 255-np.array(g), 255-np.array(b) 
  40.     a = r/3 + g/3 + b/3 
  41.     r, g, b = r*color[0], g*color[1], b*color[2] 
  42.  
  43.     im = np.dstack((r,g,b,a)).astype(np.uint8) 
  44.     im = Image.fromarray(im) 
  45.  
  46.     if out is None: 
  47.         return im 
  48.     else: 
  49.         im.save(out) 
  50.         print('生成的圖片已保存為%s'%out) 
  51.  
  52. if __name__  == '__main__': 
  53.     text = r'$\sum_{i=0}^\infty x_i$' 
  54.     latex2img(text, size=48, color=(0.1,0.8,0.8), out=r'd:\demo.png') 
  55.  
  56.     text = r'$\sum_{n=1}^\infty\frac{-e^{i\pi}}{2^n}$' 
  57.     im = latex2img(text, size=48, color=(0.9,0.1,0.1)) 
  58.     im.show() 

當(dāng)前標(biāo)題:數(shù)學(xué)公式轉(zhuǎn)圖片:純Python實現(xiàn),可設(shè)置字體、字號、顏色和分辨率
網(wǎng)頁鏈接:http://m.5511xx.com/article/cceicgg.html