DOBON.NET DOBON.NETプログラミング掲示板過去ログ

画像のトリミング後のサイズ

環境/言語:[OS : Windows XP Home Edition / 言語 : Visual Basic .NET / .NET Framework : 3.5]
分類:[.NET]

【解決したい問題】

画像を指定された範囲でトリミングして、その結果を取得する関数を作っているのですが、PictureBoxのImageプロパティに代入して表示してみるとどうも指定した範囲の大きさより小さいみたいです。
Microsoft Visual Basic 2008 Express Edition を使用しています。


Public Function GetSelectedImage(ByVal image As Image, ByVal rectangle As Rectangle) As Image
'
' ▼引数の値が不当でないか確認する
'
' rectangleの引数がPoint.Emptyの場合は例外をスローする。
If rectangle = System.Drawing.Rectangle.Empty Then
Throw New ArgumentException _
("引数にRectangle.Emptyは指定できません。", "rectangle")
End If

' imageの引数がNothingの場合は例外をスローする。
If image Is Nothing Then
Throw New ArgumentException _
("引数にNothingは指定できません。", "image")
End If

' rectangleがイメージの領域外を表しているときに例外をスローする。
If image.Width < rectangle.Right OrElse image.Height < rectangle.Bottom Then
Throw New ArgumentException("指定された領域が正しくありません。イメージ内の領域を指定してください。", "rectangle")
End If

Dim g As Graphics = Nothing
Try
Dim img As New Bitmap(rectangle.Width, rectangle.Height)
g = Graphics.FromImage(img)

g.DrawImage(image, 0, 0, rectangle, GraphicsUnit.Pixel)
Return img
Finally
If g IsNot Nothing Then g.Dispose()
End Try
End Function

フォーム上にName=PictureBox1,SizeMode=AutSizeというPicturBoxがあるとして
Me.PictureBox1.Image = Me.GetSelectedImage(New Bitmap("C:\sample.jpg"), New Rectangle(0, 0, 100, 100))
というコードを実行すると、確かにPictureBoxのサイズは(100,100)になりましたが、表示されている画像は半分強しかありません。

どなたか教えてください。

【解決するために何をしたか】

ビットマップ形式のファイルで実行したところ、指定したサイズで描写されました。
Jpeg形式のほかのファイルで実行してもやはり小さくなります。
DrawImageの引数を変更しても同様の結果になります。
自動スケーリングの問題かもしれません。もしそうであれば、描画先の大きさも指定するか、DrawImageUnscaledAndClippedメソッドを使えばうまくいくでしょう。

g.DrawImage(image, rectangle, rectangle, GraphicsUnit.Pixel)

g.DrawImageUnscaledAndClipped(image, rectangle)
■No22949に返信(管理人さんの記事)
> 自動スケーリングの問題かもしれません。もしそうであれば、描画先の大きさも指定するか、DrawImageUnscaledAndClippedメソッドを使えばうまくいくでしょう。
>
> g.DrawImage(image, rectangle, rectangle, GraphicsUnit.Pixel)
>
> g.DrawImageUnscaledAndClipped(image, rectangle)
>
お教えいただいたとおり
g.DrawImage(image, 0, 0, rectangle, GraphicsUnit.Pixel)
のところを
g.DrawImage(image, New Rectangle(0, 0, rectangle.Width, rectangle.Height), rectangle, GraphicsUnit.Pixel)
というように変えることでうまくできました。

管理人さんならびに、この件について考えてくださった皆さんありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板