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]