際際滷

際際滷Share a Scribd company logo
Pycairo を聞ってみる(1)
(嗤)シンビ` 2022.3.1
https://github.com/Eridanus-Hawaii/Drawing-with-Python
モチベ`ション啝にText 鮫颪鯣襪譴燭
こういうのを
恬りたい
? 恷兜は Fireworks
というアプリで
恬ったが、、、
? 猟冱をl訓に
えそうだ、、、
であれば
? プログラミング
Pycairo とはなんぞや
? Pycairo is a Python module providing bindings for the cairo
graphics library. It depends on cairo >= 1.15.10 and works
with Python 3.7+. Pycairo, including this documentation, is
licensed under the LGPL-2.1-only OR MPL-1.1.
あ゛そうかそうか Pycairo の念に Cario があるのか、、、
https://pycairo.readthedocs.io/en/latest/
Cairo とはなんぞや
? Cairo is a 2D graphics library with support for multiple output
devices. Currently supported output targets include the X
Window System (via both Xlib and XCB), Quartz, Win32,
image buffers, PostScript, PDF, and SVG file output.
Experimental backends include OpenGL, BeOS, OS/2, and
DirectFB.
? まぁ峠たく冱うと 2D のグラフィック?ライブラリだ。
お}宙きが竃栖る。
https://cairographics.org/
Pycairo ことはじめ
? install
? pip3 install pycairo
? C のライブラリを駅勣とするから wheel とかがその念に駅勣かも。
? pip3 install wheel
? 聞うr
? import cairo
Pycairo さっそく聞ってみる
import cairo
#----------------------------------------------------------------
if __name__ == '__main__':
image_file = 't1.png'
width = 200
height = 200
line_width = 10
surface = cairo.ImageSurface(cairo.FORMAT_RGB24, width, height)
context = cairo.Context(surface)
context.set_line_width(line_width)
context.set_source_rgb(0xff, 0x99, 0)
context.rectangle(10, 10, 100, 100)
context.stroke()
surface.write_to_png(image_file)
1. Surface を恬る
2. Context を恬る
3. の湊さをO協
4. 弼をO協
5. 膨叔の峺協
6. 宙鮫
7. PNG としてき竃し
yしかったけど竃栖た
? img2sixel で_J
あれ針爾辰討辛と`う
弼峺協は弌方だった。
? context.set_source_rgb(0xff/0xff, 0x99/0xff, 0)
それではとテキストを弖紗
? できた!
context.set_font_size(font_size)
context.move_to(15, 35)
context.show_text("こんにちは")
context.stroke()
1. フォントの寄きさをO協
2. 侭を峺協
3. 猟忖双を峺協
4. 宙鮫
個措泣を篇
? 寔膨叔だ。
? ということで、まずは来いFを宙鮫することを朕峺す。
劼肇薀ぅ鵑鮟Mみ栽わせれば竃栖そうだ
? ということで碧
pycairoで叔来膨叔を宙鮫する
? コ`ドを処 x = 40
y = 50
w = 120
h = 100
r = 20
ctx.move_to(x+r, y)
ctx.line_to(x+w-r-1, y)
ctx.arc(x+w-r-1, y+r, r, -0.5*math.pi, 0)
ctx.line_to(x+w-1, y+h-r-1)
ctx.arc(x+w-r-1, y+h-r-1, r, 0, 0.5*math.pi)
ctx.line_to(x+r, y+h-1)
ctx.arc(x+r, y+h-r-1, r, 0.5*math.pi, math.pi)
ctx.line_to(x, y+r)
ctx.arc(x+r, y+r, r, math.pi, 1.5*math.pi)
ctx.close_path()
ctx.set_source_rgb(0xbb/float(0xff), 0xdd/float(0xff), 0xff/float(0xff))
ctx.fill_preserve()
ctx.set_source_rgb(0x11/float(0xff), 0x33/float(0xff), 0x77/float(0xff))
ctx.stroke()
エラ`
? math がたりない
? import math が駅勣
? 俐屎して壅g佩
? できた
File "t3.py", line 22, in <module>
context.arc(x+w-r-1, y+r, r, -0.5*math.pi, 0)
NameError: name 'math' is not defined
弼を徭蛍の峺協したい弼にする
context.set_source_rgb(0xff/float(0xff), 0xff/float(0xff), 0xff/float(0xff))
context.fill_preserve()
context.set_source_rgb(0xff/float(0xff), 0x99/float(0xff), 0x00/float(0xff))
context.stroke()
の嶄の弼(#FFFFFF = WHITE)
の弼(#FF9900 = ORANGE)
弼について(Web などでよく聞う侘塀)
? #FF FF FF
橿 0゛255(16Mで 0x00゛0xFF)
v 0゛255(16Mで 0x00゛0xFF)
楳 0゛255(16Mで 0x00゛0xFF)
R G B
弼について(書指の cairo)
? 0~1.0 0~1.0 0~1.0
橿 0゛1.0
v 0゛1.0
楳 0゛1.0
R G B
0xFF = 1.0
0x99 = 0.6
ここでは宴卷貧 1.0 という方忖を聞っているが、嗤粋譴 32bit 検嗤(泣方だから 23bit
の湊さを笋┐
line_width = 20
context.set_line_width(line_width)
寄きさを笋┐
? surface を寄きくする
? w を 320 にする
width = 400
height = 200
surface = cairo.ImageSurface(cairo.FORMAT_RGB24, width, height)
x = 40
y = 50
w = 320
h = 100
r = 20
テキストも笋┐
font_size = 30
context.set_source_rgb(0, 0, 0)
context.set_font_size(font_size)
context.move_to(55, 95)
context.show_text("こんにちは")
context.stroke()
弼を\に
サイズを寄きく
侭をm輝に
おまけ:ファイル兆の徭喇撹
image_file = 'image_' + sys.argv[0].replace('.py',
'.png¨)
...
...
...
surface.write_to_png(image_file)
sys.argv[0] には t5.py などのg佩される Python のファイル兆が秘る
そこで、その念に `image_¨ を怎す
.py を .png へ replace する。
すると、 image_t5.png という猟忖双(string) が竃栖る。
Y惚として
$ python3 t5.py
とg佩すると
image_t5.png
が竃栖る
ポイント
? 是った。
? もっと個鋲できないか
欷兇い吹瓩
碧するなり
繁にくなりすればいい
をつくる
? (arc) を宙いて
? ^寔ん嶄 ̄に 1 をく
をつくる:桑翌
? 歌深までにくと に1はh廠卆贋猟忖です。
(つまり、あまり聞わない圭がよい
? 鮫颪砲垢觀屬砲廊h廠vSない By r爽邦b福
eにr爽邦b福が協xしている冱~
ではないが、なぜか、碧でヒット
したのでdせておく
を宙く
context.set_source_rgb(0, 0, 1)
r = 30
line_width = 3
context.set_line_width(line_width)
context.arc(250, 88, r, 0, math.pi * 2)
context.stroke()
弼を楳に
磯抄が 30
の湊さが3
劼鰆原
宙鮫峺幣
context.arc を碧する
arc のドキュメント(ウェブサイト)
https://pycairo.readthedocs.io が云社。そこを歌孚する
X の了崔
Y の了崔
磯抄
スタ`トの叔業
エンドの叔業
叔業は radians
1
2
π
π
3
2
π
0 または 2π
云輝は、、、o泙縫僖食`ンがある
´ ?
3
2
π ,
1
2
π,
5
2
π,
9
2
π ´
´ ? 2π , 0,2 π, 4 π ´
´ ?
1
2
π ,
3
2
π,
7
2
π,
11
2
π ´
´ ? π , π, 3 π, 5π ´
プログラムではどうなっていたか
context.arc(250, 88, r, 0, math.pi * 2)
スタ`トが0 エンドが2π
0 から
2π まで
0から 2πまで。すなわち360業
をつくる
? (arc) を宙いて ★ _撹
? ^寔ん嶄 ̄に 1 をく
context.set_source_rgb(0, 0, 1)
r = 30
line_width = 3
context.set_line_width(line_width)
context.arc(250, 88, r, 0, math.pi *
2)
context.stroke()
恙 x, y を揖じにして1をく
font_size = 30
context.set_source_rgb(0, 0, 1)
context.set_font_size(font_size)
context.move_to(250, 88)
context.show_text('1')
context.stroke()
context.arc(250, 88, r, 0, math.pi *
2)
ずれてます。
スケ`ルド?フォントとメトリック
? スケ`ラブル?フォント(スケ`ルド?フォント)
? 寄?s弌しても侘が雲れない
? フォント?メトリック
? 咫泡喘Z
https://www.jfpi.or.jp/webyogo/index.php?term=3498
ビットマップフォントVSスケ`ラブルフォント
寄すると
なめらかでなくなる
寄?s弌しても
なめらか
採絞か、cairo の API は scaled_font という兆各
wikipedia から
フォント?メトリック
? アルファベット?フォント猟晒の鹿寄撹!!
https://docs.microsoft.com/ja-
jp/dotnet/desktop/winforms/advanced/how-to-obtain-
font-metrics?view=netframeworkdesktop-4.8
フォント?メトリック
? Arial
? Old English Text MT(iめん!!)
? 吉嫌フォント(Courier New)
iみやすいように i とか
は恣嘔の腎易が倭い
プログラムに宴旋なように
嫌が匯協
吉嫌vsプロポ`ショナル
吉嫌だと猟忖の了崔がBっている

