TextOutした文字をビットマップにしたい – プログラミング – Home

TextOutした文字をビットマップに...
 
通知
すべてクリア

[解決済] TextOutした文字をビットマップにしたい


あら
 あら
(@あら)
ゲスト
結合: 22年前
投稿: 8
Topic starter  

こんにちはあらと言います。よろしくお願いします。
Win98Se VC++6.0のMFCを使用しています。

ビットマップとか描画関係を勉強中ですが、どうしてもわからないことがあるので質問します。
フォントの文字を1文字づつビットマップにしようとしたのですが、4E00から始めると途中の
0x7F00位からデータが取得できなくなってしまいます。
ちょっと調べたところ、ExtTextOutWもGetDiBitsも失敗はしていないようです。
ソースを以下に載せておきます。
何かおかしい、足りないところがあればご指摘ください。
よろしくお願いします。

//////////ソース//////////////////
CDC memdc;
CBitmap bmp;
CBitmap *oldbmp;
CFont fnt;
CFont *oldfnt;
char *bi, *bytes;
LPBITMAPINFO pbi;
BITMAPFILEHEADER bf;
LOGFONT lf;
RECT rect = {0, 0, 128, 128};
CString szStr;

int biSize = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 2;
bi = new char [biSize];
bytes = new char [128 / 8 * 128];

pbi = (LPBITMAPINFO)bi;
memset(bi, 0, biSize);
pbi->bmiHeader.biPlanes = 1;
pbi->bmiHeader.biBitCount = 1;
pbi->bmiHeader.biCompression = BI_RGB;
pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbi->bmiHeader.biHeight = 128;
pbi->bmiHeader.biWidth = 128;
pbi->bmiColors[0].rgbRed = pbi->bmiColors[0].rgbGreen = pbi->bmiColors
[0].rgbBlue = 0;
pbi->bmiColors[1].rgbRed = pbi->bmiColors[1].rgbGreen = pbi->bmiColors
[1].rgbBlue = 0xFF;

bf.bfType = 0x4D42;
bf.bfReserved1 = 0;
bf.bfReserved2 = 0;
bf.bfOffBits = sizeof(BITMAPFILEHEADER) + biSize;
bf.bfSize = bf.bfOffBits + 128 / 8 * 128;

memset(&lf, 0, sizeof(LOGFONT));
lf.lfHeight = 128;
lf.lfWeight = FW_NORMAL; // = 400
lf.lfCharSet = SHIFTJIS_CHARSET; // = 128
lf.lfPitchAndFamily = FIXED_PITCH;
strcpy(lf.lfFaceName, MS 明朝);

memdc.CreateCompatibleDC(NULL);
bmp.CreateBitmap(128, 128, 1, 1, NULL);
fnt.CreateFontIndirect(&lf);
oldfnt = memdc.SelectObject(&fnt);
oldbmp = memdc.SelectObject(&bmp);

for (WORD wCode = 0x4e00; wCode <= 0x9FFF; wCode++) {
ExtTextOutW(memdc.m_hDC, 0, 0, ETO_OPAQUE, &rect, &wCode, 1, NULL);
GetDIBits(memdc.m_hDC, (HBITMAP)bmp.m_hObject, 0, 128, bytes, pbi,
DIB_RGB_COLORS);

szStr.Format(test\\%X.bmp, wCode);
CFile file(szStr, CFile::modeCreate | CFile::modeWrite |
CFile::typeBinary);
file.Write((char*)&bf, sizeof(BITMAPFILEHEADER));
file.Write((char*)pbi, biSize);
file.Write(bytes, 128 / 8 * 128);
file.Close();
}

delete [] bytes;
delete [] bi;
memdc.SelectObject(&oldfnt);
memdc.SelectObject(&oldbmp);
memdc.DeleteDC();
bmp.DeleteObject();
fnt.DeleteObject();
MessageBox(終了);
}


引用未解決
トピックタグ
ku
 ku
(@ku)
ゲスト
結合: 25年前
投稿: 312
 

UNICODEを使っているのだと思いますが
僕が持っているATOKについているUNICODE表一覧では
0x7e9f~0x7f35までは実際には文字は表示されません
フォントはMS ゴシック等です

選択しているフォントファイルに指定したコードのフォント情報が無いため
描画できてないのかなと思いました

MS UI Gothicフォントの一覧にはこの辺りのコードのフォントが実在するようです
MS UI Gothicフォントを使った場合はどうでしょうか?


返信引用
あら
 あら
(@あら)
ゲスト
結合: 22年前
投稿: 8
Topic starter  

こんばんは、あらです。
見事に文字化けしてますね。
すいませんです。

kuさん返信ありがとうございます。
MS UI Gothicでやってみましたが、やはり最後の方は文字のデータが取れませんでした。
他のフォントも試してみましたがやはりダメでした。
リソース不足?とも思いましたが、リソースメーターを見る限りそんな事はないようでした。
あと、MFCを使わないでもやってみましたが、同じ結果になってしまいました。

できないのはくやしいので他の方法でと思い、GetGlyphOutlineを使用するやり方で出来まし
た。
とりあえず解決チェックをつけておきますが、本当の意味での解決ではありませんので何かわか
ることがある方は書き込みよろしくお願いします。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました