Größe eines Image ändern

Hi,

ich habe ein Control, welches Bitmaps darstellt.
Jetzt soll die Größe Userabhängig geändert werden, z.B. 10%, 20%, 50% usw…
Dabei darf die Größe des Controls aber nicht verändert werden.

Über die Standart Proberties der PictureBox komme ich also leider nicht weiter.
Hat vielleicht jemand eine Lösung?

Danke,

Andre

Hallo Andre!

Dieses Problem hatte ich auch vor einiger Zeit. Ich habe es wie folgt gelöst:

Auf der Form ein Panel(System.Windows.Forms.Panel) erstellen. In dieses Panel habe ich dann eine PictureBox(System.Windows.Forms.PictureBox) eingefügt.

Der zugehörige Code schaut etwa so aus:

Übergabe von: inZoom As Integer, stBildpfad As String

Dim imBild As Image 'Bitmapimage zum Auslesen der Bildgröße
Dim inWidth As Integer 'Breite
Dim inHeigth As Integer 'Höhe
Dim fiBild As New FileInfo(stBildpfad) 'FileInfo-Objekt der Bilddatei

If fiBild.Exists = True Then
 Me.Cursor = Cursors.WaitCursor 'Mauscursor als Sanduhr
 imBild = New Bitmap(stBildpfad) 'Bilddatei die angezeigt wird
 inWidth = imBild.Width 'Breite und ...
 inHeigth = imBild.Height 'Höhe werden ausgelesen
 imBild.Dispose() 'Die Bitmap mit dem Bild wird wieder freigegeben

 pbBild.Height = CInt(inHeigth \* (inZoom / 100)) 'Berechnung der Breite und ...
 pbBild.Width = CInt(inWidth \* (inZoom / 100)) 'Höhe mit der Zoomangabe in Prozent
 pbBild.Image = Image.FromFile(stBildpfad) 'Bild laden
 Me.Cursor = Cursors.Default 'Mauscursor auf Standard
End If

Wenn du noch mehr Informationen benötigst, melde dich einfach noch einmal.

mfg
christoph

Hi Christoph,

klasse Lösung, danke.
Werde ich im Hinterkopf behalten, nur wäre mir eine Lösung ohne zweimaliges Laden des Bildes lieber.
Es handelt sich um Entwürfe, die recht groß sind (daher die Zoom Funktion) und über VPN/Internet geladen werden.

Bei diesem Beispiel müßte die Grafik ja bei jedem Zoom In/Out zweimal neu geladen werden.

Danke,

Andre

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo!

Werde ich im Hinterkopf behalten, nur wäre mir eine Lösung
ohne zweimaliges Laden des Bildes lieber.
Es handelt sich um Entwürfe, die recht groß sind (daher die
Zoom Funktion) und über VPN/Internet geladen werden.

Das ist richtig. Meine Anwendung greift im normlen Betrieb auf JPEGs auf DVD (oder Festplatte) zu. Dort habe ich eigentlich keinen spürbaren Nachteil meiner Methode bemerkt. Aber wenn es übers Internet geht, ist das natürlich ein Thema.

Solltest du da eine Lösung finden, wäre ich sehr interessiert daran.

mfg
christoph

Hallo Andre!

Ich habe jetzt gerade in der MSDN nachgeblättert. So sollte es auch gehen, dann könnte man sich tatsächlich das doppelte Laden sparen.

Public bmBild As Bitmap

Public Sub BildLaden(stBildpfad As String)
 Dim fiBild As New FileInfo(stBildpfad) 
 If fiBild.Exists = True Then
 bmBild = New Bitmap(stBildpfad)
 End If
End Sub

Public Sub BildZoom(inZoom as Integer)
 Dim inWidth As Integer
 Dim inHeigth As Integer
 inWidth = bmBild.Width
 inHeigth = bmBild.Height
 pbBild.Height = CInt(inHeigth \* (inZoom / 100))
 pbBild.Width = CInt(inWidth \* (inZoom / 100))
 pbBild.Image = CType(bmBild, Image)
End Sub

Das heißt also, dass das Laden des Bildes nur einmal durchgeführt wird. Und dann wird bei jeden Mal zoomen nur auf die gefüllte Variable zugegriffen.

Der Code oben ist ungetestet, sollte aber zumindest sinngemäß so funktionieren.

mfg
christoph

Hi,

habe nun diese Lösung gefunden bzw. mitgeteilt bekommen:
private static Bitmap ResizePicByWidth(Image sourceImage, double newWidth) {
double sizeFactor = newWidth/sourceImage.Width;
double newHeigth = sizeFactor*sourceImage.Height;
Bitmap newImage = new Bitmap((int) newWidth, (int) newHeigth);
using (Graphics g = Graphics.FromImage(newImage))
{
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(sourceImage, new Rectangle(0, 0, (int) newWidth, (int) newHeigth));
}
return newImage;
}

Vielleicht hilft Dir das ja auch weiter …

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]