たまりば

  パソコン・インターネット パソコン・インターネット  三鷹市 三鷹市

画像→文字変換
2008年08月20日 23:06

OS自作の話はちょっと一休み。
OS自作[5]で予告したテクニックの紹介です。

ペイントとテキストエディタのみを使って画像からテキストに変換する方法。

「画像からテキストに変換」と書くとなんだかOCRみたいに見えてしまいますね。
そうではなく、
これ
例

こう
--------
--*----*
--***--*
-*-*---*
-*-*-*-*
**-***-*
-**-**-*
-**-**-*
-*****-*
-**-**-*
-*--*--*
-*--*--*
-*-*---*
-*-*---*
-**---**
--------
する
方法についてです。

解説は後にしてまずは手順を見せましょう。

まず画像を用意します。
手順1
右に1ドット余白を作ります。(白背景だと見えない…)
手順1手順2

色を塗り替えます。
手順3
そしてさっき空けておいた余白を別の色で塗ります。
手順4
ここで、塗る色はどれでもいいわけではなく、ペイントのパレットで言うと
使用可能な色
この図で示した6つのどれかである必要があります。ここでは見やすい色を選びました。
次にこの画像を上下反転します。
手順5
そして次が一番の重要ポイント!
この画像を「256色ビットマップ」で保存します。他の形式では駄目です。
256色ビットマップ
できたものがこちら…と言いたい所ですがここではbmpは貼れないのでpngに直してあります。
手順6
色が微妙に変わるのは仕様です。

