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

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

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

Re[3]: 画像拡大時のズレ


(過去ログ 99 を表示中)

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

■59373 / inTopicNo.1)  画像拡大時のズレ
  
□投稿者/ B/B (3回)-(2011/05/23(Mon) 22:41:53)

分類:[C#] 

VisualStudio&C#にて、画像をPictureBoxに拡大表示すると、画像が若干左上に寄ってしまいます。(縮小時は問題ありません)

例えば、以下のようなサイズ8x8の画像を8倍で表示すると、画像が4ピクセルくらいズレてしまいます。
なので、左上の□が右下の□に比べて半分の大きさになっています。
□■□□□□■□
■■■■■■■■
□■□□□□■□
□■□□□□■□
□■□□□□■□
□■□□□□■□
■■■■■■■■
□■□□□□■□

具体的には、以下の様にすると再現できます。

1.C#でフォームアプリケーションを作成
2.フォーム内にPictureBoxを作成。Locationを0,0に設定
3.Paintイベント内にプログラムを以下のように追加
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
 //拡大後の画像が見やすいように補間方法を指定
 e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
 //画像の読み込み
 Bitmap img = new Bitmap("gazou.bmp");
 //画像を8倍に拡大して描画
 e.Graphics.DrawImage(img, 0, 0, 8 * img.Width, 8 * img.Height);
}

ちなみに、どんな画像であれ8倍拡大ならば4ピクセル、32倍ならば16ピクセル左上にずれていたので
私なりの仮説では、もともとPictureBoxに描画すると画像が0.5ずつ左上にずれているのではないかと考えています。

解決策として、PixelOffsetModeをHighQualityにしてから描画することでズレもなく表示できるようになりました。
しかし、他にも何か方法があるのではないか、どうしてズレが発生するのかが分からないので、分かる方がいらっしゃいましたら教えてください。
引用返信 編集キー/
■59375 / inTopicNo.2)  Re[1]: 画像拡大時のズレ
□投稿者/ 魔界の仮面弁士 (2180回)-(2011/05/23(Mon) 23:42:00)
No59373 (B/B さん) に返信
> 具体的には、以下の様にすると再現できます。
Bitmap の using (Dispose)処理が抜けていますね。サンプル作成時の漏れだとは思いますけれど。

> 解決策として、PixelOffsetModeをHighQualityにしてから描画することで
Half でも可。

> どうしてズレが発生するのかが分からないので、
規定のアンチエイリアス処理では、座標の左上では無く、座標中央の色が参照されるためかと。

等倍時や縮小時であれば 1 ドット未満の単位になるため、画面上の表示には
影響が出にくいですが、拡大時には問題になってきますね。
引用返信 編集キー/
■59400 / inTopicNo.3)  Re[2]: 画像拡大時のズレ
□投稿者/ B/B (4回)-(2011/05/25(Wed) 00:00:01)
No59375 (魔界の仮面弁士 さん) に返信
魔界の仮面弁士 さんご回答ありがとうございます。
おかげさまで問題を解決し、納得することが出来ました。


>>解決策として、PixelOffsetModeをHighQualityにしてから描画することで
> Half でも可。
HightQualityは言葉的に処理が重くなるような印象があったのでHalfを使うことにしました。


>>どうしてズレが発生するのかが分からないので、
> 規定のアンチエイリアス処理では、座標の左上では無く、座標中央の色が参照されるためかと。
>
> 等倍時や縮小時であれば 1 ドット未満の単位になるため、画面上の表示には
> 影響が出にくいですが、拡大時には問題になってきますね。
なるほど、だからHalfを使うと、中央ではなく左上が参照されるようになるため、拡大時に左上に寄せることができるようになるのですね。

解決済み
引用返信 編集キー/
■59411 / inTopicNo.4)  Re[3]: 画像拡大時のズレ
□投稿者/ 魔界の仮面弁士 (2183回)-(2011/05/25(Wed) 11:33:30)
No59400 (B/B さん) に返信
>>>どうしてズレが発生するのかが分からないので、
>> 規定のアンチエイリアス処理では、座標の左上では無く、座標中央の色が参照されるためかと。
PixelOffsetMode を設定しておかなかった場合、
右下部分に空きが出てきしまう(背景色が紛れ込んだり、透明になってしまうなど)と
いう問題も起きえますが、これも同様の理由によるものですね。


> なるほど、だからHalfを使うと、中央ではなく左上が参照されるようになるため、拡大時に左上に寄せることができるようになるのですね。
# 左上に寄るという表現だと、左上原点に合うようになるという意味ではなく、
# 左上方向に移動する(≒ズレる)という意味に聞こえる…。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -