C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: C#-画像の回転処理について


(過去ログ 31 を表示中)

[トピック内 23 記事 (1 - 20 表示)]  << 0 | 1 >>

■15031 / inTopicNo.1)  C#-画像の回転処理について
  
□投稿者/ ざーぼん (1回)-(2008/03/02(Sun) 23:17:38)

分類:[C#] 

こんにちは。
Visual C#2005EE .Net Framework2.0での画像処理についてご質問です。

PictureBoxにFromStreamメソッドで読み込んだ画像を表示しています。
画像の描画はPicturBoxのPaintイベントにてGraphics.DrawImageメソッドを使用して行っています。

private void pictbox_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.DrawImage(img, 0, 0, img.Width, img.Height );
}

その画像をRotateFlipメソッドにて90度回転させ表示した際に、縦横の見た目の長さが回転する前と比較して変化してしまいます。

回転前のサイズで描画するにはどうすれば良いのでしょうか?

引用返信 編集キー/
■15034 / inTopicNo.2)  Re[1]: C#-画像の回転処理について
□投稿者/ やじゅ (205回)-(2008/03/03(Mon) 00:35:33)
やじゅ さんの Web サイト
2008/03/03(Mon) 02:12:23 編集(投稿者)

No15031 (ざーぼん さん) に返信
> その画像をRotateFlipメソッドにて90度回転させ表示した際に、縦横の見た目の長さが回転する前と比較して変化してしまいます。
> 回転前のサイズで描画するにはどうすれば良いのでしょうか?
>

質問の意図と違うかもしれませんが、
縦横比が合うように画像を縮小するとかすればいいかも
http://blog.asura.co.jp/takehara/88bee257fd16423e9706ff9dbf8175ee/entry.aspx

引用返信 編集キー/
■15060 / inTopicNo.3)  Re[1]: C#-画像の回転処理について
□投稿者/ Jitta on the way (46回)-(2008/03/03(Mon) 18:48:46)
No15031 (ざーぼん さん) に返信

大きさはわかっているんだから、その大きさのキャンバスを用意して転送したらいい…ってことではなく?
引用返信 編集キー/
■15071 / inTopicNo.4)  Re[1]: C#-画像の回転処理について
□投稿者/ 倉田 有大 (149回)-(2008/03/03(Mon) 23:19:56)
>回転前のサイズで描画するにはどうすれば良いのでしょうか?

640x480の場合。
480x640にするってこと?
引用返信 編集キー/
■15075 / inTopicNo.5)  Re[2]: C#-画像の回転処理について
□投稿者/ ざーぼん (2回)-(2008/03/04(Tue) 00:55:51)
お返事が送れ申し訳ありません。

>やじゅさん
ご回答ありがとうございます。
提示いただいたリンク先の内容は、縦横の比率を維持したままの拡大処理だと思うのですが
これだとちょっと自分の意図とは違うようです。

>Jitta on the way さん
キャンバスというのはSystem.Windows.Controls名前空間のCanvasクラスのことで良いのでしょうか?
http://msdn2.microsoft.com/ja-jp/library/system.windows.controls.canvas(VS.80).aspx
まだちょっと使い方が分からないので、引き続き調査したいと思います。
結果は追ってご報告いたします。

>倉田 有大さん
はい。イメージはその通りです。
ただ、単純に縦横の値を入れ替えただけでは、実際に描画した際に、元々の縦の長さと回転後の横の長
さが一致しないのでどうにか調整出来ないか、と思っています。


ピクセル単位で描画しているのがマズイのかと思い、以下のように修正し、単位をインチに変えてみた
のですが結果は同じでした。

private void pictbox_Paint(object sender, PaintEventArgs e)
{
   e.Graphics.PageUnit = GraphicsUnit.Inch;
      e.Graphics.DrawImage(img, 0, 0, img.Width / img.HorizontalResolution, 
              img.Height / img.VerticalResolution);
}