さてここまで来たらあと1歩。
ここでできたbmpファイルをテキストエディタに放り込みます。
すると、こんな感じの表示になります。
BM・      6  (               タ   ト  ト                €  €   €€ €   € € €€  タタタ タワタ ヲ   @   `   €      タ   ・ @   @   @@  @`  @€  @  @タ  @・ `   `   `@  ``  `€  `  `タ  `・ €   €   €@  €`  €€  €  €タ  €・       @  `  €    タ  ・ タ   タ   タ@  タ`  タ€  タ  タタ  タ・ ・  ・  漾  濮  烙  燿  狢  珥 @   @   @ @ @ ` @ € @  @ タ @ ・@   @   @ @ @ ` @ € @  @ タ @ ・@@  @@  @@@ @@` @@€ @@ @@タ @@・@`  @`  @`@ @`` @`€ @` @`タ @`・@€  @€  @€@ @€` @€€ @€ @€タ @€・@  @  @@ @` @€ @ @タ @・@タ  @タ  @タ@ @タ` @タ€ @タ @タタ @タ・@・ @・ @漾 @濮 @烙 @燿 @狢 @珥 €   €   € @ € ` € € €  € タ € ・€   €   € @ € ` € € €  € タ € ・€@  €@  €@@ €@` €@€ €@ €@タ €@・€`  €`  €`@ €`` €`€ €` €`タ €`・€€  €€  €€@ €€` €€€ €€ €€タ €€・€  €  €@ €` €€ € €タ €・€タ  €タ  €タ@ €タ` €タ€ €タ €タタ €タ・€・ €・ €漾 €濮 €烙 €燿 €狢 €珥 タ   タ   タ @ タ ` タ € タ  タ タ タ ・タ   タ   タ @ タ ` タ € タ  タ タ タ ・タ@  タ@  タ@@ タ@` タ@€ タ@ タ@タ タ@・タ`  タ`  タ`@ タ`` タ`€ タ` タ`タ タ`・タ€  タ€  タ€@ タ€` タ€€ タ€ タ€タ タ€・タ  タ  タ@ タ` タ€ タ タタ タ・タタ  タタ  タタ@ タタ` タタ€ タタ  、 €€€                 ソソソソソソソソク   ソソPソソソソPク   ソソPPPソソPク   ソPソPソソソPク   ソPソPソPソPク   PPソPPPソPク   ソPPソPPソPク   ソPPソPPソPク   ソPPPPPソPク   ソPPソPPソPク   ソPソソPソソPク   ソPソソPソソPク   ソPソPソソソPク   ソPソPソソソPク   ソPPソソソPPク   ソソソソソソソソク   

前半の意味不明な部分ははいらないのでカットします。
ソソソソソソソソク   ソソPソソソソPク   ソソPPPソソPク   ソPソPソソソPク   ソPソPソPソPク   PPソPPPソPク   ソPPソPPソPク   ソPPソPPソPク   ソPPPPPソPク   ソPPソPPソPク   ソPソソPソソPク   ソPソソPソソPク   ソPソPソソソPク   ソPソPソソソPク   ソPPソソソPPク   ソソソソソソソソク  
ここまで来るとだんだん見えてきましたね。
画像の1ピクセルが1文字に対応して、色ごとに字が違っています。
(ただし画像の横幅が4の倍数でない場合、切りがよくなるように空きができます。
この場合、画像の1行ごとに3つスペースが入っています。)

これを最初に右端に入れておいた色を基準に行を切り分けます。
ソソソソソソソソ
ソソPソソソソP
ソソPPPソソP
ソPソPソソソP
ソPソPソPソP
PPソPPPソP
ソPPソPPソP
ソPPソPPソP
ソPPPPPソP
ソPPソPPソP
ソPソソPソソP
ソPソソPソソP
ソPソPソソソP
ソPソPソソソP
ソPPソソソPP
ソソソソソソソソ
この作業はちょっとしたテキストエディタなら置換機能で「ク   」→「\n」とすることでできます。参考までに自分が愛用しているのは「EmEditor」というソフトです。
(ただし残念ながらメモ帳では置換候補に「改行」を入れることができないので使えません。
これが使えれば「ペイントとメモ帳で」となってインパクトがあったのに…。
どうしてもメモ帳が使いたい人は手動で改行を入れましょう。)

最後にこれをお好みの文字に置換して出来上がりです。
--------
--*----*
--***--*
-*-*---*
-*-*-*-*
**-***-*
-**-**-*
-**-**-*
-*****-*
-**-**-*
-*--*--*
-*--*--*
-*-*---*
-*-*---*
-**---**
--------


とまあこうやって画像をテキストに変換することができたわけですが、どうしてこうなるのか分からないと思います。
途中bmpファイルをテキストエディタに読み込ませるという非常識なこともしています。
というわけでこの辺の解説をしたいと思います。

思います…が、今日は疲れたのでまた今度。  

  • OS自作[6]_8,9日目
    2008年08月19日 01:29

    ちょっと最近忙しくて更新サボってましたが、8日目の残りと9日目を読むところまで前回の日記の後に終わっています。
    9日目はメモリ管理。
    「C言語で書くと勝手に最適化されて動作しないからアセンブリ言語で書く」ってあたりに大分ページを割いています。
    読んだだけでコードをあまり見ていないのでこれから実行してみようと思います。

    あと、今日8日目最後の説明部分を読み直しました。
    そうしたら前回よりすんなりと理解できました。
    こういう説明って前から順に読んでいくだけでは理解できないので面倒です。

    最後におまけ。
    文字表示
    8日目のファイルの文字部分だけ書き換えてみました。
    画像では分かりませんが文字コードもきちんと半角カナに準ずるように直しています。

    と、ここで気づいたんですが、1行目の[,]と2行目の「゛」がつながっちゃってます。
    このフォント、横8ドット縦16ドットを目一杯に使ってるんですね。横は前から気づいていたけど縦もだったとは。
    基本的に自分はこういうフォントは見にくくて大嫌いです。
    そのうち直そうと思います。

    -----

    ◆今日の成果◆
    メモリ管理について学んだ。
    文字表示を改良した。  
    タグ :OS自作

  • OS自作[5]_5-8日目
    2008年08月12日 05:54

    今日は8日目の途中まで進みました。
    あー、つい調子に乗ってこんなに…。もう朝だ…。

    ブログ書くのは寝てからにしよう。
    さしあたって画像だけ。

    -----

    '08.08/12-18:08 追記

    そんなわけで、解説いきます。

    ◆5日目分
    構造体を使ってコードをちょっと書きなおしたのがまず一つ。
    それからついに文字表示です。点をちまちま打って文字を表示する関数を作りました。
    文字
    文字が出るとやっぱり見栄えが違いますねー。
    フォントはOSASK(この本の筆者らが作ったOS)のものが付属していたんですが、これがちょっと独特な文字コードになっていました。
    ASCII部分は普通なのですが、ASCIIの制御文字あたりに記号が、後半に欧米の特殊文字と罫線素片が入っていました。
    文字の選定は別にいいのですが、既存の文字コードと全く違う配列になっていて扱いづらいです。(Latin-1でもMacRomanでもない)
    どうせ使わないならということで、代わりにカナを入れてみました。
    ちなみにこのフォントファイルは
    char 0x41
    ........
    ...**...
    ...**...
    ...**...
    ...**...
    ..*..*..
    ..*..*..
    ..*..*..
    ..*..*..
    .******.
    .*....*.
    .*....*.
    .*....*.
    ***..***
    ........
    ........
    という形で書かれたテキスト形式のファイルで出来ています。
    これをペイントとテキストエディタで書き換えたのですが、具体的なやり方はまた後ほど。

    ちなみにこの時にはソースファイルに半角カナが使えることを知らなかったので、1バイトカナフォント風の複雑な文字コードにしてしまいました。
    (例 : 'a'+0x80→チ、's'+0x80→ト、'Z'+0x80→ッ)

    5日目分はその後、
    ・変数を表示(付録コンパイラのsprintfを使用)
    ・マウスカーソルを描画(まだ動かない)
    ・GDT(Grobal segment Descriptor Table),IDT(Interrupt Descriptor Table)の初期化
    をします。
    この最後のGDT,IDTあたりが曲者で、大分難しい話になります。
    分からなかったら雰囲気だけつかんで後で戻ってくればいいと書いてあったのでそのとおりにします。
    とりあえず、GDTはメモリをセグメントに分けて管理するためのもので、IDTは割り込みを処理するためのもののようです。
    よし雰囲気つかんだ。

    ◆6日目分
    まず分割コンパイルについてです。
    まあなんというか、こうすると分割できるのねって感じです。
    昔からよく分かりませんでしたが、やっぱりよく分かりません。

    それからGDTの説明の続き。

    最後に割り込みの処理。これでキーボードが押されたことが分かるようになりました。
    キーボード割り込みの認識
    ちなみに何のキーが押されたかはまだ分かりません。
    それとマウスの割り込みはまだ認識出来ません。

    つくづく先が気になる構成です。

    ◆7日目分
    えー、この日は、
    138ページの挿絵漫画のネコマタが可愛かったです。

    あとはまあキーコード取得したりマウス割り込みを認識したりバッファを作ったり。

    ◆8日目分
    なんだか7日目の最後に
    明日はこのマウスデータを解読して、ついにマウスカーソルを動かしましょう! 楽しみですねえ。……あ、そこのきみ、だめだよ先を読んじゃ。今日は寝るの。続きはあした。分かった?
    なんて書いてあったんですけど…、
    そんなこと言われたらますますやりたくなっちゃいますよね。
    マウス
    あまり難しいところもなくわりとすんなり理解できました。
    ちなみに下のタスクバー風の部分に触れると背景がおかしくなるのは仕様です。

    8日目の残りは以前後回しにした32bitモード切替とC言語連携の説明。
    眠い頭で理解できるわけもないので明日へ回す。

    -----

    ◆今日の成果◆
    文字が出せるようになった。
    キーボードとマウスのデータを受け取れるようになった。  
    タグ :OS自作

  • OS自作[4]_4日目
    2008年08月11日 15:27

    なんだかんだで昨日寝る前に4日目まで終わってしまいました。予想以上のハイペース。

    4日目の内容はビデオメモリの書き込みです。
    これでどんな絵も自由に表示できるようになったわけです。(ただし16色320×200px)
    詳しく説明すると、まずパレットの指定をします。
    これがなかなか厄介で、C言語と機械語をつなぐコードをアセンブリ言語でちまちま作る必要があります。
    このC言語とアセンブリ言語のつなぎがいまいち理解できていません。
    が、先に進みます。
    そこからはC言語の領域になるので大分楽。
    ポインタ関連で多少難し目な操作もありましたがポインタはそれなりに理解しているのですんなり進めました。
    あとは長方形を書く関数を作って4日目終了。
    出来た画面がこれです。
    OS風画面
    うん、OSっぽい。中身は何も無いけどね。


    あと寝る前に5日目分も読むだけ読んでおきました。

    -----

    ◆今日の成果◆
    任意の画面が出せるようになった。  
    タグ :OS自作

  • OS自作[3]_2,3日目
    2008年08月10日 23:42

    1日目のソースは中心部分が機械語を16進数のままただ並べただけだったのが、2日目にはアセンブリ言語で書かれて意味が理解できるようになりました。
    2日目はその解説に費やされたのでプログラムの中身は1日目と変わりありません。
    あとmake.exeの使い方の説明が少々。あんまり理解できてません。


    そして3日目にちょっと突入。
    3日目はディスクの読み込みです。
    今まで読んでたのは最初の512バイトだけだったので、それ以降を読むプログラムを作ります。
    作りますというか、ソースは全部用意されてるのでコピーしてきて実行するだけです。
    自分で書かなきゃ身につかないのは分かってるんですけど、なんだかあんまり面白くないのでわりと飛ばし気味です。
    まあ必要になったら戻ってくることにします。

    -----

    ◆今日の成果1◆
    アセンブリ言語で文字を出す方法を学んだ
    フロッピーを読む方法を学んだ

    -----

    '08.8/11-02:07 追記
    なんだか切りが悪いので3日目の終わりまでやっちゃいました。

    あの後に出来たのがこちら。折角なので実機動作で。
    画面汚い…。
    …んー、この前のと見た目おんなじですね。

    でも中でやってることは大違いで、
    前の : 最初に読んだ所(ブートセクタ)に文字を出す命令が書いてある
    今の : ブートセクタにはフロッピーを読む命令が書いてあって、新たに読んだ所に文字を出す命令が書いてある
    という違いがあります。
    ちなみにサンプルは画面モードを切り替えて真っ黒な画面を出すものだったんですが、面白くないので文字を表示させています。
    だんだん中身が分かってきたのでこれくらいはいじれるようになりました。

    まだ分からないところも多々ありますが(ファイルシステムとかレジスタの初期化とか)、このまま進めば分かってくるのかなと期待が膨らみます。

    で膨らんだところで32bitモード突入&開発がC言語に。
    C言語で作った部分を読み込むためにアセンブリ言語側に謎のコードがたくさん加わって、またブラックボックスに逆戻りです。
    あー、こうやって次を読まなきゃいけない気にさせるわけですね。なかなかいい構成の本です。

    -----

    ◆今日の成果2◆
    フロッピーを読んだ上で文字を出すことを学んだ
    明日への意欲が湧いた

    -----

    -余談-
    この本は中古で買ったんですが、中に大分書き込みがありました。
    まあ書き込みといっても黄色の蛍光ペンで重要語句にチェックがついてるだけなので読む上でそこまで問題はなく、許容範囲内。
    でもAmazon上の状態説明には書き込みがあるとは一言も書いてなかったよなあ…。「状態」は「可」だったけど。
    …と思って記述を見直してみると、「全体に使用感あり」ってあった。んー、使用感ってそういう意味なのかな。

    でその書き込みですが、3日目の最後のあたり、59ページを最後にぷっつりと途絶えています(全705ページ)。
    ああ、そこで諦めて売ったんですね。まさに三日坊主。
    とりあえず前の持ち主は越えられたようです。

    -余談2-
    そういえば前回書くの忘れてましたが、動作確認用に使ってるPCについて。
    ちょっと前に秋葉原で買って来た中古とジャンクの境目あたりの品で、スペックは、
    CPU : AMD-K6 3D (PentiumII相当らしい) 周波数不明
    メモリ : 64MB
    HDD : 3GB
    OS : Windows98
    ドライブ : FDD, CD-ROM
    てな感じです。
    親がPCの操作を覚えたいと言うので(親の金で)買ってきたのですが、なんだかあまり使っていないようです。
    最近ネットにつなげることに成功したもので色々ソフトを入れたりしてわりと自分用になってる気がします。
    そんなわけで今回も勝手に使ってます。  
    タグ :OS自作

  • OS自作[2]_1日目
    2008年08月10日 03:44

    さて1日目の最初は、バイナリエディタで1.44MBのファイルを書くことから始まります。
    と言っても大半が0で埋まってるんで実質0x90バイトほどです。
    000000  EB 4E 90 48 45 4C 4C 4F 49 50 4C 00 02 01 01 00   N HELLOIPL     
    000010 02 E0 00 40 0B F0 09 00 12 00 02 00 00 00 00 00 @
    000020 40 0B 00 00 00 00 29 FF FF FF FF 48 45 4C 4C 4F @ HELLO
    000030 2D 4F 53 20 20 20 46 41 54 31 32 20 20 20 00 00 -OS FAT12
    000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    000050 B8 00 00 8E D0 BC 00 7C 8E D8 8E C0 BE 76 7C 8A | v|
    000060 04 83 C6 01 3C 00 74 09 B4 0E BB 0F 00 CD 10 EB < t
    000070 EE F4 EB FD 0A 0A 68 65 6C 6C 6F 2C 20 77 6F 72 hello, wor
    000080 6C 64 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 ld
    (略)
    0001F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA U
    000200 F0 FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00
    (略)
    001400 F0 FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00
    (略)
    167FF0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    こんな感じ。(略)は全部0です。

    これを打ち込んで、付録のフロッピーイメージ書き込みソフトでフロッピーに書き込めばOS(?)第1号の完成です。
    わざわざ打ち込まなくても完成品が用意されてるんですが、あえて打ち込みました。
    なんか昔は雑誌にBASICプログラムが載ってて、みんなそれを打ち込んでゲームやってたらしいですけど、こんな感じだったんでしょうかね。
    まああれは意味の分からない16進数を打つのと違って比較的意味の分かるコマンドを打つんですけど。
    ちなみに16進数の打ち込みは左手がホームポジション、右手がテンキーです。A-Fは皆左手領域にあるのでうまい具合に打てて便利。

    さて、これが何をするかと言うと、起動すると「hello, world」と表示するだけです。
    OS1-1
    こんな感じに。
    いやー、でも感動ですよ。フロッピーから直接ブートするプログラム書いたことなんて未だかつてないですから。
    ただ一つ問題があるとすれば、今書いたものの意味がさっぱり分からないってことですね。


    プログラム2つ目。ここからアセンブリ言語です。ちなみにアセンブラも付録CDに入ってます。
    しかしこれは1バイト書く命令使ってるだけで実質的にさっきの16進数打つのと変わりません。
    これでは面白くないのでちょっと文字を書き換えてみました。
    OS1-2
    いちいちPC立ち上げるのも面倒なのでエミュレータを使うことにします。
    このエミュレータも付録です。いたれりつくせりな本ですね。


    そしてプログラム3つ目。
    ちょっとコメントがついたり記述が分かりやすくなってます。
    でもプログラム本体は謎のまま。
    あまり面白くないのでそのまま実行して終わりにします。
    ちなみにこの段階で、表示する文字が自由に変えられるようになってます。さっきわざわざASCIIコード調べて書かなくても良かったみたいで。


    そんなところで1日目は終了。
    そういえばふと気づいたんですが、実機で実行したのとエミュレータで実行したので1箇所違っている点があります。
    プログラムを見ると分かるんですが、改行のところで0x0A(=LF)だけを入れているので、実機では行が1つ下がるだけでカーソルが行頭に戻っていません。
    それに対してエミュレータの方はきちんと行頭まで戻っています。
    Linuxっぽい?

    -----

    ◆今日の成果◆
    フロッピーから起動すると任意の文字列を表示する。  
    タグ :OS自作

  • OS自作[1]_到着
    2008年08月08日 23:58

    もう来た! 早いよ!
    『OS自作入門』
    表紙のネコマタが萌えますね~。

    さて日記の方針ですが、
    ◆いつ書くか
    「本を読んで何か作ったらその当日に書く」とします。
    ちなみに当日というのは24時までじゃなく寝るまでってことで。自分夜行性なもので。
    ◆何を載せるか
    進展具合と感想、写真つきで。
    毎日完成したファイルを上げてるブログとかありましたが、あまり需要を感じないのでやらないつもりです。需要があるなら考えます。
    完成したら一応上げようかな。
    ◆完成予定
    あまり30日以内に完成させる気はありません。今から30日以内という意味でも、実働30日以内という意味でも。
    まあ、できたらいいなとは思いますが。
    ◆タイトルフォーマット
    「OS自作[n]_m日目」
    の形を基本としようと思います。
    nは日記ごとの続き番号、「m日目」はこの本の章名です。
    1章に何日もかけた場合は「_m日目l」な感じで。

    ところで3つ目の整数ってどんな名前付けてます?
    自分はn→m→lなんですけど、1と紛らわしいんですよね…。
    かといって高々(*)3つでnmの形を使うのも大げさだし。

    *高々 : 数学用語の方ではない。  
    タグ :OS自作

  • OS自作[0]
    2008年08月06日 22:54

    『30日でできる! OS自作入門』を買ってみた!

    以前から気になっていた本なんですが、ふとAmazonを見たら安かったので思わずポチッとな。
    届いたらここで日記をつけながらOS作ってみる予定です。  
    タグ :OS自作