• 締切済み

GDI+のDrawStringを使って文字を滑らかに描画したいのですが。。。

GDI+のDrawStringを使って文字を滑らかに描画したいのですが。。。 環境は、VC++のWin32プロジェクトです。 WindowのデバイスコンテキストからGraphicsオブジェクトを生成し、DrawStringとすると滑らかに描画されます。 しかし、BitmapオブジェクトからGraphicsオブジェクトを生成し、DrawStringを行うとビットマップフォントのようです。 Graphics g(hdc); g.DrawString(......); -> この場合はなめらか(画像の下の方) しかし、 Bitmap bmp(w, h, PixelFormat32bppARGB); Graphics g (&bmp); g.SetSmootingMode(SmoothingModeHighQuality); g.DrawString(...); -> ジャギが目立つ。(画像の上の方) ビットマップ(メモリ)にスムーズなテキストを描画することはできないのでしょうか? ちなみにフォントはメイリオです。

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

ご質問のような現象を確認できる最低限のコードをお示しいただけませんか? DrawStringの引数Fontに与えたものが TrueTypeフォントでは無いってことは無いでしょうね …

HackerX
質問者

補足

ちなみにフォントはメイリオです。 Trueタイプだと思います。 コードはこうです。 char_t buffer[256]; Bitmap bitmap(200, 30, PixelFormat32bppARGB); Graphics xx(&xxbmp); xx.SetSmoothingMode(SmoothingMode::SmoothingModeHighQuality); wsprintfW(buffer, L"Total Time: %d.%03d", (t2-t1)/1000, (t2-t1)%1000); xx.DrawString(buffer, wcslen(buffer), &Font(L"メイリオ",12.0), RectF(0, 0, 200, 30), NULL, &SolidBrush(Color(Color::Black))); Graphics g(hdc); g.DrawImage(&xxbmp, 0, 0); こんな感じです。

関連するQ&A

  • GDI+で高速な描画

    GDI+を利用してお絵かきツールのようなものを作成しようと思っています。 しかしdrawImage()での画面への描画が非常に遅いようで、描いてみると線がカクカクしてしまいます。 アンチエイリアスやアルファブレンドが必要なのでGDI+を利用したいのですが、どうにか高速に描画させる方法はないでしょうか? 下記は現在のソースの一部です。 static Bitmap *offscreenBitmap //描画処理はこっちに static Graphics *offscreen; static Graphics *onscreen; //画面表示用 static RECT rect; //クライアント領域 static POINTS posPts,pts; //一つ前と現在のマウス座標 static BOOL bLButtonDown; Pen nomalPen(Color(100,0,0,0), 1); //描画用ペン switch(msg){  case WM_CREATE:   GetClientRect(hWnd,&rect);   offscreenBitmap = new Bitmap(rect.right, rect.bottom); //ビットマップ生成   offscreen = new Graphics(offscreenBitmap);   offscreen->SetCompositingMode(Gdiplus::CompositingModeSourceOver);   offscreen->SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias);//アンチエイリアス有効化   offscreen->Clear(Color(255,255,255)); //初期化   onscreen = new Graphics(hWnd); //ウインドウ表示用   onscreen->SetCompositingMode(CompositingModeSourceCopy);   break;  case WM_LBTTONDOWN:   bLButtonDown = TRUE;   posPts=MAKEPOINTS(lp)   break;  case WM_MOVE:   pts=MAKEPOINTS(lp)   if(bLButtonDown){    offscreen->DrawLine(&nomalPen, posPts.x, posPts.y, pts.x, pts.y);//線描画    posPts.x=pts.x;    posPts.y=pts.y;   }   InvalidateRect(hWnd,&rect,0);//ウインドウを更新   break;  case WM_PAINT:   onscreen->DrawImage(offscreenBitmap,0,0);//画面に書き出し   break; }

  • C#でピクチャーボックスへの文字列描画について

    C#でピクチャーボックスへの文字列描画について DOBON.NETからコピペです //PictureBox1のGraphicsオブジェクトを取得 Graphics g = PictureBox1.CreateGraphics(); string drawString= @"智に働けば角が立つ。情に棹させば流される。 意地を通せば窮屈だ。とかくに人の世は住みにくい。"; //Fontを作成 Font fnt = new Font("MS ゴシック", 12); //文字列を表示する範囲を指定する RectangleF rect = new RectangleF(10, 10, 100, 200); //rectの四角を描く g.FillRectangle(Brushes.White, rect); //文字を書く g.DrawString(drawString, fnt, Brushes.Black, rect); //リソースを開放する fnt.Dispose(); g.Dispose(); 自分で使ってるピクチャーボックスは動的生成してるので picbox[i] という感じになってます この場合 初めの宣言の時は picbox = new System.Windows.Forms.PictureBox[pic_cnt]; for (i = 0; i < n) { picbox[i] = new System.Windows.Forms.PictureBox(); Graphics g = picbox[i].CreateGraphics(); <中略> } で大丈夫なのでしょうか? 文字列は描画されないし、エラーもでないので どこが間違っているのかわかりません… 説明不足のところがあれば書いてください あと、修復場所を指摘してくださればありがたいです

  • drawStringの座標について

    paintメソッド内で、drawStringで文字列を、 drawImageで画像をそれぞれ表示しています。 drawStringとdrawImageの両方で、同じ座標を 指定しても表示位置がずれます。x座標は ぴったり一致するのですがy座標が7から8ポイント ほどずれます。この二つのメソッドによる座標 と表示位置を一致させたいのですが、よい方法は ありませんでしょうか。どうぞよろしくお願い いたします。 public void paint(Graphics g) { g.drawImage(image,20,20,100,20); Font fnt=new Font("HGゴシックM",Font.PLAIN,12); g.setFont(fnt); g.drawString("Hello",20,20);//座標値はおなじで               も表示位置がずれる }

    • ベストアンサー
    • Java
  • Bitmapのディスク容量

     以下、VBの記法で書きます。Windows10,.NETのGDI+を使用しています。  PixelFormat が Format32bppArgb のBitmapを作成し、描画処理が終わった後、Bitmap.Save(パス名)で保存します。  Bitmapは1250×1250(pixel)なので、そのディスク容量は、   1250×1250×4(byte)=6104 KB=6 MB くらいと思ってました。ところが保存してみると、60 KBくらい・・・。  読みだして表示するとちゃんと保存されてるので、これはこれであり難い事なのですが、どうして?、という質問です(^^;)。  PixelFormat が Format32bppArgb の場合は初期化時に、各pixelの(A,R,G,B) は (A,R,G,B)=(0,0,0,0)であり、例えばPictureBox の BackColor との兼ね合いで、(R,G,B)=(0,0,0)(黒)はDefaultで透過色になってるので、ディスク保存時には、pixel位置を表すIndex付きでpixel情報が圧縮されて保存されるのかしら?、などと想像したわけです。  たんに気になるので、どうなってるか知りたいだけです。ネットで検索してもBitmapの大きさは、画素数×4 byte という記事しか出てこないので・・・(^^;)。  関連する検索キーワードでも良いので、教えてもらえませんか。

  • 画像のビット数を変更する方法

    http://okwave.jp/qa/q8880161.html このページなどで画像の取扱に関して詳しく教えていただきました。 大体、思ったことはできるようになったのですが まだ疑問点が残っております。 例えば、24bit画像をGDI+で読み込んで、 アルファチャンネルに情報を書き加えた後、 そのまま画像を出力します。 するとirfanviewなどで読み込んだ際に アルファチャンネルに情報をもっているにも拘わらず 24bit画像をとして認識されてしまいます。 アルファチャンネルをもっているかいないかではなく 画像のインデックスのところに24か32bitかを識別するものが含まれているようです。 読み込んだ24bit画像を32bit画像に変換したいのですが どのようにすれば良いでしょうか? GdipCreateBitmapFromScan0(lngWidth, lngHeight, 0, PixelFormat32bppARGB, ByVal 0&, hBmp2) を使えば、32bit画像を生成できますが 新たにbitmapオブジェクトを生成せずに 読み込んだオブジェクトのbit数を変更する方法を教えてください。

  • PBoxのGraphicsをImageに書き込む

    お世話になります PictureBoxを2枚使用して以下の様に現状はなっております。 PictureBox AAは背景となる画像を描画 AA->Image = bmpGazou; PictureBox BBはAAのオーバーレイとして、文字や図形をGraphicsオブジェクトに描画したり編集したりしています。 主にg->FillEllipse等で円を描画しています ※文字や図形以外は透過 やりたいこと 保存用のBMPを作成して、そこにAAとBBを書き込んで、Jpeg保存したい 保存用BMPを定義して Bitmap^ bmp = gcnew Bitmap(ixSize, iySize); Graphics^ g = Graphics::FromImage(bmp); そこにAAを書き込む g->DrawImage(AA->Image,・・・ ここまでは正常にできたのですが、 BBのImageプロパティが未定義なので、g->DrawImageではBBを書き込めませんでした。 GraphicsオブジェクトをBMPに上書き(重ね書き)したいのですが、 どの様にすればよいのか教えていただけないでしょうか。 ↓等も見てはいるのですが、前提条件のBBの使い方が違うので、やり方が判りませんでした。 http://dobon.net/vb/dotnet/graphics/pictureboximageanddrawimage.html ※PCの画面上はAAの上にBBが表示され、背景のAA画像に文字や図形を重ねて描画できております。

  • Javaで左上の位置を指定して文字を描画する方法を探しています。

    Javaで左上の位置を指定して文字を描画する方法を探しています。 JavaでGraphicsオブジェクトを使用して文字を描画する際に、Javaの標準の方法(java.awt.graphicsのdrawStringメソッド)を使う場合では「ベースラインの位置」を指定しますが、これを「左上端の座標」を指定して描画できるようにするにはどうしたらよいのでしょうか。

    • ベストアンサー
    • Java
  • C#でピクチャーボックスに文字を描画、出力する方法

    以下のことをやりたいのですが、できなくて困っています。 Microsoft Visual Studio 2010 Expressを使っています。 1、ピクチャーボックスに色画像を表示 2、ピクチャーボックスに文字(説明)も表示 3、その画像を出力 2まではできたのですが、2までできたあとに、プログラムのウインドウ上に他のウインドウ(マイコンピュータやマイドキュメントなど)が表示されたり、プログラムのウインドウを最小化したりして、一度隠れてしまうと文字が消えてしまうようで、画像のみの出力になってしまいました。(画像のみの出力には成功しています) なんとかして出力する方法はないでしょうか。 以下がソースです。よろしくお願いします。 ボタン1 Bitmap bmp6 = new Bitmap(800, 600); int sr, sg, sb, i, j; sr = 100; sg = 100; sb = 100; for (i = 0; i < 40; i++) { for (j = 0; j < 40; j++) { bmp6.SetPixel(i, j, Color.FromArgb(sr, sg, sb)); } pictureBox1.Image = bmp6; } ボタン2 string s1 = "文字"; Font newfont = new Font("MS明朝", 10); pictureBox1.CreateGraphics().DrawString(s1, newfont, Brushes.Blue, 50, 200); ボタン3 pictureBox1.DrawToBitmap(bmp, new Rectangle(0, 0, 800, 600)); bmp.Save(c:\\a.png);

  • ビットマップの描画方法

    こん○○は。 BCB5を使ってますが、 高速にビットマップを描画する方法はないでしょうか? TImage コンポーネントを使用し Picture->Bitmap->Canvas->Pixels[x][y] へ SDKから取得したカメラ画像データをTColor RGB(r,g,b)で設定しています。 フォームに画像が表示されるまで1秒ほどかかるためコマ送り状態になっています。

  • VB.NETのグラフィック描画について

    グラフィック描画ですが、引数を持たないサブルーチンプロシージャ(固定的な 目盛り等)は、PictureBox_paint(***イベントプロシージャ内に記述すればグラフィック描画ができます(e.Graphicsでグラフィックスオブジェクトを取得できる為)が、 X、Y座標を引数としたサブルーチンプロシージャを作り、その中でLineDraw(*****で描画させたい場合サブルーチンプロシージャ内に dim g As Graphics=pictureBox1.CreateGraphics() でグラフィックオブジェクトを生成しても 描画できないのですがどのようにすれば解決できるでしょうか(イメージがわかり難いかもしれませんのでサンプルを書きました) よろしくお願いします (1)private sub pictureBox1_paint(Byval sender as Object, Byval e as system****** e.Graphics.DrawLine(****** (これは描画できる) End Sub (2)private sub zahyou() ' 座標を生成するサブルーチンプロシージャ dim i as integer for i=0 to 10 hyouji( i , i*5 ) End Sub private sub hyouji( x as integer, y as integer) ’直線を引くサブルーチンプロシージャ dim g As Graphics=pictureBox1.CreateGraphics() g.DrawLine(***,x,y**** (これは描画できない)