HorizontalResolutionもVerticalResolutionも値は同じ96.0でした・・・
同じ値で割っても意味無いですよね・・・
何か根本的に勘違いしてるんでしょうか

引用返信 編集キー/
■15076 / inTopicNo.6)  Re[3]: C#-画像の回転処理について
□投稿者/ Jitta on the way (48回)-(2008/03/04(Tue) 07:26:57)
No15075 (ざーぼん さん) に返信
> お返事が送れ申し訳ありません。
>
> >やじゅさん
> ご回答ありがとうございます。
> 提示いただいたリンク先の内容は、縦横の比率を維持したままの拡大処理だと思うのですが
> これだとちょっと自分の意図とは違うようです。
>
> >Jitta on the way さん
> キャンバスというのはSystem.Windows.Controls名前空間のCanvasクラスのことで良いのでしょうか?

ああ、ごめんなさい、クラス名でいくと、Graphics とか Bitmap です。他のフレームワークと混乱していました。


長さが一致しないとは、どれくらいのズレがあるのでしょうか。
引用返信 編集キー/
■15082 / inTopicNo.7)  Re[3]: C#-画像の回転処理について
□投稿者/ Tom Yama (36回)-(2008/03/04(Tue) 10:42:41)
No15075 (ざーぼん さん) に返信
> ピクセル単位で描画しているのがマズイのかと思い、以下のように修正し、単位をインチに変えてみた
> のですが結果は同じでした。
>
> private void pictbox_Paint(object sender, PaintEventArgs e)
> {
>    e.Graphics.PageUnit = GraphicsUnit.Inch;
> e.Graphics.DrawImage(img, 0, 0, img.Width / img.HorizontalResolution,
>               img.Height / img.VerticalResolution);
> }
>
> HorizontalResolutionもVerticalResolutionも値は同じ96.0でした・・・
> 同じ値で割っても意味無いですよね・・・
> 何か根本的に勘違いしてるんでしょうか
幅と高さを指定せずに、DrawImage() を呼んだら、どうなりますか?
引用返信 編集キー/
■15122 / inTopicNo.8)  Re[1]: C#-画像の回転処理について
□投稿者/ myugaru (29回)-(2008/03/05(Wed) 01:05:56)
myugaru さんの Web サイト
No15031 (ざーぼん さん) に返信
画像のフォーマットは何ですか?jpgだったらサイズが変わったりしますよ。
jpgの内部サイズはBitmapクラスのWidth、Heightに正確に反映されません。Bitmapクラスはjpgの内部のサムネール画像のサイズを設定することが頻繁にあるのです。これはBitmapクラスのバグだと思われます。
もしjpgでしたら一旦ペイントツールなどでpngやbmpへ変換してみてください。その後あなたのやりたい処理をすればおよそ予想通りの結果になる気はします。
jpgでなければ上記は全くあてはずれなので無視してください。
引用返信 編集キー/
■15123 / inTopicNo.9)  Re[4]: C#-画像の回転処理について
□投稿者/ ざーぼん (3回)-(2008/03/05(Wed) 01:17:46)
>Jitta on the way さん
>クラス名でいくと、Graphics とか Bitmap です。他のフレームワークと混乱していました。
ということは「キャンバスを用意して転送」というのはどういった処理になるのでしょうか?
Bitmap bm = new Bitmap(img, new Size(800, 600));
というのとはまた違うのでしょうか?

>長さが一致しないとは、どれくらいのズレがあるのでしょうか。
だいたい1cm〜1.5cm程度のズレがありました。
※ディスプレイの解像度で大分変わるみたいですが…

>Tom Yama
> 幅と高さを指定せずに、DrawImage() を呼んだら、どうなりますか?
んーやっぱりズレてしまいます。


