|
昨日書いた記事、7月31日の晩ごはん、ってなってましたが、 よく日付見たら、8月1日でした(^^;; この日は朝からバリバリ働いて、水呑みプログラマーになっていた日でした。 で、夜にカレーうどん食べた、と。 そんなわけで、記事もチョト直しておきました。。 気持ちの浮き沈みも大きくて、困っちゃいますね(^^; ☆ さて。 今日は朝から挫けてたあたしですが、 実は思いついたことがあって、お仕事少ししました(^^ 結果です。 文章もちゃんときれいに出るようになりましたよ(^^ おめでとう〜〜〜って言うのはチョト早い。。 これ、メチャクチャ重いんです。 ファイルサイズも大きいし、作る時間もチョー長い。 今回は、少し詳しく書いちゃいましょうかね(^^; 興味のない方は飛ばしちゃってケッコーですが、 出来るだけわかりやすく書くので、読むだけは読んでください。 こういう画像を表現する方法は大きく分けて、2種類あります。 一つは、画像を細かく区切って、 一つ一つの小さな点の色をデータとしてまとめたビットマップ方式。 もう一つは、画像に描かれる図形や文字の情報を、 一つ一つ描く順に並べたメタファイル方式。 Windowsのソフト、ペイントで作るのはビットマップ、 デジカメで撮った写真はJPEGという方式ですが、 これもビットマップの一つで、 完全なビットマップからある方式で色を抜いてデータ量を減らしたものです。 その他、PNGなども、ビットマップのデータを圧縮した形式です。 一方のメタファイルというのは、編集するソフトもあまりないし、 一般の方はほとんど触れる機会がないと思われます。 が、PDFは、ある種のメタファイルです。 ページのサイズなどの大まかな情報と、 どこからどこまで何色でどんな太さの線を引く、 これこれのフォントでこれこれの文章を書く、 などの描画情報を集めたデータなのです。 あたしの作ったソフトで出来るのも、ある種のメタファイル。 ※「ある種」と言っているのは、本来のメタファイルは Windows Metafile とよばれ、 そのデータの形式はすでに決められているため、 他の手順型画像ファイルは厳密にはメタファイルとは呼べないからです。 メタファイルでないと、描かれた部品を修正することができません。 ペイントで線を引いたとき、一度その線を確定しちゃうと、 あーもっと斜めの方が良かった、と思っても直すことはできませんね。 作業を取り消して、もう一度引き直すしかない。 これは、ビットマップが点の集合であり、 一度その集合に描きこまれたものは画像の一部に溶け込んでしまうから。 メタファイルは一つ一つの図形の情報を持っているため、 一番最初に描いた四角形をもう少し大きくしようとか、 青く塗りつぶそうとか、 あとから編集するのが簡単にできます。 それと、内容にもよりますが、 一般的に、ビットマップはファイルにしたときにサイズが大きくなり、 メタファイルはサイズが少なくて済みます。 例えば、A4の真っ白なページを表現する場合、 ビットマップではA4サイズ分の白い点のデータを持たなければなりませんが、 メタファイルではサイズがA4である、という情報だけ持てばよいからです。 以前音楽データについて書いたとき、 WAVE データは音そのものを全部データにしたものでサイズがデカい、 MP3 データは WAVE データのうち人の耳に聞こえない部分とかを省略して圧縮したものでチョト小さい、 MIDI データは音符一つ一つのデータを集めたものでかなり小さい、 と書きましたが、 それと同じ関係が、 ビットマップ、JPEG、メタファイルにあるわけです。 さて、ビットマップとメタファイルの違いが分かったところで。 あたしの作ったツールは次のような手順で画面表示や印刷を行っています。 1.プリンターが持っているメタファイルを描くキャンバスを借りてくる。 2・そのキャンバスにデータ通りの字形を描画する。 3.印刷するときは、そのキャンバスをそのまま印刷する。 4.画面に表示する場合には、表示する画面のキャンバスにプリンターのキャンバスを模写する。 こんな感じ。 模写する、というのは、印刷する場合の画素数と、画面の画素数が違うため、 普通にコピーしたのではたいがいはみ出してしまうので、 プリンターのメタファイルを縮小しながら描き直してる、ということです。 実際には StrechDraw という命令で、コンピュータが描き直してるんですけどね。 今回見つけたツールが使える、と思ったのは、 そのツールがメタファイル用のキャンバスを持っていたからです。 つまり、あたしのプログラムからほとんど修正なしに、 直接そのキャンバスに描きこむことができる。 描きこむ先をプリンターのキャンバスからツールのキャンバスに替えればよいだけ。 それで、最初は動かなかったけど、親切な人に教えてもらって動くようになってから、 ほとんど時間もかからずに、PDF化するプログラムに書きかえることが出来た。 駄菓子菓子。 そのツールのキャンバスには欠陥があったのです。。 出ない線はあるし、文字は詰まっちゃうし。 それで、直接描きこむのは止めて、画面に表示するときと同じように、 プリンターのキャンバスを借りて来て、そこから模写する形にしたんだけど、 模写なので、やぱ、キャンバスの欠陥はそのまま出てしまったわけです。 そのツールの内部までいじるのは無理なので、バンジー急須だったわけですが・・・ ふと、思いついた。 プリンターのメタファイルキャンバスを、 画像=ビットマップとしてツールに描きこめば、崩れようがないんじゃないか?? 要するに、プリンターが描いたページを写真に撮って、 ツールのキャンバスにべた〜〜っと貼り付けちゃえばいいんじゃないかと。 やってみた。 プリンターのキャンバスをビットマップに変換して、 ツールのキャンバス全体にべた〜〜。 でも、勝手に縮小されてる・・・ これもツールのバグですね。 ツールの持つページの情報から、幅と高さを取得して、 その大きさに描きこんでも縮小されるってのはおかしい。 仕方がないので、試行錯誤で、 ページの1.3倍くらいの大きさを指定するとちょうどいいらしいというのを発見して、 とりあえず、 見られる形でPDFに出力することが可能になった。 ただし。 上に書いたように、ビットマップはメタファイルよりはるかにデータ量が多いのですよ。。 普通なら50KBくらいになるはずのPDFファイルのサイズが、3500KBとかになっちゃう・・・ そのくらいになると、ファイルに書きこむのに1分くらいかかるからねぇ。。 3500KBって書くと良く分かんないけど、3.5MBですよ、メガ!! やぱ、現実的には、使えない。。 同じように、メタファイルキャンバスを持つ別のツールを探さないとイケナイな〜〜 最初は、コリコリとプレーンのPDFを書くことを考えたけど、 あたしのプログラムは、Windowsの機能だけでは表現できないところを表現できるように、 ものすごく凝った作りになってるんですよ。 例えば、−・−・− 一点鎖線とか、 キャンバスに「これから描く線は一点鎖線ですよ」って教えておけば、 ピーって線を引いたときに、一点鎖線になってくれる。 んだけど、この線と点の間隔は常に一定なので、 太い線で一点鎖線を描くと、スキマが潰れちゃって一点鎖線にならない。 そこで、あたしのプログラムでは、点線系が指定されたときは、 太さを考慮して、線と点の間隔を計算し直して、 一つ一つ細かい線を描くように作ってある。 文字にしても、ワープロでは普通の、均等割り付けとか、両端揃えは、 windows の基本的な仕様では表現できないので、 文字の大きさ、文字数から計算して、1文字ずつ書いてたりする。 複数行のときの、縦方向の均等割りとか両端揃えも用意してるので、 縦も横も均等、って指定されたら、 本当に、全部1文字ずつ位置を計算して書いてるのよ。。 あと、行頭に「、。・・・」などが来ないようにする禁則処理も、 windows の基本仕様にはないので(英語用のならある)、 1行に入る文字数を計算して、 次の行の先頭に禁則文字が来る場合は、前の行の末尾に移動して、 その分文字がはみ出したりしないように、そこだけは両端揃え処理にして文字を詰め込んだり・・・ ショージキ言って、自分で自分のプログラム見て何やってんだか分かんないくらい複雑。 その処理を、全部、PDF用に追加して行かなきゃいけないかと思うと、 オテアヘ〜〜〜〜 って気分になっちゃうのですよ。。 まぁ、それでも、コツコツやる気ではいますけどね。 「良さげ」じゃなくて「良い」ツールが見つかるまで、 コツコツやるっきゃない。 で、ほとんど出来上がるってときに、良いツールが見つかったら、 コツコツは全部捨てる!! その方がプログラム的に美しいもの。 美しくないプログラムなんて、プログラムじゃないわ。 その点、ガイジンは割り切ってるよね〜〜 PDFの仕様にしたってグチャグチャだし、 YoutubeやFacebookなんかも使い勝手がメチャクチャだし。 あたしなら、一つの機能の追加でプログラムが汚くなっちゃうなら、 全部作りかえるからね(^^;; そのために、昔からスタートダッシュで一気に進めてきたのよ。 見直しと仕様変更対応の時間が十分取れるように。 関係ないけど、夏休みの宿題だって、 日記系と育成系以外は7月中に終わってたしね(^^ あたしの人生も、20代で終わってた・・・・?? しまった、書くのに夢中になって、こんな時間・・・・ これから、ご飯作って食べま〜〜す(^^;; |

- >
- コンピュータとインターネット
- >
- コンピュータ
- >
- ソフトウェア





