- PR -

漢字からビットマップ変換について(BDF、PCF)

投稿者投稿内容
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2007-12-19 16:49
説明不足でしたが、2値のビットマップというのは、


1ビット/1ピクセルで、ビットが立っていれば黒(文字)、立っていなければ白(背景)
というデータのことを言っています。


1行分が16進数ということでしたが、サイズは何バイトなのでしょうか?

1バイト/1行とすると、ぽぴ王子さんが示してくださった図のようになります。
(8ビット/1バイトですから。。)

2バイトなら縦横16ピクセルになります。


引用:

確かに2進数に自分で書けばokなのですが、全ての文字を2進数で自作するのは大変そうなので、
2進数へ変換後のものがBDF or PCFだったらなぁと思ってました。^^;
ビットマップ展開された文字が2進数表現されているものはないでしょうか・・



まさに2値のビットマップがそれです。

BitmapクラスのLockBits() UnlockBits() を使って、
byte*に取り出せば良いと思います。

(参考サイト:http://junki.lix.jp/csgr/002ColorDataAccess1.htm)

具体的には、

コード:

Bitmap bitmap;
BitmapData data;
IntPtr pixels;

// ...

data = bitmap.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format1bppIndexed);

pixels = data.Scan0;

unsafe
{
byte* pBits;
// ...

//Init pointer to the Bits
if (data.Stride > 0) pBits = (byte*)pixels.ToPointer();
else pBits = (byte*)pixels.ToPointer() + data.Stride * (height - 1);

// ...
}

bitmap.UnlockBits(data);



http://www.dotnet247.com/247reference/msgs/22/112817.aspx

こんな感じで取り出すのですが、詳しくは上記サイトを。。

あとは(2バイトの場合)、

コード:
short hexdata;


hexData = *(short*)pBits;



ということです。

引用:

あと、ドットの並びは『縦』です。



これは本当なら面白いですが、勘違いの可能性があります。

(ぽぴ王子さん、図をお借りします)

コード:
( 1)□□□□□□□□ ( 9)□□□□□□□□ (17)□□□□□□□□ 

( 2)□□□■■□□□ (10)□□□■■□□□ (18)□□□■■□□□
( 3)□□■□□■□□ (11)□□■□□■□□ (19)□□■□□■□□
( 4)□■□□□□■□ (12)□■□□□□■□ (20)□■□□□□■□
( 5)□■■■■■■□ (13)□■■■■■■□ (21)□■■■■■■□
( 6)□■□□□□■□ (14)□■□□□□■□ (22)□■□□□□■□
( 7)□■□□□□■□ (15)□■□□□□■□ (23)□■□□□□■□
( 8)□□□□□□□□ (16)□□□□□□□□ (24)□□□□□□□□



上図の番号どおりではないでしょうか?

ある意味、『縦』ですが、
1文字のドットの並びは『横』方向です。

確認したほうが良いかと思います。



[ メッセージ編集済み 編集者: あぶぽん 編集日時 2007-12-19 17:12 ]
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-12-19 18:25
引用:

用途・目的は社内プレゼンのみなので、世に出ることはありません。
フォントのライセンス違反に関しては問題ないのかなと思います。



法人だけど私的利用だから問題ないってことはないです。
とりあえずそれなら著作権法違反にはならないのかもしれませんが、
ライセンス違反の可能性もあります。

商用OKなフリーフォントはいっぱいあるので、
それを使ったほうがいいと思いますよ。

適当に「フリーフォント」とかで検索しましょう。

http://www.akibatec.net/freefont/
とか
http://www.zukeran.org/shin/jdoc/
とかで。

ビットマップフォントを
ビットデータに変えるのは、
あぶぽんさんのようにイメージに貼り付けるのが楽だと思いますが、
ドライバに依存したりするのが嫌なので
私ならフォーマットを解析します。

---ここから脱線---
引用:

ぽぴ王子さんの書き込み (2007-12-19 15:20) より:
電子掲示板ってば右から左へ<del>受け流す</del>流れる
のが多いので、縦でスライスして持ってた方が便利なんじゃ
ね?とか思ってたです。



私も最初そう思ったんですが、
あきらめて普通にビットシフトしてました。

ビットマップを送るタイプの電光掲示板は
普通のディスプレイと同様な座標軸を持つ、
というの優先しているのだろうと思ってます。

でも、縦もあるんですねぇ。

調べてみたら結構ありました。
LCD系は縦が多いようです。
カラーになると横が多くなるような傾向があるようですが。
やはり用途によるのでしょうね。

[ メッセージ編集済み 編集者: れい 編集日時 2007-12-19 18:57 ]
moco
ベテラン
会議室デビュー日: 2006/05/01
投稿数: 54
投稿日時: 2007-12-20 00:10
ぽぴ王子さん、あぶぽんさん、れいさん、何回もアドバイスくださってありがとうございます。