引用返信 編集キー/
■15124 / inTopicNo.10)  Re[2]: C#-画像の回転処理について
□投稿者/ ざーぼん (4回)-(2008/03/05(Wed) 01:38:55)
No15122 (myugaru さん) に返信
> ■No15031 (ざーぼん さん) に返信
> 画像のフォーマットは何ですか?jpgだったらサイズが変わったりしますよ。
> jpgの内部サイズはBitmapクラスのWidth、Heightに正確に反映されません。Bitmapクラスはjpgの内部のサムネール画像のサイズを設定することが頻繁にあるのです。これはBitmapクラスのバグだと思われます。
> もしjpgでしたら一旦ペイントツールなどでpngやbmpへ変換してみてください。その後あなたのやりたい処理をすればおよそ予想通りの結果になる気はします。
> jpgでなければ上記は全くあてはずれなので無視してください。

ご回答ありがとうございます。
ご指摘の通り画像フォーマットはjpgです。
Windows付属のペイントツールにて、画像形式をpng・bmpそれぞれに変換して試してみたのですが
やはり回転後の長さが変化してしまいます。

引用返信 編集キー/
■15125 / inTopicNo.11)  Re[5]: C#-画像の回転処理について
□投稿者/ Jitta on the way (50回)-(2008/03/05(Wed) 07:40:04)
No15123 (ざーぼん さん) に返信
> >Jitta on the way さん
> >クラス名でいくと、Graphics とか Bitmap です。他のフレームワークと混乱していました。
> ということは「キャンバスを用意して転送」というのはどういった処理になるのでしょうか?
> Bitmap bm = new Bitmap(img, new Size(800, 600));
> というのとはまた違うのでしょうか?
>

いえ、それで構いません。構いませんが、ちと気になることが...


> >長さが一致しないとは、どれくらいのズレがあるのでしょうか。
> だいたい1cm〜1.5cm程度のズレがありました。
> ※ディスプレイの解像度で大分変わるみたいですが…
>

んと、上の Bitmap は、ピクセル数で用意していると思います。で、ここは cm ?
プログラム内で使っている単位が統一されていますか?

No1507 のコードだと、img には回転後のイメージがはいっているのですよね?これのサイズがすでにズレているということ?


あ………PaintBox(PictureBox だっけ?)に出力していますね?これのプロパティは、どう設定していますか?プロパティ ウィンドウで、太字になっているものを列挙してみて下さい。
(つか、ピン!ときた人、フォローお願い)
引用返信 編集キー/
■15126 / inTopicNo.12)  Re[3]: C#-画像の回転処理について
□投稿者/ 組込系汐涙餅杆湫マ (1回)-(2008/03/05(Wed) 08:04:48)
ディスプレイがスクウェアピクセル(?)じゃないって事はないですか?
解像度によって、1ドットが正方形じゃ無くなることもあるので、
ピクセル数で縦横を入れ替えるだけだと、長さが同じにならないかもしれませんね
引用返信 編集キー/
■15143 / inTopicNo.13)  Re[4]: C#-画像の回転処理について
□投稿者/ myugaru (31回)-(2008/03/05(Wed) 11:47:25)
myugaru さんの Web サイト
じっさいどんなコードなのか確認したいのですがメール添付してくれませんか?
あー人にみられちゃまずそうなのは加工してくれていいすよ。
引用返信 編集キー/
■15144 / inTopicNo.14)  Re[6]: C#-画像の回転処理について
□投稿者/ Jitta on the way (51回)-(2008/03/05(Wed) 11:57:07)
No15125 (Jitta on the way さん) に返信

> あ………PaintBox(PictureBox だっけ?)に出力していますね?これのプロパティは、どう設定していますか?プロパティ ウィンドウで、太字になっているものを列挙してみて下さい。
> (つか、ピン!ときた人、フォローお願い)


