ここから質問投稿すると、最大4000ポイント当たる!!!! >>

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 をピクセルサイズで描画」するメソッドは何でしょう?探し方が悪いのか、見つけられません。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

追記と訂正。



>e.Graphics.DrawImage(img, p);
>で、そこに画像を描画するのですが

見落としたけど「画像サイズを指定してない」んですね。

だったらGraphics.DrawImageは「元のbmpファイルの中に書いてある解像度に従って、拡大縮小する」ので「大きさがバラバラ」で表示されますね。

私は「Graphics.DrawImageでは、元画像のサイズを指定するのが常識」だったので「まさか、元画像のサイズを指定しないで、Graphics.DrawImageを呼んでるとは、思いもしなかった」ので、見落としました。

で「Graphics.DrawImageは、元画像のサイズを指定すると1ピクセルを1ピクセルで描画する」ので、当然、そうしているのだとばかり思ってました。

e.Graphics.DrawImage(img, p);

e.Graphics.DrawImage(img, p.X, p.Y, img.Width, img.Height);
にして下さい。こうすれば「1ピクセルは1ピクセルで描画」します。

なお、画像のサイズがバラバラな場合に拡大縮小して、すべて1024*768で表示したいなら
e.Graphics.DrawImage(img, p.X, p.Y, 1024, 768);
にして下さい。
    • good
    • 1
この回答へのお礼

再度、回答ありがとうございます。

>e.Graphics.DrawImage(img, p.X, p.Y, img.Width, img.Height);
できました!!

お礼日時:2009/03/31 13:50

「元の物理サイズで描画」ってのは「1ピクセルを1ピクセルで描画」って意味です。



「元画像が1024*768」であれば、画像は1024*768で表示されます。

もし「表示される大きさがばらばら」って言うなら「読み込んだbmpファイルの画像の大きさがバラバラ」って事で「どの画像も1024*768だと思っていたのは、勘違い」です。

あくまでも「元画像が1024*768」であれば、画像は1024*768で表示されます。

もし「どの画像も、元のピクセルサイズを無視し、1024*768で表示したい」のであれば「元画像が1024*768より小さい場合は拡大処理、元画像が1024*768より大きい場合は縮小処理しなければならない」と言う事です。

もし「画像はどれも1024*768の筈だ。拡大や縮小は要らない」と言い張るなら、現状の通りGraphics.DrawImageメソッドで充分です。

Graphics.DrawImageは拡大縮小は行わず、常に「等倍で、ピクセルサイズで描画」しますから、もし本当に「すべての画像が1024*768で作られてる」なら、すべて同じ大きさで、1024*768の領域に描画される筈です。表示される大きさがバラバラになる事はありません。

一度「本当に、全部の画像が、1024*768で作られてる」かどうか、確かめる事をお勧めします。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
>「元の物理サイズで描画」ってのは「1ピクセルを1ピクセルで描画」って意味です。
>「元画像が1024*768」であれば、画像は1024*768で表示されます。
私も、そのような表示を希望するのですが、実際は違うんで困っています。
なお、元画像は1024*768のbmpファイルではなく、1024*768のjpegファイルです。
>一度「本当に、全部の画像が、1024*768で作られてる」かどうか、確かめる事をお勧めします。
確かめました。ためしに2つの写真で確かめましたが、ビューア(Vix)ではちゃんと同じ大きさで表示されますが、C#で作成したソフトでは違った大きさに表示されます。

お礼日時:2009/03/31 13:36

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC#で、画像の、指定した座標の色情報を取得し

C#、Visual Studio2008を使用しています。
ピクチャーボックスに画像を読み込み、その画像の、指定した座標の色情報を取得したいです(RGB値)。
画像の読み込みまではできました。
その次の指定した座標の色情報を取得するようなメソッド?コマンド?は存在するのでしょうか?
検索しても出てこないため、ご存知でしたら教えていただけると助かります。よろしくお願いします。

