2015/3/8前回は、1ピクセルの情報を記述する方法について検討した。今回は、そのピクセルの集合体である画像を表現する方法を検討する。image.cの説明となる。画像データの表現ひとつのピクセルの表現方法が決まったところで、画像の表現方法を考える。必要最小限の情報は縦横の大きさと、それを埋め尽くす数のピクセル要素があれば良い。実際に配置する方法に合わせて2次元の配列にしても良いだろう。カラーパレットとそのパレットの数も必要になる。そのどの方式なのかを表現するパラメータも必要だろう。以上を加味して、画像を以下の構造体で表現することにする。image_t;ほぼ、見てもらえば分かると思うが、順に説明していく。符号なし整数で表現することにしている。負の値になることはないのでuint32_tとしている。次に、color_typeとして、色の表現方法を表すパラメータを用意している。画像の情報としてパラメータを用意し、その取りうる値を#defineで定義している。定義を分けるようにした。uint16_tとしている。次に、paletteカラーパレットの情報で、インデックスカラー方式の時のみ参照されるパラメータである。ポインタにして別途メモリ確保を行うようにした。パレットとしていくつ持っているのかの情報も必要になるため、palette_numを用意している。パレットの数は最大で256個、パレットなしを表す0も表現しないといけないので実は8bitでは足りない。そのためuint16_tとしている。最後に、map、肝心の画像データ部分だ。ポインタのポインタを配置している。行方向の配列を保持する列配列という形だ。行内のピクセルの格納順は左からと、横書きの文章と同じ順序になるようにしている。画像上の座標では負の座標は普通は扱わないため、いわゆる第一象限のみの座標系になる。数学で言う第一象限の座標系は左下を原点として、x軸は右向き、y軸は上向きを正とした座標系を持っている。多くの画像フォーマットでこのような原点を左上として、y軸が下向きの座標系が用いられる。このことはプログラミングの世界では一般的だが、初めて触れるユーザにとっては少し違和感を覚える部分ではないかと思う。メモリの確保、開放、また、画像データのコピーを行う関数が必要だろう。そこで以下の様な関数を用意しておく。サイズと形式を指定して、内部のメモリと合わせてメモリ確保・初期化を行う関数を用意する。それら処理をまとめて行う関数を用意する。画像を加工等する場合、現在の画像はそのまま保持して、別に用意したコピーを加工する。いう処理が必要になる場合があるだろう。行い、内部で参照しているポインタの先もまとめてコピーを行う、クローン関数を用意する。それを使用開始するために必要な関数を作成した。これだけではまだ何もできないが、処理を行うための下地を整えることができたということになる。更新情報2018/07/28lsっぽいコマンドを作る13アップしました。2018/07/13lsっぽいコマンドを作る12アップしました。2017/01/04lsっぽいコマンドを作る11アップしました。2017/01/03lsっぽいコマンドを作る10アップしました。(https://commoncrawl.org/faq/)。