Pharoといっしょ(5) PPM形式カラービットマップグラフィック(テキストファイル)出力

Joseph Halfmoon

前回、テキストファイルへの入出力ができるようになった「気がした」ので、応用としてPPM形式のファイル出力を試みました。Linuxではお馴染みのPPM形式はテキストファイルをダラダラと書き出せばカラーグラフィックになるお楽なフォーマットです。以前、Go言語、Rust言語をちょっと練習したときにもお世話になっている形式。

※Pharo関係記事の投稿順Indexは こちら

※Smalltalkの法灯を継ぐモダンな処理系Pharo様を練習してます。今回の動作確認には、Windows11上のWSL2の上のUbuntu24.04LTS上のPharo 10.0.0を使用しています。

PPM形式

Pharo様は強力なグラフィクスを内蔵しているみたいなので、後でじっくり使わせていただくつもりです。しかし、今回から何回か「お手製」のグラフィックス出力を使って過去、他言語でも練習した「例題」的なプログラム(ちっこいアルゴリズム的なやつ)を演習してみるつもりです。

今回は、以下の別シリーズ回のGo言語のソースのPPM出力部分を「パクって」Pharo様上のPPM形式ファイル出力としています。

やっつけな日常(7) スマホでGo! fmt.Printで吉例マンデルブロ集合を描く

もともと「やっつけ」なコードである上に、Go言語のソースを「ほぼほぼ」一対一な感じ、Pharoに載せ替えたので「純粋オブジェクト・オリエンテッド」風味でない感じもします。お惚け老人だし仕方ないか。

テキストファイル出力が「できる気」がしたとは言え、Pharo素人は分からんことが多かったデス。今回中核のPPMファイル形式へのビットマップの書き出しメソッドが以下に。writePPMmethod

書き出し用のストリーム作ってクラスの中身を書き出していくのですが、最初改行しようとして赤丸で囲ったnextPutAll:に渡す文字列の中に ‘\n’ みたいことを書いて見事に失敗しました。\nと書いたら本当に字ズラ通りの\nがファイルに出力されてました。あちゃ~。結局 Transcriptウインドウに出力するときのように、cr を送らないとダメみたいです(上の緑で丸したところ)。

また、数値は nextPutAll: ではダメで、print: メソッドにお願いしないとならんかったです。トホホ。。。

作製したクラス2つ

TDDすべしということで、テスト用のクラスを作りはしたのですが、上記の問題に引っかかって、全然TDDしてないです。また今度だな。テスト駆動になってないっす。

今回作成のクラスは以下の2つ。まず MyBitMapクラスが以下に。MyBitMapClass

widthがビットマップのピクセル幅、heightがビットマップのピクセル高さを保持するクラスです。cmaxはRGB各色の輝度レベルです。現状は各色256段階固定。そして bufなるお名前のArrayが width x heightサイズのビットマップ平面を保持します。ビットマップ平面には以下のMyBitMapColorクラスが「詰まってます」MyBitMapColorClass

 

 

ありがちな red green blue各色のレベルを保持するものです。

MyBitMapクラスの初期化部分が以下に。initialization

一応、widthとheightを再初期化できるようにはしましたが、練習には上記のデフォルト値くらいで十分かと。

サンプルパターンを描いてみた

ベタな3原色を並べただけのパターンを描いてみました。

| testPPM |
testPPM := MyBitMap new.
testPPM generateSamplePattern.
testPPM writePPM: 'test.ppm'

上記の結果が以下に。samplePPM

ファイルの中身をみると単純なテキストファイルなんだが、PPM対応のグラフィックビューワー使えばちゃんと画像にみえるっと。

次回は「吉例」の画像をPharo様に描いてもらえよ。自分。

Pharoといっしょ(4) あちこちの裏で暗躍? Zincなんたら、って何よ? へ戻る

Pharoといっしょ(6) PPM出力で描く、吉例mandelbrot集合 へ進む