Aベストアンサー

http://msdn.microsoft.com/ja-jp/library/system.drawing.bitmap.getpixel.aspx

これを参考に。


Color c=((Bitmap)(pictureBox1.Image)).GetPixel(x, y);


こんな感じ?

参考URL:http://msdn.microsoft.com/ja-jp/library/system.drawing.bitmap.getpixel.aspx

QC#でPictureBox内での図形移動について

例えばPictureBoxに縦棒グラフを10本描画し、それが時間の経過と共に全体的に1本づつ左に移動して右端には最新の情報が表示されている様なものが作りたい。

それで右の9本をコピーして左端に移動(上書き)し、右端に新しい棒グラフを描画すれば良いと思っているのですが、図形を移動する方法があれば教えて下さい。

コピーする領域とコピー先の基準点を設定して呼び出すだけのメソッドを期待して探したのですが見当たりませんでした。

TranslateTransform()がそれっぽい感じもするのですがよく分かりません。

宜しくお願いします。

Aベストアンサー

描画はどのように行っているのでしょう

ピクチャーボックスなどへ直接となると難しいと思います

Bitmapオブジェクトを2個と描画用のGraphicsオブジェクト用意します
Bitmap bmSrc, bmDraw;
Graphics grBack;

初期化イベントなどで
bmSrc = new Bitmap( 幅, 高さ );
grBack = Graphics.FromIamge( bmSrc );
// グラフの描画処理を追加
// bmSrcをgrBackから分離
grBack.Dispose();
bmDraw = (Bitmap)bmSrc.Clone();
pictureBox1.Image = bmDraw;

更新イベントで
grBack = Graphics.FromImage( bmSrc );
// スクロール幅が16ドットの場合
grBack.DrawImage( bmDraw, new Point( -16, 0 ) );
// ココに右端の描画処理を追加
// bmSrcをgrBackから分離
grBack.Dispose();
bmDraw = (Bitmap)bmSrc.Clone();
pictureBox1.Image = bmDraw;

といった具合で

描画はどのように行っているのでしょう

ピクチャーボックスなどへ直接となると難しいと思います

Bitmapオブジェクトを2個と描画用のGraphicsオブジェクト用意します
Bitmap bmSrc, bmDraw;
Graphics grBack;

初期化イベントなどで
bmSrc = new Bitmap( 幅, 高さ );
grBack = Graphics.FromIamge( bmSrc );
// グラフの描画処理を追加
// bmSrcをgrBackから分離
grBack.Dispose();
bmDraw = (Bitmap)bmSrc.Clone();
pictureBox1.Image = bmDraw;

更新イベントで
grBack = Graphics.FromImage( bmSrc );
// スク...続きを読む

QC#で共有変数の定義をするには

C#で共有変数の定義をするには、どうしたらよいでしょうか。具体的には、起動パラメータで、任意の文字列(3~4バイト)を渡して、C#アプリケーションを、起動し、プログラムの任意の場所で、そのパラメータを参照したいと考えています。起動パラメータの受け取りは、できるのですが、そのパラメータを、プログラムのどこからも参照できる領域(ここの定義方法が不明)に格納するには、どうしたらよいでしょうか。(2重起動を許す前提です。実行時に1つの目のプログラムにはパラメータ"XYZ"を渡し、2つ目のプログラムを起動時にはパラメータ"ABCD"を渡し、その値により、プログラムの動作を制御したいと思っています)
Windows-xp visual-studio2008 C#でwindowsアプリケーションを作成しています。

Aベストアンサー

namespace test1
{
  static class Program
  {
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
      if (args.Length > 0)
      {
        strArg = args[0];
      }
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new Form1());
    }
    // ここに記述
    static public string strArg = null;
  }
}

メインクラスのメンバーとしてスコープが有効な場所に記述します

