成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

數學公式轉圖片:純Python實現,可設置字體、字號、顏色和分辨率

開發 后端
寫數學公式,功能最強大的當然是LaTex了。不過,強大不代表易用,駕馭LaTex絕不是一件容易的事兒。這也不難理解:畢竟數學公式不是孤立存在的,必然要作為文檔、網頁或者程序輸出的元素,如何無縫地讓LaTex關聯到文檔、網頁或程序,的確是個棘手的難題。

[[407455]]

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

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

最近工作中又用到了LaTex,幾經嘗試,終于在matplotlib源碼中發現了一個處理LaTex數學公式的好東西。稍加改造,增加了字體、字號、顏色和分辨率的設置,最終完美解決了LaTex數學公式轉圖片的問題。

1. 核心代碼

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

  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函數還支持eps, pdf, pgf, png, ps, raw, rgba, svg, svgz等格式,但不支持jpg格式。

2. 設置字體、字號、分辨率

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

math_to_image函數的dpi參數用于設置分辨率(每英寸像素數)。如果應用于網頁的話,建議分辨率設置為72dpi就可以了,如果用于印刷,請將dpi設置為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) 

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

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

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

3. 設置顏色

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

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

  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() # 創建二進制的類文件對象 
  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) # 打開二進制的類文件對象,返回一個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通道設置為目標顏色 
  15. >>> im = np.dstack((r,g,b,a)).astype(np.uint8) # RGBA四個通道合并為三維的numpy數組 
  16. >>> im = Image.fromarray(im) # numpy數組轉PIL圖像對象 
  17. >>> im.save(r'd:\demo_3.png') # PIL圖像對象保存為文件 

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

4. 封裝成函數

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

 

  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數學公式轉圖片 
  12.  
  13.         text        - 文本字符串,其中數學公式須包含在兩個$符號之間 
  14.         size        - 字號,整型,默認32 
  15.         color       - 顏色,浮點型三元組,值域范圍[0,1],默認深黑色 
  16.         out         - 文件名,僅支持后綴名為.png的文件名。若為None,則返回PIL圖像對象 
  17.         kwds        - 關鍵字參數 
  18.                         dpi         - 輸出分辨率(每英寸像素數),默認72 
  19.                         family      - 系統支持的字體,None表示當前默認的字體 
  20.                         weight      - 筆畫輕重,可選項包括:normal(默認)、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('不支持的關鍵字參數:%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() # 創建二進制的類文件對象 
  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() 

 

責任編輯:武曉燕 來源: Python作業輔導員
相關推薦

2017-04-27 08:19:56

Markdown數學公式

2017-06-13 12:57:42

Windows 10Windows分辨率

2014-08-07 15:06:45

Android設備分辨率

2023-08-30 13:09:12

AI模型

2014-10-15 14:58:50

iPhone6iOS 8分辨率

2017-05-04 21:15:30

Android分辨率

2017-04-10 09:17:08

神經網絡分辨率像素遞歸

2023-10-27 08:30:52

傳輸接口刷新率

2013-08-13 11:09:10

android分辨率

2023-10-12 07:43:45

2012-08-14 16:52:26

手機屏幕分辨率

2011-01-07 10:26:13

linux報警聲分辨率

2011-08-16 17:57:51

linux修改分辨率

2009-04-16 08:19:40

Windows 7微軟操作系統

2024-08-27 00:01:00

LaTeX語言符號

2011-08-16 10:17:16

SVGATextMod中文man

2011-05-30 08:42:56

Android

2012-01-05 16:08:57

佳能激光打印機

2024-07-05 10:41:30

目標檢測算法

2021-01-20 11:14:47

人工智能算法技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天堂一区二区三区 | 毛片一区| 91久久精品日日躁夜夜躁国产 | 中文字幕一区二区三区乱码在线 | 成人国产在线视频 | 国产精品看片 | 中文字幕亚洲视频 | 视频在线观看一区二区 | 免费v片| 一级毛片高清 | 一级毛片大全免费播放 | 最新一级毛片 | 毛片高清| 人人色视频 | 热久色| 国产一区二区影院 | 国产精品无码久久久久 | 日韩精品在线播放 | 黄 色 毛片免费 | 91视频在线看| 成人精品在线观看 | 一区二区三区高清在线观看 | 精品一区二区不卡 | 色999视频| 精品一区欧美 | 日韩无 | 精品一二| 亚洲福利精品 | 国产精品揄拍一区二区 | 欧美成人一区二免费视频软件 | 成人精品在线视频 | 精品欧美二区 | 欧美激情网站 | 午夜在线| 久久一久久 | 国产视频精品区 | 欧美区日韩区 | 日本不卡免费新一二三区 | 成人在线黄色 | 亚洲人在线观看视频 | 国家aaa的一级看片 h片在线看 |