PictureBox.SizeMode が、StretchImage になっていたりして。Normal か、AutoSize に。
引用返信 編集キー/
■15145 / inTopicNo.15)  Re[1]: C#-画像の回転処理について
□投稿者/ myugaru (32回)-(2008/03/05(Wed) 11:59:02)
myugaru さんの Web サイト
No15031 (ざーぼん さん) に返信
> こんにちは。
> Visual C#2005EE .Net Framework2.0での画像処理についてご質問です。
>
> PictureBoxにFromStreamメソッドで読み込んだ画像を表示しています。
> 画像の描画はPicturBoxのPaintイベントにてGraphics.DrawImageメソッドを使用して行っています。
>
> private void pictbox_Paint(object sender, PaintEventArgs e)
> {
> e.Graphics.DrawImage(img, 0, 0, img.Width, img.Height );
> }
>
> その画像をRotateFlipメソッドにて90度回転させ表示した際に、縦横の見た目の長さが回転する前と比較して変化してしまいます。
>
> 回転前のサイズで描画するにはどうすれば良いのでしょうか?
>

あとねえ。まだ何も見てないからなんともいえないのだけど、
画像をファイルから読むのにStream使うのはどうしてですか?
画像よむならBitmap bmp = new Bitmap(画像ファイル)でいいでしょうに?
それでも100歩譲ってたとえばリソースストリームから読んでます、って事だとしてもですよ
Imageに入れちゃうとやっぱダメな方向へ進む確率は高くなると思います。
なるべくがんばってBitmapに入れたほうが良い傾向に向かう気はします。
引用返信 編集キー/
■15150 / inTopicNo.16)  Re[2]: C#-画像の回転処理について
□投稿者/ 渋木宏明(ひどり) (666回)-(2008/03/05(Wed) 12:26:25)
渋木宏明(ひどり) さんの Web サイト
> あとねえ。まだ何も見てないからなんともいえないのだけど、
> 画像をファイルから読むのにStream使うのはどうしてですか?

Bitmap クラスが画像ファイルを使用中のままにするのを回避するためでは。

> Imageに入れちゃうとやっぱダメな方向へ進む確率は高くなると思います。

どして? Bitmap は Image 派生なんだから、Bitmap 固有のメソッドを呼び出す予定がなければ別に Image として参照しても何の問題もないと思いますけど?
引用返信 編集キー/
■15166 / inTopicNo.17)  Re[3]: C#-画像の回転処理について
□投稿者/ myugaru (33回)-(2008/03/05(Wed) 22:34:31)
myugaru さんの Web サイト
No15150 (渋木宏明(ひどり) さん) に返信
>>あとねえ。まだ何も見てないからなんともいえないのだけど、
>>画像をファイルから読むのにStream使うのはどうしてですか?
>
> Bitmap クラスが画像ファイルを使用中のままにするのを回避するためでは。
>
>>Imageに入れちゃうとやっぱダメな方向へ進む確率は高くなると思います。
>
> どして? Bitmap は Image 派生なんだから、Bitmap 固有のメソッドを呼び出す予定がなければ別に Image として参照しても何の問題もないと思いますけど?

まあそこまでわかってりゃこのスレたてない罠w
引用返信 編集キー/
■15167 / inTopicNo.18)  Re[6]: C#-画像の回転処理について
□投稿者/ ざーぼん (5回)-(2008/03/06(Thu) 00:31:12)
>Jitta on the way さん
>>>長さが一致しないとは、どれくらいのズレがあるのでしょうか。
>>だいたい1cm〜1.5cm程度のズレがありました。
>>※ディスプレイの解像度で大分変わるみたいですが…
>>
>
> んと、上の Bitmap は、ピクセル数で用意していると思います。で、ここは cm ?
> プログラム内で使っている単位が統一されていますか?
>
> No1507 のコードだと、img には回転後のイメージがはいっているのですよね?これのサイズがすでにズレているということ?

プログラム内での処理単位はピクセルで統一されています。

