トップページ > 過去ログ > 記事閲覧
ソフトイメージに文字描画時のエッジの件
名前:クラスクラス 日時: 2011/03/05 21:26

シフトウエア-イメージに文字を描画した場合のエッジ処理について。 この関数は非公開委の関数を使用していますが、下記の点で疑問があり質問しています。 1、文字のエッジ出しのために、shno2のイメージハンドルに文字の縁を書き出しています。 しかし、白色で出てしまうので合成するとただの太い文字になってしまうため、1ピクセルおきに 黒に色を書き換えていますが、スマートではありません。 なにか、縁の色を指定する方法はありませんでしょうか? また文字の色も指定できないでしょうか? 2.直接描画のほうもエッジを指定すると、白で文字を書いていますが、何故か黄色っぽくなります。 これはバグ?それとも何かのミスや思い違い?  お忙しいと思いますが、よろしければ教えてください。 よろしくお願いいたします。 #include "DxLib.h" // WinMain関数 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( true ); SetGraphMode(800, 600, 32); // DXライブラリの初期化 if( DxLib_Init() == -1 ) return 0 ; int Cr = GetColor( 0 , 0 , 255 ) ; // 青色の値を取得 DrawBox( 0 , 0 , 800 , 600 , Cr , TRUE) ; // 四角形を描画 // 作成したデータの識別番号を変数 FontHandle に保存する int FontHandle1 = CreateFontToHandle( NULL , 20 , 3 ,DX_FONTTYPE_NORMAL); // : ノーマルフォント int FontHandle2 = CreateFontToHandle( NULL , 20 , 3 ,DX_FONTTYPE_EDGE); // : エッジつきフォント int FontHandle3 = CreateFontToHandle( NULL , 20 , 3 ,DX_FONTTYPE_ANTIALIASING); // : アンチエイリアスフォント int FontHandle4 = CreateFontToHandle( NULL , 20 , 3 ,DX_FONTTYPE_ANTIALIASING_EDGE); // : アンチエイリアス&エッジ付きフォント ) // 作成したフォントで画面左上に『Hellow!!』と白色の文字列を描画する DrawStringToHandle( 0 , 0 , "DrawStringToHandleのDX_FONTTYPE_NORMALでHELLOW!!" , GetColor( 255 , 255 , 255 ) , FontHandle1 ) ; DrawStringToHandle( 0 , 40 , "DrawStringToHandleのDX_FONTTYPE_EDGEでHELLOW!!" , GetColor( 255 , 255 , 255 ) , FontHandle2 ) ; DrawStringToHandle( 0 , 80 , "DrawStringToHandleのDX_FONTTYPE_ANTIALIASINGでHELLOW!!" , GetColor( 255 , 255 , 255 ) , FontHandle3 ) ; DrawStringToHandle( 0 , 120 , "DrawStringToHandleのDX_FONTTYPE_ANTIALIASING_EDGEでHELLOW!!" , GetColor( 255 , 255 , 255 ) , FontHandle4 ) ; int shno1 = MakeARGB8ColorSoftImage(800,200); FillSoftImage(shno1,0,0,0,0); int shno2 = MakeARGB8ColorSoftImage(800,200); FillSoftImage(shno2,0,0,0,0); BltStringSoftImageToHandle(0,0,"BltStringSoft・・・のDX_FONTTYPE_NORMALでHELLOW!!",shno1,-1,FontHandle1); BltStringSoftImageToHandle(0,40,"BltStringSoft・・・のDX_FONTTYPE_EDGEでHELLOW!!",shno1,shno2,FontHandle2); BltStringSoftImageToHandle(0,80,"BltStringSoft・・・のDX_FONTTYPE_ANTIALIASINGでHELLOW!!",shno1,-1,FontHandle3); BltStringSoftImageToHandle(0,120,"BltStringSoft・・・のDX_FONTTYPE_ANTIALIASING_EDGEでHELLOW!!",shno1,shno2,FontHandle4); // 縁の部分を黒くする (う〜〜んスマートでない方法)------------ int r,g,b,a; for(int x=0;x<800;x++) { for(int y=0;y<200;y++) { GetPixelSoftImage(shno2,x,y,&r,&g,&b,&a); if(r ==0x00ff && g ==0x00ff && b ==0x00ff) { DrawPixelSoftImage(shno2,x,y,0x00,0x00,0x00,a); } } } int ghno2 = CreateGraphFromSoftImage(shno2); DrawGraph(0,200, ghno2, TRUE); int ghno1 = CreateGraphFromSoftImage(shno1); DrawGraph(0,200, ghno1, TRUE); // 次に標準フォントデータで画面に『OK?』という文字列を描画する DrawString( 0 , 400 , "OK?" , GetColor( 255 , 128 , 100 ) ) ; // キー入力を待つ WaitKey() ; // 作成したフォントデータを削除する DeleteFontToHandle( FontHandle1 ) ; DeleteFontToHandle( FontHandle2 ) ; DeleteFontToHandle( FontHandle3 ) ; DeleteFontToHandle( FontHandle4 ) ; // DXライブラリの終了 DxLib_End() ; // ソフトの終了 return 0 ; }

Page: 1 |

Re: ソフトイメージに文字描画時のエッジの件 ( No.1 )
名前:管理人 日時:2011/03/21 17:09

1.縁の色を指定する方法はありませんでしょうか?  ソフトウエアイメージへの文字画像出力は、SetDrawBright で色を指定することを想定しています  なので、ソフトウエアイメージからグラフィックハンドルを作った後、そのグラフィックハンドルを  使用して文字を描画する前に SetDrawBrignt を使用して描画文字の色を白色以外の色にすることを想定しています  なので、ちょっと面倒ですが  SetDrawBright( 縁部分の色を指定 );  DrawGraph( 0, 200, ghno2, TRUE );  SetDrawBright( 中身部分の色を指定 );  DrawGraph( 0, 200, ghno1, TRUE );  という風にしてみてください m(_ _;m 2.直接描画のほうもエッジを指定すると、白で文字を書いていますが、何故か黄色っぽくなります。  スクリーンキャプチャをした上で画像編集ソフトでピクセルの値を見てみましたが、どちらも白( 255,255,255 )でした  なので、恐らく目の錯覚です、というか、アンチエイリアス付きのフォントなので、  縁無しの方は文字と文字ではない部分の境目が青い背景と文字の色(白)との合成になっているのに対し、  黒い縁ありの方では文字本体と文字本体ではない部分の境目が縁の色の黒との合成になっているので、  結果として縁無しの方が青白く、より明るく感じるのだと思います  書き込んでいただいたプログラムでは背景を青( 0,0,255 )にしていますが、  こちらを黒( 0,0,0 )にすると違いがなくなることが確認できると思います
Re: ソフトイメージに文字描画時のエッジの件 ( No.2 )
名前:クラスクラス(解決) 日時:2011/03/22 23:28

お忙しい中、お返事ありがとうございます。 1、の件了解しました。 2,の件、やはり目の錯覚でしたか、検証ありがとうございます。了解いたしました。

Page: 1 |