vbサンプル集の「画像を回転する」について

タグの編集
投稿者 つみき  (学生) 投稿日時 2009/10/30 23:20:12
お世話になっています。ちょっと気になったことがありまして、投稿いたします。ただ表現が難しいので、分かりにくいかもしれません。私もどう書けば伝わるのか、よく分からないのです。

http://homepage1.nifty.com/rucio/main/dotnet/Samples/Sample144ImageRotate.htm
のサンプルを使って、携帯電話やデジカメから撮ったイメージをpicturebox1に表示して、button1をクリックすることでこれを回転させました。するとなぜか、大体120%くらいでしょうか、少しだけ拡大されような状態になって回転され表示していました。さらに拡大された(ように見える)のに回転した画像のサイズはそのままなので、そのはみ出た部分が切り捨てられて表示されてしまいます。
つまり、240×320のサイズの画像を90度回転させたとすると、回転後のサイズは320×240になりますよね。でも120%に拡大されている(ような)ので384×288の画像なのだから、320×240からはみ出た部分が切り取られて320×240の画像として表示されていました。
今度は240×320(もと画像)から30度回転させたとすると、本来ならば切り取らないように368×397のサイズの白い背景を作り、その上に30度傾いた画像が表示されますが、こちらでは120%に拡大された(ような)画像がそのまま30度傾いて、右上の角と右下の辺りが368×397の白い背景からはみだして切り取られて表示されていました。
なぜこうなってしまうのでしょうか。それ以外の普通の画像ではそうはならず、ちゃんと拡大されず切り取られもせず回転するのですが。

分かりにくい文章ですみません。
投稿者 るきお  (社会人) 投稿日時 2009/10/31 06:17:14
こんにちは。

たぶんその画像だけdpiが小さいのだと思います。
その画像はほかの画像と同じように生成された画像ですか?
また、その画像だけ何かの画像処理ソフトで加工したり、または加工はしなかったけど開いて保存したということはありませんか?

私のロジックではdpiを96に変換する(みたいな)ので、dpiが96でない画像を変換すると拡大したり縮小したりします。

私もちゃんとは理解していないのですが、ほとんどの画像はdpiが96になっており特に問題はないようです。
ためしにPhotoDrawV2でわざとdpiが60のjpgを作成し、回転後拡大してしまうことを確認しました。
以下のように逆に縮小する変換を加えることで拡大を相殺し大きさを変化させないことができるようです。

'▼描画実行 

Dim DestImage As New Bitmap(NewWidth, NewHeight)
Dim g As Graphics = Graphics.FromImage(DestImage)
Dim M As New Drawing2D.Matrix

Dim MagnifyingPowerX As Single = SourceClone.VerticalResolution / 96
Dim MagnifyingPowerY As Single = SourceClone.HorizontalResolution / 96

'背景色の描画 
g.FillRectangle(New SolidBrush(BackColor), DestImage.GetBounds(GraphicsUnit.Pixel))

'回転と平行移動 
M.Translate(OffsetX, 0)
M.Rotate(Degree)
M.Scale(MagnifyingPowerX, MagnifyingPowerY)
g.Transform = M


このコードは全体ではなく、
http://homepage1.nifty.com/rucio/main/dotnet/Samples/Sample144ImageRotate.htm
のサンプルの一部です。

該当部分をこのコードに置き換えて試してみてください。
投稿者 つみき  (学生) 投稿日時 2009/11/2 19:56:19
ありがとうございます。解決しました。

>その画像はほかの画像と同じように生成された画像ですか?
また、その画像だけ何かの画像処理ソフトで加工したり、または加工はしなかったけど開いて保存したということはありませんか?

ない……です。撮影したらそのままパソコンに転送しただけだったのですが。
でもどうやら、そうだったみたいです。