グラフィックイメージ処理イメージファイルを読み込んで他のフォーマットに変換JPEG ファイルを PNG ファイルに変換します。 import(jpeg) import(png) I(filename:string) = path.join(sys.datadir, 'sample', 'resource', filename) image(I('Winter.jpg')).write('Winter.png') イメージファイルを読み込み、グラフィック描画を重ねあわせてファイルに書き出しJPEG ファイルを読み込んだ後、Cairo ライブラリで描画をして、その結果を JPEG ファイルとして書き出します。 import(jpeg) import(cairo) I(filename:string) = path.join(sys.datadir, 'sample', 'resource', filename) img = image(I('Winter.jpg')) img.cairo {|cr| repeat (10) {|i| [x, y, r] = [128 + 30 * i, 128 + 30 * i, 60 - i * 4] pat = cairo.pattern_create_radial( x - r / 10, y - r / 6, r / 5, x - r / 6, y - r / 6, r * 1.2) pat.add_color_stop_rgba(0, 1, 1, 1, 1) pat.add_color_stop_rgba(1, 0, 0, 0, 1) cr.set_source(pat) cr.arc(x, y, r) cr.fill() } } img.write('result.jpg') 複数のイメージファイルを結合してアニメーション GIF ファイルを出力GIF ファイルにファイルイメージを結合してアニメーション GIF ファイルを出力します。 import(gif) import(png) gif.content().addimage(['cell1.png', 'cell2.png', 'cell3.png'], 10).write('anim1.gif') 動的にイメージを作成して GIF ファイルにすることも可能です。 Cairo でイメージを描画して、アニメーション GIF として出力する例を以下に示します。 import(cairo) import(gif) str = 'Hello' img = image(`rgba, 64, 64, `white) gifobj = gif.content() img.cairo {|cr| cr.select_font_face('Georgia', cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD) cr.set_font_size(64) te = cr.text_extents(str) cr.set_source_rgb(0.0, 0.0, 0.0) for (x in interval(64, -te.width, 30)) {|i| img.fill(`white) cr.move_to(x, 50) cr.show_text(str) gifobj.addimage(img.clone(), 10) } } gifobj.write('anim2.gif') OpenGL による三次元グラフィックOpenGL 1.1 をサポートしています。 描画結果は SDL (Simple Direct Layer) を使ってディスプレイに表示したり、直接イメージファイルに出力することができます。 以下の例は GLUT による「手抜き」OpenGL 入門 に掲載されていたサンプルを Gura にポーティングしたものです。 import(glu) {*} import(opengl) {*} import(gltester) vertex = [ [0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0] [0, 0, 1], [1, 0, 1], [1, 1, 1], [0, 1, 1] ] init(w:number, h:number) = { glClearColor(1, 1, 1, 1) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glEnable(GL_DEPTH_TEST, GL_CULL_FACE) glEnable(GL_LIGHTING, GL_LIGHT0, GL_LIGHT1) glCullFace(GL_FRONT) glViewport(0, 0, w, h) glMatrixMode(GL_PROJECTION) glLoadIdentity() gluPerspective(30, w / h, 1, 100) } display(degree:number) = { glMatrixMode(GL_MODELVIEW) glLoadIdentity() gluLookAt(3, 4, 5, 0, 0, 0, 0, 1, 0) glRotated(degree, 1, 1, 0) glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, [0.8, 0.2, 0.2, 1]) glBegin(GL_QUADS) { glNormal3dv([ 0, 0, -1]), glVertex3dv(vertex[0, 1, 2, 3]) glNormal3dv([ 1, 0, 0]), glVertex3dv(vertex[1, 5, 6, 2]) glNormal3dv([ 0, 0, 1]), glVertex3dv(vertex[5, 4, 7, 6]) glNormal3dv([-1, 0, 0]), glVertex3dv(vertex[4, 0, 3, 7]) glNormal3dv([ 0, -1, 0]), glVertex3dv(vertex[4, 5, 1, 0]) glNormal3dv([ 0, 1, 0]), glVertex3dv(vertex[3, 2, 6, 7]) } } degree = 0 [width, height] = [300, 300] gltester.mainloop(width, height, 0, `idle) { `onDraw => function { init(width, height) display(degree) } `onKeyPoll => %{ `left => function { degree += 1 } `right => function { degree -= 1 } } } 実行例 ![]() SGI のサンプルをポーティングしたものを、パッケージ中のディレクトリ gura/sample/opengl に収めています。 |