シに宴旋
プロポ`ショナルだと猟忖の了崔はばらばら

シに音宴(た朕はきれい)
cairo のフォント秤
extents = sf.text_extents('1¨)
print(extents)
python3 font-metric.py
cairo.TextExtents(
x_bearing=3.0,
y_bearing=-22.0,
width=9.0,
height=22.0,
x_advance=17.0,
y_advance=0.0)
API text_extents を聞う
TextExtents という
オブジェクトで砿尖されている
TextExtents
TextExtens をきzんだ鮫颪鰈る
high を寄
1) スタ`ト
恙
2) スタ`ト恙砲
x_bearing, y_bearing を
怎した恙
3) width
4) height
5) x_advance 6) y_advance はゼロ
1 を寄
嶄伉を箔める
嶄伉はここ
の嶄伉に1を秘れる
x = 250
y = 88
str = '1'
font_size = 30
sf = scaled_font.get_scaled_font('Arial', font_size )
extents = sf.text_extents(str)
context.set_source_rgb(0, 0, 1)
context.set_font_size(font_size)
context.move_to(x, y)
context.rel_move_to(-extents.width/2, -extents.height/2)
context.rel_move_to(-extents.x_bearing, -extents.y_bearing)
context.show_text(str)
context.stroke()
あとは癖輝に了崔と弼を距屁
及匯何 頼

More Related Content

Pycairo を聞ってみる その1