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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.15031 の関連記事表示

<< 0 | 1 >>
■15031  C#-画像の回転処理について
□投稿者/ ざーぼん -(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度回転させ表示した際に、縦横の見た目の長さが回転する前と比較して変化してしまいます。

    回転前のサイズで描画するにはどうすれば良いのでしょうか?
親記事 /過去ログ31より / 関連記事表示
削除チェック/

■15034  Re[1]: C#-画像の回転処理について
□投稿者/ やじゅ -(2008/03/03(Mon) 00:35:33)
>
    2008/03/03(Mon) 02:12:23 編集(投稿者)

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

    質問の意図と違うかもしれませんが、
    縦横比が合うように画像を縮小するとかすればいいかも
    http://blog.asura.co.jp/takehara/88bee257fd16423e9706ff9dbf8175ee/entry.aspx
記事No.15031 のレス /過去ログ31より / 関連記事表示
削除チェック/

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

    大きさはわかっているんだから、その大きさのキャンバスを用意して転送したらいい…ってことではなく?
記事No.15031 のレス /過去ログ31より / 関連記事表示
削除チェック/

■15071  Re[1]: C#-画像の回転処理について
□投稿者/ 倉田 有大 -(2008/03/03(Mon) 23:19:56)
    >回転前のサイズで描画するにはどうすれば良いのでしょうか?

    640x480の場合。
    480x640にするってこと?
記事No.15031 のレス /過去ログ31より / 関連記事表示
削除チェック/

■15075  Re[2]: C#-画像の回転処理について
□投稿者/ ざーぼん -(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でした・・・
    同じ値で割っても意味無いですよね・・・
    何か根本的に勘違いしてるんでしょうか
記事No.15031 のレス /過去ログ31より / 関連記事表示
削除チェック/

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

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


    長さが一致しないとは、どれくらいのズレがあるのでしょうか。
記事No.15031 のレス /過去ログ31より / 関連記事表示
削除チェック/

■15082  Re[3]: C#-画像の回転処理について
□投稿者/ Tom Yama -(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() を呼んだら、どうなりますか?
記事No.15031 のレス /過去ログ31より / 関連記事表示
削除チェック/

■15123  Re[4]: C#-画像の回転処理について
□投稿者/ ざーぼん -(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() を呼んだら、どうなりますか?
    んーやっぱりズレてしまいます。

記事No.15031 のレス /過去ログ31より / 関連記事表示
削除チェック/

■15125  Re[5]: C#-画像の回転処理について
□投稿者/ Jitta on the way -(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 だっけ?)に出力していますね?これのプロパティは、どう設定していますか?プロパティ ウィンドウで、太字になっているものを列挙してみて下さい。
    (つか、ピン!ときた人、フォローお願い)
記事No.15031 のレス /過去ログ31より / 関連記事表示
削除チェック/

■15144  Re[6]: C#-画像の回転処理について
□投稿者/ Jitta on the way -(2008/03/05(Wed) 11:57:07)
    No15125 (Jitta on the way さん) に返信

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


    PictureBox.SizeMode が、StretchImage になっていたりして。Normal か、AutoSize に。
記事No.15031 のレス /過去ログ31より / 関連記事表示
削除チェック/

■15169  Re[7]: C#-画像の回転処理について
□投稿者/ ざーぼん -(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に設定した以外は変更していません。
記事No.15031 のレス /過去ログ31より / 関連記事表示
削除チェック/

■15167  Re[6]: C#-画像の回転処理について
□投稿者/ ざーぼん -(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回投稿します。

記事No.15031 のレス /過去ログ31より / 関連記事表示
削除チェック/

■15170  Re[7]: C#-画像の回転処理について
□投稿者/ 渋木宏明(ひどり) -(2008/03/06(Thu) 01:08:18)
>
    > この時に、回転後の画像(600×800)の「高さ」と回転前の画像の「幅」は同じ800ピクセルなのですが、
    > 回転後の画像の「見た目の高さ」は21cmと異なってしまうので、これをなんとか調節できないものかというのが本題になります。

    汎用的な方法は無いです。

    同じサイズのモニタであっても、ベンダやモデルが異なれば微妙な差がみられるでしょうし、ワイドモニタに 4:3 な表示解像度で出力した場合(あるいはその逆)実際にどのような表示となるかはモニタ任せですから。

    画面に表示された正方形の縦横の長さをオペレータに実測してもらって、その値をもとに自力で補正をかける以外に有効な手立てはありません。(それでどれだけの精度が得られるかは。。。)
記事No.15031 のレス /過去ログ31より / 関連記事表示
削除チェック/

■15172  Re[7]: C#-画像の回転処理について
□投稿者/ Jitta on the way -(2008/03/06(Thu) 07:45:44)
    No15167 (ざーぼん さん) に返信
    > 例えば800×600の画像を画面に表示した際「見た目の幅」が20cmだとして、その画像を90度回転させます。
    > この時に、回転後の画像(600×800)の「高さ」と回転前の画像の「幅」は同じ800ピクセルなのですが、
    > 回転後の画像の「見た目の高さ」は21cmと異なってしまうので、これをなんとか調節できないものかというのが本題になります。
    >
    > 説明が下手糞で申し訳ありません。
    > そもそも「見た目の」という曖昧な表現がよく無かったですね…
    >

    途中でもしかしたら?と思ったのですが、やはりそっちでしたか。

    まずは、600ピクセル四方の四角形を表示して、それが正方形にみえるかどうか、ですかね。正方形にみえるなら、縦横の解像度が違うファイルを、同じとして扱っていると考えられます。Bitmap インスタンスを作るときに指定できたと思うので、それでどうにかするか、matrix 作って変形させるか…?
    600*600が正方形に見えないなら、ディスプレイの問題ですから、そっちをどうにかしなきゃ、ですね
記事No.15031 のレス /過去ログ31より / 関連記事表示
削除チェック/

■15171  Re[8]: C#-画像の回転処理について
□投稿者/ myugaru -(2008/03/06(Thu) 07:35:21)
>
    No15170 (渋木宏明(ひどり) さん) に返信
    >>この時に、回転後の画像(600×800)の「高さ」と回転前の画像の「幅」は同じ800ピクセルなのですが、
    >>回転後の画像の「見た目の高さ」は21cmと異なってしまうので、これをなんとか調節できないものかというのが本題になります。
    >
    > 汎用的な方法は無いです。
    >
    > 同じサイズのモニタであっても、ベンダやモデルが異なれば微妙な差がみられるでしょうし、ワイドモニタに 4:3 な表示解像度で出力した場合(あるいはその逆)実際にどのような表示となるかはモニタ任せですから。
    >
    > 画面に表示された正方形の縦横の長さをオペレータに実測してもらって、その値をもとに自力で補正をかける以外に有効な手立てはありません。(それでどれだけの精度が得られるかは。。。)
    >

    渋木宏明(ひどり) さんには無礼な発言をしてしまったかも知れません。反省しています。すみませんでした。
    えっと全く同意しますねえ。プログラム的には全くもって問題はありません。実際4回ボタン押したらちゃんと元に戻るでしょうし。もはや目視だけの世界ですね。
記事No.15031 のレス /過去ログ31より / 関連記事表示
削除チェック/

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

■15124  Re[2]: C#-画像の回転処理について
□投稿者/ ざーぼん -(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それぞれに変換して試してみたのですが
    やはり回転後の長さが変化してしまいます。
記事No.15031 のレス /過去ログ31より / 関連記事表示
削除チェック/

■15126  Re[3]: C#-画像の回転処理について
□投稿者/ 組込系汐涙餅杆湫マ -(2008/03/05(Wed) 08:04:48)
    ディスプレイがスクウェアピクセル(?)じゃないって事はないですか?
    解像度によって、1ドットが正方形じゃ無くなることもあるので、
    ピクセル数で縦横を入れ替えるだけだと、長さが同じにならないかもしれませんね
記事No.15031 のレス /過去ログ31より / 関連記事表示
削除チェック/

■15143  Re[4]: C#-画像の回転処理について
□投稿者/ myugaru -(2008/03/05(Wed) 11:47:25)
>
    じっさいどんなコードなのか確認したいのですがメール添付してくれませんか?
    あー人にみられちゃまずそうなのは加工してくれていいすよ。
記事No.15031 のレス /過去ログ31より / 関連記事表示
削除チェック/

■15168  Re[5]: C#-画像の回転処理について
□投稿者/ ざーぼん -(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);
    }
    
記事No.15031 のレス /過去ログ31より / 関連記事表示
削除チェック/

次の20件>

<< 0 | 1 >>

パスワード/

- Child Tree -