namespace test1
{
  static class Program
  {
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
      if (args.Length > 0)
      {
        strArg = args[0];
      }
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(n...続きを読む

Qフルパスから最後のディレクトリ名を取得したい。

vb.netなのですが、例えば
c:\aaa\bbb\ccc\ddd\eee\fff.exe
というフルパスがあったとして、
eeeというディレクトリ名を取得したいのですが、
何か良い方法はないでしょうか。
それぞれのディレクトリ名の文字数や階層数は
決まっていないのですが、オススメの方法が
ありましたら、教えて頂けると助かります。

Aベストアンサー

MessageBox.Show(IO.Path.GetFileName(IO.Path.GetDirectoryName(myPath)))

IO.Path の GetDirectoryName でフォルダのフルパスを取得して、さらに IO.Path の GetFileName で最終フォルダ(またはファイル)の名前を取得。

QC#「オブジェクト参照が必要です」(初心者)

Visual C# 2008を学習中なんですが、とりあえず何か作ってみようと思って、パラパラマンガに挑戦してみました。
Form1にpictureBox1を作り、waitを入れてイメージを書き換えるという単純なものです。
ところが実行しようと思ったら、「静的でないフィールド、メソッド、またはプロパティ’WindowsFormApplication1.Form1.pictureBox1’でオブジェクト参照が必要です」というエラーが出ます。その際のフォーカスは、main()内の
Form1.pictureBox1.image = Image.FromFile("motion1.png");
”Form1.pictureBox1”に当てられています。

何が原因と考えられるでしょうか。
もし情報不足であればご指摘いただくか、あるいはこの目的においてやらなければいけないこと、を大雑把に教えていただくだけでも幸いです。
よろしくお願いします。

Aベストアンサー

main()内に記述されているとのことですので、たぶん、
Form1.pictureBox1.Image=Image.FromFile("motion1.png");
Application.Run(new Form1());
と書いているのではないでしょうか?

連載 改訂版 C#入門 第3章 クラスとインスタンス
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_003/cs2_003_01.html#cs0302

ここであるように、オブジェクト指向にはクラスとインスタンスという概念があります。
今のコードでは、Form1クラスを操作しようとしているのでそのようなエラーが出ます。

具体的な解決方法としては、PictureBoxに初期画像を設定する処理をForm1のコンストラクタでやるのがいいと思います。
その際、redfox63さんがおっしゃられるように
this.pictureBox1
と記述することが必要です。(thisは自分自身のインスタンスを指します)

後は、Windowsフォームで一定間隔での処理をするための「Timerコンポーネント」について調べてみたらいいと思います。

タイマにより一定時間間隔で処理を行うには?(Windowsタイマ編)
http://www.atmarkit.co.jp/fdotnet/dotnettips/372formstimer/formstimer.html

MSDNライブラリ Timerクラス
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.timer.aspx

参考URL:http://www.atmarkit.co.jp/fdotnet/csharp_abc2/index/

main()内に記述されているとのことですので、たぶん、
Form1.pictureBox1.Image=Image.FromFile("motion1.png");
Application.Run(new Form1());
と書いているのではないでしょうか?

連載 改訂版 C#入門 第3章 クラスとインスタンス
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_003/cs2_003_01.html#cs0302

ここであるように、オブジェクト指向にはクラスとインスタンスという概念があります。
今のコードでは、Form1クラスを操作しようとしているのでそのようなエラーが出ます。

具...続きを読む

QC#にて別クラスの関数を使いたい

C#にて、別クラスの関数を使用する方法を教えてほしいです。

下記のような、構造体を受け取るメソッドを作りました。

*****************************
private struct MyPoint
{
public int x;
public int y;
}

private void proc1(MyPoint pt)
{
MessageBox.Show("座標:" ; pt.x + "," + pt.y + "実行結果");
}

private void button1_Click(object sender ,System.EventArgs e)
{

MyPoint pt;
pt.x = 10;
pt.y = 20;
proc(pt);
}
*****************************

別のフォームのクラスから、proc1を呼び出したいのですが、やり方がわかりません。
どうか、教えてください。

Aベストアンサー

同じ定義をしたとしても別の名前空間に書いた構造体は同一とはみなされません。

呼び出し先クラスでの構造体を private では無く、public で宣言して下さい。

呼び出し元では、

MyClass.MyPoint pt;

のようにして実体を作ります。

Q1ピクセルって何ミリですか?

1ピクセルって何ミリなのでしょう?
至急、お答えお待ちしております。
かなり急いでます。よろしくお願いいたします。

Aベストアンサー

1ピクセルが何ミリかという質問の答えになるかどうか分かりませんが、
WEB制作上に限って言えば、横100ピクセルの画像を作りたい場合、
Photoshop等では単位をピクセルで作れますが、Illustrator等の場合は、
100pointで作ります。
1pointは、0.35277ミリです。

QC#(.net) ドロー系ソフト作成 図形選択方法

C#(.net framework 4.0)で現在業務に使用しているソフトで、地図画像に対して、ごく初歩的な図形(直線や矢印、円、四角形、文字程度)を挿入する事が必要になりそうでして、ドローソフト系のようなプログラミングを行いたいと思っています。(Excel上での図形挿入の様なイメージ)

Graphicsを使用して、線や塗りなどの描画はすぐにできると思うのですが、一度描画した線や四角を移動させたり大きさを調整したりするために、対象の図形をマウスでクリックして選択する方法がまるでうかびません。通常、この「図形を選択する」というのはどのように実現させているのでしょうか?思いつくものとしては、

図形をコントロールとして扱い、マウスイベントを直接受け取れるようにする?
(そもそもコントロールの使い方として間違っているような気がしますし、パフォーマンスにかなりの悪影響がありそう…)

別に座標マップを作り、どの図形がどのドットに対応しているかを記録する?
(線を引いた結果、どの座標がどの図形かをすべて計算する必要があると、かなりの計算とコード量になりそう…)

くらいです。基本的な、もしくは一般的な方法や考え方がありましたら是非教えてください。ペイント系ならそれなりにネット上に情報はあるような気もするのですが、ドロー系に関する情報はなかなか少ないようで困っています。ドロー系ソフト作成時に参考になるコードや情報や本などありましたら、そちらも教えていただけると助かります。よろしくお願いいたします。

P.S. 質問投稿時にさんざん迷ったのですが、C#(.Net Framework)のカテゴリーって、こちらの C・C++ でよろしかったんでしょうかw

C#(.net framework 4.0)で現在業務に使用しているソフトで、地図画像に対して、ごく初歩的な図形(直線や矢印、円、四角形、文字程度)を挿入する事が必要になりそうでして、ドローソフト系のようなプログラミングを行いたいと思っています。(Excel上での図形挿入の様なイメージ)

Graphicsを使用して、線や塗りなどの描画はすぐにできると思うのですが、一度描画した線や四角を移動させたり大きさを調整したりするために、対象の図形をマウスでクリックして選択する方法がまるでうかびません。通常、この「図形を...続きを読む

Aベストアンサー

図形をコントロール(ウィンドウ)や、それを囲む矩形で判断すると、重なった部分に問題が出ます。
例えば、線分を描いたあとでその線分を囲むような円を描いた場合、円の方が(Z-orderで)上にある状態だと後ろにある線分を選択することができなくなります。
ソフトによっては、「前面に移動」、「背面に移動」といったコマンドを用意して回避している場合もあります。

クリックした点と図形の距離を計算し、範囲内で最も距離が近い図形を選択するようにしてはいかがでしょうか。
線分の場合の距離は、クリックした点から線分に垂線を引き、交点とクリックした点の距離を使います。ただし、交点が線分の延長線上になる場合は、クリックした点と線分の端点の距離のうち小さい方を使います。
円・円弧の場合は、中心点とクリックした点を通る直線を作り、その直線と円との交点を使用します。円弧の場合で交点が円弧の範囲外の場合は、線分と同様に円弧の端点を使用します。
矩形の場合は、矩形を4つの線分と考えて各線分との距離のうち小さいものを使用します。

すべて数学的な計算だけで済みます。ドットとの対応とかは使いません。

図形をコントロール(ウィンドウ)や、それを囲む矩形で判断すると、重なった部分に問題が出ます。
例えば、線分を描いたあとでその線分を囲むような円を描いた場合、円の方が(Z-orderで)上にある状態だと後ろにある線分を選択することができなくなります。
ソフトによっては、「前面に移動」、「背面に移動」といったコマンドを用意して回避している場合もあります。

クリックした点と図形の距離を計算し、範囲内で最も距離が近い図形を選択するようにしてはいかがでしょうか。
線分の場合の距離は、クリックした...続きを読む

Qピクセル数からミリメートルへの変換は

例えばCDラベルなどを作って印刷しようとするとき、仕上がりの大きさはわかっているのですが、グラフィックを作るソフトがピクセル単位での設定なので大きさを合わせるのに苦労しています。ミリをピクセルに直す計算方法とかはあるのでしょうか、教えてくださいませ。

Aベストアンサー

一般に画面の解像度は「72 dpi」、プリンタの解像度は、「300 dpi」~「1200 dpi」程度です。

「dpi」は「dot/inch」の略で、1インチは 25.4 mm です。 この場合「ドット」と「ピクセル」は同じと考えても良いので、プリンタの解像度を調べて、例えば「600 dpi」ならば、10 mm = 600/25.4 *10 = 236 dot です。

あくまでインチ単位の物をセンチメートル直しているので誤差がでますが、無視できる誤差の筈です。Macならば、印刷時に適当なサイズに拡大/縮小できるのですが、Windowsって出来ないんでしたっけ?

以上。

QVB.NET フォーム上に描いたグラフィックのクリア方法

最近、VB6からVB.NET 2003へプログラムの移行作業を始めたものです。極々基本的なことなのかもしれませんが、.NETでフォームに描いたグラフィック(線や円など)を消去するコードがなかなかうまく書けず困っています。
VB6でしたら Form**.Cls だけで消えるのですが、それに対応するコードはどのように記載すれば宜しいでしょうか?

ヘルプなどで見るとClearメソッドを使用するとありましたが、どうもうまく動きません。

例えば、以下の簡単な例でしたらどのように変えれば宜しいでしょうか?
宜しくお願いいたします。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  Dim grph As System.Drawing.Graphics
  grph = Me.CreateGraphics
  grph.DrawLine(Pens.Red, 50, 25, 200, 150)
  ClearScreen(e)
End Sub

Public Sub ClearScreen(ByVal e As PaintEventArgs)
  Dim BGcolor As Color
  BGcolor = Color.FromArgb(0, 0, 0)
  e.Graphics.Clear(BGcolor) '背景色
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  ClearScreen(e)
End Sub

最近、VB6からVB.NET 2003へプログラムの移行作業を始めたものです。極々基本的なことなのかもしれませんが、.NETでフォームに描いたグラフィック(線や円など)を消去するコードがなかなかうまく書けず困っています。
VB6でしたら Form**.Cls だけで消えるのですが、それに対応するコードはどのように記載すれば宜しいでしょうか?

ヘルプなどで見るとClearメソッドを使用するとありましたが、どうもうまく動きません。

例えば、以下の簡単な例でしたらどのように変えれば宜しいでしょうか?
宜しくお願...続きを読む

Aベストアンサー

お望みのことをするには、Button2のClick時にFormのRefreshメソッドを呼んであげればOKです。そうすれば、フォームが再描画されて描画済みのグラフィックが消去されます。

コードとしてはこんな感じです。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  Dim grph As System.Drawing.Graphics
  grph = Me.CreateGraphics
  grph.DrawLine(Pens.Red, 50, 25, 200, 150)
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  Refresh()
End Sub


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング