C#でピクチャーボックスに文字を描画、出力する方法

このQ&Aのポイント
  • ピクチャーボックスに色画像を表示し、文字も表示したい
  • ウインドウが隠れると文字が消えてしまうため、出力方法が知りたい
  • 以下のソースコードを使用しています
回答を見る
  • ベストアンサー

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);

質問者が選んだベストアンサー

  • ベストアンサー
  • qwertfk
  • ベストアンサー率67% (55/81)
回答No.1

DrawToBitmapを使うのであればpictureBox1のペイントイベントに描画処理を書かなければなりません。 private void pictureBox1_Paint(object sender, PaintEventArgs e) {  // インデントは全角スペースなのでコピペ注  string s1 = "文字";  Font newfont = new Font("MS明朝", 10);  e.Graphics.DrawString(s1, newfont, Brushes.Blue, 50, 200); } こんな感じでイベントハンドラを追加し、ボタン2の処理は削除する。 もしくは、pictureBox1の画像バッファ本体に文字を描くか。 その場合は、ボタン2,3のイベントをこんな感じに修正します。 private void button2_Click(object sender, EventArgs e) {  string s1 = "文字";  Font newfont = new Font("MS明朝", 10);  System.Drawing.Graphics g;  g = System.Drawing.Graphics.FromImage(pictureBox1.Image);  g.DrawString(s1, newfont, Brushes.Blue, 50, 200); } private void button3_Click(object sender, EventArgs e) {  Bitmap bmp = pictureBox1.Image;  bmp.Save("c:\\a.png"); }

flytosk
質問者

お礼

まさに、やりたかったとおりのことができました! こういう細かいことはググっても出てこないので、とても助かりました! ありがとうございました!

関連するQ&A

  • 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(); <中略> } で大丈夫なのでしょうか? 文字列は描画されないし、エラーもでないので どこが間違っているのかわかりません… 説明不足のところがあれば書いてください あと、修復場所を指摘してくださればありがたいです

  • 画像処理したBitmapをピクチャボックスで表示すると、例外が発生して

    画像処理したBitmapをピクチャボックスで表示すると、例外が発生してしまいます。 使用言語はVC#、開発環境はVisual Stdio 200です。 コードは以下の通りです。 class MyClass { Bitmap bmp_result;  public MyClass() { bmp_result = new Bitmap(1024,768,PicelFormat.24bpprgb); } while (true) { ・スクリーンショット画像を撮影し、bmp_resultに格納 ・bmp_resultに対して画像処理  //結果をピクチャボックスに表示。 Invoke(new UpdateDelegate(UpdateUI)); } private void UpdateUI() { pictureBox1.Image = this.bmp_result; } } 実行すると、 bmp_resultに対する画像処理のところで 「オブジェクトは現在他の場所で使用されています。 」 という例外が発生してしまいます。 invokeをコメントアウトすると、例外は発生しなくなります。 よって、UpdateUI関数と、無限ループ内の画像処理とが衝突しているのではないかと 思っているのですが、どう直せば解決するのかわかりません。 どなたかアドバイスをください!

  • ラベルをピクチャボックスの上に表示させたい

    PictureBox[,] map = new PictureBox[27, 27]; private void Form1_Load(object sender, EventArgs e) { for (int i = 1; i <= 25; i++) { for (int j = 1; j <= 25; j++) { map[i, j] = new PictureBox(); map[i, j].Size = new Size(tate, yoko);//用意する map[i, j].Location = new Point(tate * i + 5 * i, yoko * j + j * 5);//ずらす map[i, j].BackColor = Color.Black; this.Controls.Add(map[i, j]);//設置 bom_map[i, j] = 0; } } } ピクチャボックスの場合↑のように記述すると25×25のマップができあがりました。 それぞれのピクチャボックスの上に数字を表示させたいのですがうまくできません ちなみに、この様にソースを書いてみました private System.Windows.Forms.Label[,] label; private void Form1_Load(object sender, EventArgs e) { this.label = new System.Windows.Forms.Label[27, 27]; for (int i = 1; i <= 25; i++) { for (int j = 1; j <= 25; j++) { this.label[i, j] = new System.Windows.Forms.Label(); this.label[i, j].Size = new Size(tate, yoko); this.label[i, j].Location = new Point(tate * i + 5 * i, yoko * j + j * 5); this.label[i, j].Text = Convert.ToString(i * j); this.label[i, j].BackColor = Color.BlanchedAlmond; this.Controls.Add(this.label[i, j]); } } } ピクチャボックスと同じようにかぶせるのかな?と思い書いてみたんですが 何も表示されなくて困っています。 C#初心者なのでよろしくおねがいします。 }

  • ピクチャボックスをクリックしたら・・・という動作

    C#です ピクチャボックスをクリックしたら・・・という動作ができません・・・ 宣言等はこのようにしました for (int i = 1; i <= 25; i++) { for (int j = 1; j <= 25; j++) { map[i, j] = new PictureBox(); map[i, j].Size = new Size(tate, yoko); map[i, j].Location = new Point(tate * i + 5 * i, yoko * j + j * 5);//ずらす map[i, j].BackColor = Color.Black; map[i, j].Click += new EventHandler(map_click);//マップをクリックした } } map_clickというメソッドにはどのようにかけばいいのでしょうか? そのピクチャボックスをクリックしたらそのピクチャボックスの背景色を緑色に変える という風に書きたいのですが・・・・

  • 数字をピクチャボックスの上に表示させたい

    質問の内容を書いてくださいPictureBox[,] map = new PictureBox[27, 27]; private void Form1_Load(object sender, EventArgs e) { for (int i = 1; i <= 25; i++) { for (int j = 1; j <= 25; j++) { map[i, j] = new PictureBox(); map[i, j].Size = new Size(tate, yoko);//用意する map[i, j].Location = new Point(tate * i + 5 * i, yoko * j + j * 5);//ずらす map[i, j].BackColor = Color.Black; this.Controls.Add(map[i, j]);//設置 bom_map[i, j] = 0; } } } ピクチャボックスの場合↑のように記述すると25×25のマップができあがりました。 それぞれのピクチャボックスの上に数字を表示させたいのですがうまくできません ちなみに、この様にソースを書いてみました private System.Windows.Forms.Label[,] label; private void Form1_Load(object sender, EventArgs e) { this.label = new System.Windows.Forms.Label[27, 27]; for (int i = 1; i <= 25; i++) { for (int j = 1; j <= 25; j++) { this.label[i, j] = new System.Windows.Forms.Label(); this.label[i, j].Size = new Size(tate, yoko); this.label[i, j].Location = new Point(tate * i + 5 * i, yoko * j + j * 5); this.label[i, j].Text = Convert.ToString(i * j); this.label[i, j].BackColor = Color.BlanchedAlmond; this.Controls.Add(this.label[i, j]); } } } ピクチャボックスと同じようにかぶせるのかな?と思い書いてみたんですが 何も表示されなくて困っています。 C#初心者なのでよろしくおねがいします。

  • VB2005での画像処理

    各ピクセルの色情報を取得し,そのままコピーするプログラムです. 同じ大きさのPictureBox1とPictureBox2,それとButton1があります. エラーや警告は出ませんが,Button1をクリックしてもまったく動きません. 最終的にはPictureBox1を画像処理してPictureBox2に結果を表示させたいのですが,そのままコピーも出来ないため原因を探しています. A = picture1.GetPixel(i, j).ToArgb() picture2.SetPixel(i, j, color.FromArgb(A)) ではだめなのでしょうか.ご教授ください. -----以下プログラム------ Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Integer Dim j As Integer Dim A As Integer Dim picture1 As New Bitmap(PictureBox1.Image) Dim picture2 As New Bitmap(PictureBox2.Image) For j = 0 To PictureBox1.Width - 1 For i = 0 To PictureBox1.Height - 1 A = picture1.GetPixel(i, j).ToArgb() picture2.SetPixel(i, j, color.FromArgb(A)) Next Next End Sub

  • ピクチャボックスのクリックイベント

    ピクチャボックスのクリックイベント Visual C#でトランプゲームを作っているのですが this.PB = new System.Windows.Forms.PictureBox[54]; ↑のようにピクチャボックスの配列作ったのですが それぞれのクリックイベントを作りたいのですが、それがどうしても分かりません たとえばPB[30]がクリックされたらPB[30]の画像を他のピクチャボックスに移すなど このようなことをするにはどうすればいいですか?

  • VB.NET ピクチャーボックスのImageの一部をクリップボードにコピー

    Picturebox1.Image = New Bitmap(Picturebox1.Width, Picturebox1.Height) Dim g As Graphics = Graphics.FromImage(Picturebox1.Image) これ以降 g.DrawLine 等で描画を行っています そして、ピクチャーボックスの一部の領域(矩形)を指定して クリップボードにコピーしたいのですがどうしたらいいでしょうか よろしくお願いします 他のピクチャーボックスにその一部をコピーできるだけでもいいのですが

  • ピクチャーボックスの画像が欠けてしまいます。

    VB.NETとWinXPなのですが、 コマンドボタンを押して、ファイルダイアログボックスを開いて jpgファイルを指定するとピクチャーボックスにその 画像が表示されるようなものをつくっているのですが、 ピクチャーボックスの上に出るファイルダイアログボックスが重なっていた部分だけ画像が欠けてしまいます。 Picturebox1.Refresh()かなと思って試してみたのですが、今度は全部消えてしまいました。 良い方法があったら教えて頂きたいです。 よろしくお願いします。

  • ピクチャボックスの描画内容をファイル出力

    VB2005を使用しています。 BufferedGraphicsContextクラスと、BufferedGraphicsクラスを使用して ダブルバッファでピクチャボックスに絵を書くプログラムを作成しています。 絵は問題なく描けるのですが、それをBMPファイル、もしくはクリップボードに転送したいのですが、どうしたらいいかわかりません。 ご指導お願いします。 参考に描画のコードを載せておきます。 Public Class Form1 Private currentContext As BufferedGraphicsContext Private myBuffer1 As BufferedGraphics Private Dpen As Pen Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click '描画 Dpen = New Pen(Color.Black, 5) myBuffer1.Graphics.Clear(Color.FromArgb(255, 255, 255, 255)) myBuffer1.Graphics.DrawLine(Dpen, 0, 0, 200, 200) myBuffer1.Render(PictureBox1.CreateGraphics) End Sub Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load currentContext = BufferedGraphicsManager.Current myBuffer1 = currentContext.Allocate(PictureBox1.CreateGraphics, PictureBox1.DisplayRectangle) End Sub End Class

専門家に質問してみよう