引用:

うーむ、誰も全ての文字を「手作業で」変換しろとは言ってないわけで。
さすがにそれは無理というか、普通はコンバータなどを作ってビットマップデータ
をバイナリに落とす作業をさせますよね


引用:

 1.ビットマップを新規生成してそのGraphicsを得ます。

 2.Graphics#DrawString()で、漢字をピットマップに描画します。

 3.Bitmap#Save()で、ビットマップを保存します。


フォント問題がありますが、まずコンバータを作ってみました。
Bitmapに文字を描画し、得られたBitmapの1つ1つのピクセルを読み取って
文字の2値を得ました。
でもBitmapに文字を描画すると文字がぼやけています。
なぜでしょう・・アンチエイリアス関係を探っているところです。

引用:

1行分が16進数ということでしたが、サイズは何バイトなのでしょうか?


2バイトになります。電光掲示板自体はタテ16bit×ヨコ32bitです。
あとやはり『縦』のようです。
試しに文字をコンバートして電光掲示板に送信すると、
意図した並びで光りました。

引用:

商用OKなフリーフォントはいっぱいあるので、
それを使ったほうがいいと思いますよ。

適当に「フリーフォント」とかで検索しましょう。

http://www.akibatec.net/freefont/
とか
http://www.zukeran.org/shin/jdoc/
とかで。


ありがとうございます。
大変参考になります。

また明日会社に行ったら、
@ライセンスに違反しないフォントを使用すること。
A文字のぼやけ原因を突き止めること。
Bあぶぽんご紹介の英語サイトに挑んでみること。
を、やってみます^^

あ、すいません。れいさんの書き込みで、
引用:

ドライバに依存したりするのが嫌なので
私ならフォーマットを解析します。


とは、どういう意味ですか?
是非おしえてください。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-12-20 06:14
引用:

mocoさんの書き込み (2007-12-20 00:10) より:
引用:

ドライバに依存したりするのが嫌なので
私ならフォーマットを解析します。


とは、どういう意味ですか?



イメージにフォントを描画する処理はOSによっても違いますし、
もしかするとドライバによっても変わる可能性があります。
ですから
引用:

でもBitmapに文字を描画すると文字がぼやけています。
なぜでしょう・・アンチエイリアス関係を探っているところです。


こーゆーことが起きないように、
自分でBDFなり何なりのフォーマットを調べて、
ビットマップデータを読み込むということです。
moco
ベテラン
会議室デビュー日: 2006/05/01
投稿数: 54
投稿日時: 2007-12-20 08:21
引用:

こーゆーことが起きないように、
自分でBDFなり何なりのフォーマットを調べて、
ビットマップデータを読み込むということです。


そういうことなんですね。
早速調べてみます。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-12-20 11:33
引用:

mocoさんの書き込み (2007-12-20 00:10) より:

フォント問題がありますが、まずコンバータを作ってみました。
Bitmapに文字を描画し、得られたBitmapの1つ1つのピクセルを読み取って
文字の2値を得ました。
でもBitmapに文字を描画すると文字がぼやけています。
なぜでしょう・・アンチエイリアス関係を探っているところです。


コンバータを作られたということは、ビットの並びなどについてはご存知と
いうことでしょうか。前の僕の説明は要らなかったかな。
アンチエイリアス関係は、一時的に画面のプロパティで「次の方法でス
クリーン フォントの縁を滑らかにする」のチェックをはずすという方法もあり
ますね。


あと、れいさんの発言からちょっと<del>のまネコ</del>インスパイヤされ
てみましたが、bdf2bmp というツールがあります。BDF フォントの字形を
BMP ファイルとして作成してくれます。BDF フォントのフォーマットを今から
解析するのは大変かもしれませんので、このツールを使って画像に変換
したものを改めて掲示板に使える形式にコンバートするというのも有り
かもしれません。
サイトから Public Domain な BDF フォントへのリンクなどもありますの
で、参考になるでしょう。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-12-20 14:17
引用:

アンチエイリアス関係は、一時的に画面のプロパティで「次の方法でス
クリーン フォントの縁を滑らかにする」のチェックをはずすという方法もあり
ますね。



そんな乱暴な。

Graphics.TextRenderingHint 使った方がいーと思う。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-12-20 15:11
引用:

渋木宏明(ひどり)さんの書き込み (2007-12-20 14:17) より:

そんな乱暴な。

Graphics.TextRenderingHint 使った方がいーと思う。


あらホント。って調べてないのバレバレですね orz

コンバータなので、どうせ恒常的に使うものでもないし自分で切り替えて
あとで戻せばいいかしらん?とか脳内完結してました。
メソッド一発ならそっちの方がいいですね。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。

スキルアップ/キャリアアップ(JOB@IT)