ごめんなさい、若干誤解があるようです。
プログラム上での長さ(ピクセル)には特に問題ありません。
幅:高さが800×600(ピクセル)の画像をRotateFlipメソッドで回転させれば、プログラム上での幅・高さは600×800(ピクセル)になります。
「長さが一致しない」というのは、実際に画面上に表示した際の「見た目」の話になります。
例えば800×600の画像を画面に表示した際「見た目の幅」が20cmだとして、その画像を90度回転させます。
この時に、回転後の画像(600×800)の「高さ」と回転前の画像の「幅」は同じ800ピクセルなのですが、
回転後の画像の「見た目の高さ」は21cmと異なってしまうので、これをなんとか調節できないものかというのが本題になります。

説明が下手糞で申し訳ありません。
そもそも「見た目の」という曖昧な表現がよく無かったですね…

組込系汐涙餅杆湫マ さん(組込系プログラマさん?)がおっしゃる様に
>解像度によって、1ドットが正方形じゃ無くなることもある
というのが原因なのかな、と思います。

自分なりに色々と調べてみて、画面の物理的な大きさと、解像度から1mm辺りのピクセル数を算出すれば・・・と思ったのですが
「画面の物理的な大きさ」がまず取得できませんでした。
APIのGetDeviceCapsを使って
GetDeviceCaps(デスクトップのウィンドウハンドル, HORZSIZE)
GetDeviceCaps(デスクトップのウィンドウハンドル, VERTSIZE)
で画面の物理サイズをミリメートル単位で取得できる、らしいのですが、
なぜか画面の解像度を変えるとGetDeviceCapsで取得できる値も変化してしまいます。

ちなみにこの辺りの処理は下記サイトを参考にしました。
http://www5d.biglobe.ne.jp/~tomoya03/shtml/vbapi/GetDevIn.htm
http://homepage1.nifty.com/kurichan/html/tips32.htm


長くなったので1回投稿します。


引用返信 編集キー/
■15168 / inTopicNo.19)  Re[5]: C#-画像の回転処理について
□投稿者/ ざーぼん (6回)-(2008/03/06(Thu) 00:45:09)
No15143 (myugaru さん) に返信
> じっさいどんなコードなのか確認したいのですがメール添付してくれませんか?
> あー人にみられちゃまずそうなのは加工してくれていいすよ。
えと、今はTPで確認している所なので、最初に投稿した以上の処理は特にしていません。
こんな感じです。(メソッドを呼び出してるだけのボタンのClickイベントやエラー処理は省きました。)
Streamで読み込んでいるのは渋木宏明(ひどり)さんのおっしゃる通り、読み込んだファイルがロックされる問題を回避するためです。

private Image img = null;
private void DrawPicture(string filepath)
{
    FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read);
    img = (Bitmap)System.Drawing.Bitmap.FromStream(fs);
    fs.Close();
    picttest.Invalidate();
}

private void RotateTest()
{
    img.RotateFlip(RotateFlipType.Rotate90FlipNone);
    picttest.Invalidate();
}

private void picttest_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.DrawImage(img, 0, 0, img.Width, img.Height);
}

引用返信 編集キー/
■15169 / inTopicNo.20)  Re[7]: C#-画像の回転処理について
 
□投稿者/ ざーぼん (7回)-(2008/03/06(Thu) 00:48:48)
No15144 (Jitta on the way さん) に返信
> ■No15125 (Jitta on the way さん) に返信
>
>>あ………PaintBox(PictureBox だっけ?)に出力していますね?これのプロパティは、どう設定していますか?プロパティ ウィンドウで、太字になっているものを列挙してみて下さい。
>>(つか、ピン!ときた人、フォローお願い)
>
>
> PictureBox.SizeMode が、StretchImage になっていたりして。Normal か、AutoSize に。
PictureBox.SizeModeはNormalに設定してあります。
というか、PictureBoxのプロパティはDockをFillに設定した以外は変更していません。
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -