• ベストアンサー

Graphics型からのピクセル操作(C#)

C#についての質問です。 Graphicsでピクチャーボックスに線を描画した後に、ピクチャーボックスのピクセル操作をしたいのですが、どうすればよいのか分かりません。 一度GraphicsからBitmapに変換しないといけないと思うのですが、どうすればよいのでしょうか??

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

  • ベストアンサー
  • axsies
  • ベストアンサー率64% (38/59)
回答No.1

.NETのGraphicsだけでは実現できないので、Win32APIのGDIを直接使うことになります。 GDIを介したやりとりには、デバイスコンテキストというものが必要になりますが、 .NETのGraphics型のGetHdcメソッドで取得できます。 一番簡単なのは、GDIのSetPixel関数、GetPixel関数を使うことですが、 きわめて低速なので通常はDIBセクションというものを使用します。 DIBセクションは、CreateDIBSection関数で作成できます。 CreateDIBSection関数は、作成時にビットマップのハンドルとともに、 そのビットマップ領域へのメモリポインタを取得できるので、 ピクセルの直接操作も高速に処理できます。 かなり大ざっぱな処理の流れとしては CreateDIBSection関数で、ビットマップを作成。(バックバッファ) ↓ 作成したビットマップに対して、線を描画したり、ピクセル操作を行って画面を完成させる。 ↓ BitBlt関数を使って、バックバッファからピクチャーボックスへ転送することで画面が表示される。 といった感じです。

dontlookback
質問者

お礼

どうもありがとうございます! 調べながら、何とか教えてくださった方法でできました! 本当に助かりました!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 【C#】GraphicsのhDcについて

    C#でアプリケーションを作成しています。 PictureBoxに読み込んだ画像を画像処理ライブラリにGraphicsのhDcを渡し、処理をさせたいのですが、 Bitmap bmp = new Bitmap("ファイル名"); pictureBox1.Image = bmp; Graphics g = Graphics.fromImage(pictureBox1.Image); IntPtr hdc = g.GetHdc(); というふうに作った[hdc]を渡すと真っ黒な画像が表示されてしまいます。 ピクチャーボックス1のPaintイベント pictureBox1_Paint(object sender, PaintEventArgs e) { // pictureBox1.Imageには上と同じ画像を読み込み済み IntPtr hdc = e.Graphics.GetHdc(); } というふうに作った[hdc]を渡すと、正常に処理された画像が表示されます。 質問なのですが、PictureBox1.Imageから作ったGraphicsとPaintEventArgs.Graphicsはどのような差があるのでしょうか? また、PaintEventArgsを使わず同じようなGraphicsを作るにはどうしたらいいでしょうか? 至らない説明で申し訳ありませんが、ご助言をよろしくお願いします。

  • C# DrawImage 物理サイズでなく、ピクセルサイズでの描画

    C# で、 Image img = new Bitmap(fileName); Point p = this.PointToClient( new Point( e.X, e.Y ) ); で画像と描画位置を決め、 e.Graphics.DrawImage(img, p); で、そこに画像を描画するのですが、写真によって、同じ1024*768ピクセルなのに、表示される大きさがばらばらです。 Graphics.DrawImage メソッド (Image, Point)の説明を読むと、「指定した位置に、指定した Image を元の物理サイズで描画します」とあり、「元の物理サイズで描画」に問題があることがわかりました。 質問ですが、「指定した位置に、指定した Image をピクセルサイズで描画」するメソッドは何でしょう?探し方が悪いのか、見つけられません。

  • C#のGraphicsクラスについて(GDI+)

    以下のようにgraphicsクラスをつかった画像の描画をおこないました。 Graphics gr = Graphics.FromImage(mapObj); というふうにからのリソースからGraphicsオブジェクトをつくる方法です。 using System; using System.IO; using System.Windows.Forms; using System.Drawing; using System.Web; using System.Net; using System.Text; using System.Threading; using System.ComponentModel; public class MainClass{ public static void Main(string [] args){ NewForm formObj = new NewForm(); formObj.RenderMethod(); Application .Run(formObj); } } public class NewForm : Form{ public NewForm(){ this.Width = 500; this.Height = 500; } public void RenderMethod(){ Bitmap mapObj = new Bitmap(500,500); Graphics gr = Graphics.FromImage(mapObj); Image imageObj = Image.FromFile("C:\\test.jpg"); gr .DrawImage(imageObj, 0,0,150,150); this.BackgroundImage = mapObj; } } このほかに、フォームコントロールの thisl.CreateGraphics()という メソッドを使っても画像を描画できるとききました。 あるサンプルをみると public class NewForm : Form{ public NewForm(){ this.Width = 500; this.Height = 500; } public void RenderMethod(){ Graphics gr = this.CreateGraphics(); Image imageObj = Image.FromFile("C:\\test.jpg"); gr .DrawImage(imageObj, 0,0,150,150); } } とこのようにthis.CreateGraphics()をつかっていましたが 実際にはこれが描画されないのです。 Graphics gr = Graphics.FromImage(mapObj); というGraphicsクラスの静的メソッドを使う方法ではなく コントロールのCreateGraphicsメソッドをつかって描画するにはどうしたらよいのですか? 識者のかた、ご教授ください。

  • 重いグラフィックス処理

    Windows VisualC++/MFC でのご質問です。 大きなグラフィックスデータをSDIアプリケーションで表示しているのですが、データが重く描画に10数秒時間を要してしまいます。1mil1画素といった具合に割り当てているのですが、あまりにも重過ぎます。描画を早くしたいのですが、何か良い手はありますでしょうか? 現在はDCに直接描画しています。メモリDCも試しましたが、サイズが大きすぎてbitmapが作れまずあきらめました。 以上、ご指導よろしくお願いします。

  • C#ピクチャーボックス再描画について

    C#ピクチャーボックス再描画について 動的生成したピクチャーボックスに文字を描画します そのあと、そのピクチャーボックスをD&DでForm内を移動できるようにしています その際、あるピクチャーボックスが別のピクチャーボックスの上を通過したり 他のコントロールが上になったりすると、描画した文字が消えてしまいます。 再描画について調べるとRefleshやUpdateとかができました。 しかし、Refleshを使うと文字を描画する前の状態を再描画してしまいます。 再描画の方法はTimerで10ミリ秒毎ぐらいにしようと思ってます。 Refleshをピクチャーボックスに文字を描画させた後に再描画できるように設定できればいいんですが…。 他に方法があったりしたら教えてください!!

  • Bitmap画像の消去について

    やりたいこととして Bitmap画像を表示する前になにかしら背景が描画されています。 そしてボタンを押すとか何かしらイベントが起こったときにBitmap画像を描画します。 そしてまたボタンを押すと背景はそのままでそのBitmap画像だけを消去する ということがしたいです。 今、ピクチャーボックスを使ってBitmap画像を表示することはできます。 ただそのBitmap画像を消去することはできていません。 探しているとピクチャーボックスを白く塗りつぶして、背景を再描画するって方法はあるのですが、いろいろあってその方法は使いたくないです。 Bitmap画像だけを消去する方法はあるのでしょうか? OSはVistaで、VC++2003.netを使っています。 宜しくお願いします。

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

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

  • C# PictureBoxへの描画を行うとメッセージボックスが表示されません。

    いつもお世話になっております。 ふと、PictureBoxに描画をしてみようかと思い Paintイベントに以下のようにして描画を行いました。   myBitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);   Graphics g = Graphics.FromImage(myBitmap);   pictureBox1.Image = myBitmap;      ・      ・(g.FillRectangle(・・・);など)      ・ (myBitmapはBitmap型のグローバル変数です。) PictureBoxは、自由にサイズ変更可能なフォームに貼り付け、四方をanchorで固めています。 そのためサイズが変更されるたびに、描画するときBitmapのサイズも変更しないといけないので この処理を毎回通っています。 (その部分が何だか無駄な気がするのですが、他にいい方法が思いつきませんでした。) ところが、描画はうまくいったのですが、メッセージボックスを出すと そのメッセージボックスが一度Altキーを押さないと表示されません。 色々調べて、ダブルバッファリングというものがあると知りました。 そこでPaintイベントで最初にこの処理をし   Image image = new Bitmap(pictureBox1.Width, pictureBox1.Height);   g = Graphics.FromImage(image); gに描画し終わってから   e.Graphics.DrawImage(image, 0, 0); としてみると、今度はフォームを移動するのにも一瞬フリーズするようになってしまいました。 (あまり深くプログラミングをしたことがないので、理解しきれなくてやり方が悪いのかも知れません・・・) メッセージボックスが表示されないのは、PictureBoxの描画のため 他のコントロールの描画ができていなためだと推測しているのですが どう直していいかわかりません。 どなたか、わかる方がいましたらよろしくお願いします。 <補足> OS:Vista VisualStudio2008 .NET Framework3.5

  • 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画像に文字や図形を重ねて描画できております。

  • ピクチャボックスの使用方法

    ピクチャボックスをピクセルモードに変更して、Width=2000位にしてLineとprintで描画をしています。 lineは0から2000まで線が引けるのですが、printで文字を書こうとすると、どうやら0から1000までしか書けないようなのです。 これは仕様なのでしょか? それともどこか設定を間違えているのでしょうか? どうか教えてください・・・