Rubrik: Grafik und Font · Bilder und Icons | VB-Versionen: VB.NET | 26.07.07 |
Bild skalieren (VB.NET) Mit diesem Code lässt sich ein Bild ohne Qualitätsverlust neu skalieren, wobei das Größenverhältnis beibehalten wird. | ||
Autor: Dieter Otter | Bewertung: | Views: 39.083 |
www.tools4vb.de | System: WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Mit diesem Code lässt sich ein Bild ohne Qualitätsverlust neu skalieren, wobei das Größenverhältnis beibehalten wird. Dies ist immer dann interessant, wenn man Bilder in einer PictureBox anzeigen möchte und die Bilder größer oder kleiner als die PictureBox selbst sind. Man kann die Funktion aber auch dazu nutzen, um Thumbnails (Miniaturansichten) von Bilder in einer einheitlichen Größe zu erstellen.
Die Funktion erwartet im ersten Parameter das Bild-Objekt. Die beiden nachfolgenden Parameter legen die maximale Breite und Höhe des Bildes fest. Ist das Bild breiter als die maximal angegebene Breite, wird die Breite des Bildes angepasst, wobei die Höhe neu berechnet wird und umgekehrt, so dass das Größenverhältnis des Originalbildes immer gleich bleibt. Weiterhin wird das Bild bei Anpassung der Breite und/oder Höhe interpoliert, damit die Qualität erhalten bleibt.
Ist das Originalbild sowohl in der Breite als auch in der Höhe kleiner als die angegebenene maximale Dimension, lässt sich über den optionalen Parameter "bStretch" festlegen, ob das Bild gestretcht werden oder in der Originalgröße dargestellt werden soll.
Public Function AutoSizeImage(ByVal oBitmap As Image, _ ByVal maxWidth As Integer, _ ByVal maxHeight As Integer, _ Optional ByVal bStretch As Boolean = False) As Image ' Größenverhältnis der max. Dimension Dim maxRatio As Single = maxWidth / maxHeight ' Bildgröße und aktuelles Größenverhältnis Dim imgWidth As Integer = oBitmap.Width Dim imgHeight As Integer = oBitmap.Height Dim imgRatio As Single = imgWidth / imgHeight ' Bild anpassen? If (imgWidth > maxWidth Or imgHeight > maxHeight) Or (bStretch) Then If imgRatio <= maxRatio Then ' Größenverhältnis des Bildes ist kleiner als die ' maximale Größe, in der das Bild angezeigt werden kann. ' In diesem Fall muss die Bildbreite angepasst werden. imgWidth = imgWidth / (imgHeight / maxHeight) imgHeight = maxHeight Else ' Größenverhältnis des Bildes ist größer als die ' maximale Größe, in der das Bild angezeigt werden kann. ' In diesem Fall muss die Bildhöhe angepasst werden. imgHeight = imgHeight / (imgWidth / maxWidth) imgWidth = maxWidth End If ' Bitmap-Objekt in der neuen Größe erstellen Dim oImage As New Bitmap(imgWidth, imgHeight) ' Bild interpolieren, damit die Qualität erhalten bleibt Using g As Graphics = Graphics.FromImage(oImage) g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic g.DrawImage(oBitmap, New Rectangle(0, 0, imgWidth, imgHeight)) End Using ' neues Bitmap zurückgeben Return oImage Else ' unverändertes Originalbild zurückgeben Return oBitmap End If End Function
Aufrufbeispiel:
' Bild laden Dim oStream As New System.IO.FileStream("bild.jpg", IO.FileMode.Open) Dim oBitmap As Bitmap oBitmap = New Bitmap(oStream) oStream.Close() ' Bild soll optimal an die Größe der PictureBox ' angepasst und angezeigt werden With PictureBox1 .Image = AutoSizeImage(oBitmap, .ClientRectangle.Width, .ClientRectangle.Height) End With