Discussion:
Bild zuschneiden
(zu alt für eine Antwort)
Christian Engelhardt
2006-03-22 14:26:28 UTC
Permalink
Hallo,

mit der Methode aus einem Image Objet Getthumbnailimage kann ich mir ein
Bild in jeder beliebigen Größe skalieren.
Wie geht es denn, dass ich von einem Bild, nehmen wir an 150 Hoch x 650
Breit, nur einen Teil anzeigen lasse, also bsp. von diesem Bild 150 x 320
herausschneide ?
Hab schon mit dem Graphics Objekt rumgespielt, komme aber nicht wirklich zu
ner Lösung.

mfg

Christian Engelhardt
Herfried K. Wagner [MVP]
2006-03-22 14:37:54 UTC
Permalink
Hallo Christian!
Post by Christian Engelhardt
mit der Methode aus einem Image Objet Getthumbnailimage kann ich mir ein
Bild in jeder beliebigen Größe skalieren.
Wie geht es denn, dass ich von einem Bild, nehmen wir an 150 Hoch x 650
Breit, nur einen Teil anzeigen lasse, also bsp. von diesem Bild 150 x 320
herausschneide ?
Schau dir die Überladungen von 'Graphics.DrawImage' an!
--
M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://classicvb.org/petition/>
Christian Engelhardt
2006-03-22 14:56:29 UTC
Permalink
Mach ich ja und so ca. 5 Stück davon hab ich schon durch, aber das Ergebniss
ist
nicht annähernd was ich möchte. Irgendwie skaliert der immer.
Post by Herfried K. Wagner [MVP]
Hallo Christian!
Post by Christian Engelhardt
mit der Methode aus einem Image Objet Getthumbnailimage kann ich mir ein
Bild in jeder beliebigen Größe skalieren.
Wie geht es denn, dass ich von einem Bild, nehmen wir an 150 Hoch x 650
Breit, nur einen Teil anzeigen lasse, also bsp. von diesem Bild 150 x 320
herausschneide ?
Schau dir die Überladungen von 'Graphics.DrawImage' an!
--
M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://classicvb.org/petition/>
Christian Engelhardt
2006-03-22 15:09:34 UTC
Permalink
Hallo Herfried,

ich check das nicht. Hier wie ich es probiert habe:

'Ausgangsbild mit 150 Hoch x 650 breit
oVorschau = oImage.FromStream(oStream)

'Dann streng nach Beipspiel möchte ich in der oberen Linken Ecke
beginnend aus dem Bild den Bereich von 150 x 320 Pixeln ausschneiden

'Koordinaten für die obere linke Ecke meines Bildes
Dim x As Single = 0.0F
Dim y As Single = 0.0F
'Rechteck das den Ausschneidebereich angibt
Dim srcRect As New RectangleF(0.0F, 0.0F, 320.0F, 150.0F)
Dim units As GraphicsUnit = GraphicsUnit.Pixel
' Graphics Objekt erstellen von meinen großen Bild und rechtech auschneiden

oGraphics = System.Drawing.Graphics.FromImage(oVorschau)
oGraphics.DrawImage(oVorschau, x, y, srcRect, units)

Return oVorschau

Das Bild kommt unverändert zurück. Was vergessen ?
Post by Herfried K. Wagner [MVP]
Hallo Christian!
Post by Christian Engelhardt
mit der Methode aus einem Image Objet Getthumbnailimage kann ich mir ein
Bild in jeder beliebigen Größe skalieren.
Wie geht es denn, dass ich von einem Bild, nehmen wir an 150 Hoch x 650
Breit, nur einen Teil anzeigen lasse, also bsp. von diesem Bild 150 x 320
herausschneide ?
Schau dir die Überladungen von 'Graphics.DrawImage' an!
--
M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://classicvb.org/petition/>
Stefan Simon
2006-03-22 16:12:12 UTC
Permalink
Dein Code ist soweit ricjtig, dein Problem ist was anderes. Du hast eine
Quelle (oVorschau), kopierst den Bereich von 0,0,320,150 (x, y, w, h) an die
gleiche Stelle wo du es herholst. Dein Code tut genau das, was du willst,
ist optisch nichts davon zu sehen.

Erstelle oGraphics mal nicht von oVorschau sonder von einer 2. Picturebox,
dann siehst du, was ich meine.

Stefan
Christian Engelhardt
2006-03-22 20:10:27 UTC
Permalink
Hallo Stefan,

danke für den Tipp. Habs gesehen. Trotzdem mag ich jetzt nimmer. Das
entbehrt für mich jeglicher Logik. Jetzt hab ich es geschafft, genau den
Bereich aus dem Ursprungsimage herauszuschneiden und in ein anderes mit
DrawImage reinzukopieren und was passiert jetzt ? Plötzlich ist der
ausgeschnittene Bereich nur noch halb so hoch. Ich hab ne höhe von 320
ausgeschnitten und im ausgegebenen ist er nur noch 160 Hoch. Aber die Grafik
ist komplett da. Nur halt halb so hoch. Super.
Post by Stefan Simon
Dein Code ist soweit ricjtig, dein Problem ist was anderes. Du hast eine
Quelle (oVorschau), kopierst den Bereich von 0,0,320,150 (x, y, w, h) an die
gleiche Stelle wo du es herholst. Dein Code tut genau das, was du willst,
ist optisch nichts davon zu sehen.
Erstelle oGraphics mal nicht von oVorschau sonder von einer 2. Picturebox,
dann siehst du, was ich meine.
Stefan
Karsten Sosna
2006-03-23 05:41:43 UTC
Permalink
Post by Christian Engelhardt
danke für den Tipp. Habs gesehen. Trotzdem mag ich jetzt nimmer. Das
entbehrt für mich jeglicher Logik. Jetzt hab ich es geschafft, genau den
Bereich aus dem Ursprungsimage herauszuschneiden und in ein anderes mit
DrawImage reinzukopieren und was passiert jetzt ? Plötzlich ist der
ausgeschnittene Bereich nur noch halb so hoch. Ich hab ne höhe von 320
ausgeschnitten und im ausgegebenen ist er nur noch 160 Hoch. Aber die Grafik
ist komplett da. Nur halt halb so hoch. Super.
Christian,
die Logik ist hier wirklich gerade:
\\\
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles Me.Paint
'Erstellt die Quelle
Dim BM_Src As New Bitmap("C:\Temp\Testbild-ATV.jpg") '1600x1200 Pixel
'Quellgrafik auf dem Formular ausgeben.
e.Graphics.DrawImage(BM_Src, 0, 0)
'Größe des Quellausschnitts
Dim srcRect As New Rectangle(0, 0, 100, 100)
'Größe des Ziels
Dim dstRect As New Rectangle(0, 0, 200, 200)
'Erstellt das Zielobject
Dim BM_Dst As New Bitmap(dstRect.Width, dstRect.Height)
'Graphics-Objekt vom Ziel, den dort soll gezeichnet werden.
Dim G_Dst As Graphics = Graphics.FromImage(BM_Dst)
'Ausschnitt auf dem Ziel ausgeben.
G_Dst.DrawImage(BM_Src, dstRect, srcRect, GraphicsUnit.Pixel)
'Zielgrafik auf dem Formular ausgeben.
e.Graphics.DrawImage(BM_Dst, 0, 0)
'Objekte zerstören.
G_Dst.Dispose()
BM_Dst.Dispose()
BM_Src.Dispose()
End Sub
///

Wie Du siehst habe ich ein Quellrechteck(100x100) und ein
Zielrechteck(200x200). D.h. ich will die Quelle doppelt so groß ausgeben.
Wenn die Quelle und das Ziel gleich groß sind findet auch keine Verzerrung
statt.
--
Gruß Scotty
Christian Engelhardt
2006-03-23 10:46:23 UTC
Permalink
Hallo Karsten,

vielen vielen Dank. Jetzt gehts einwandfrei. Diese Zeile hat mir gefehlt. Da
hätte ich mir die Überladungen von Bitmap mal genauer ansehen sollen.

Dim BM_Dst As New Bitmap(dstRect.Width, dstRect.Height)

Jetzt wird wirklich ausgeschnitten und nicht skaliert. Super.
Ich hatte den Fehler gemacht, dass mein Zielbild schon skaliert war.
Post by Karsten Sosna
Post by Christian Engelhardt
danke für den Tipp. Habs gesehen. Trotzdem mag ich jetzt nimmer. Das
entbehrt für mich jeglicher Logik. Jetzt hab ich es geschafft, genau den
Bereich aus dem Ursprungsimage herauszuschneiden und in ein anderes mit
DrawImage reinzukopieren und was passiert jetzt ? Plötzlich ist der
ausgeschnittene Bereich nur noch halb so hoch. Ich hab ne höhe von 320
ausgeschnitten und im ausgegebenen ist er nur noch 160 Hoch. Aber die Grafik
ist komplett da. Nur halt halb so hoch. Super.
Christian,
\\\
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles Me.Paint
'Erstellt die Quelle
Dim BM_Src As New Bitmap("C:\Temp\Testbild-ATV.jpg") '1600x1200 Pixel
'Quellgrafik auf dem Formular ausgeben.
e.Graphics.DrawImage(BM_Src, 0, 0)
'Größe des Quellausschnitts
Dim srcRect As New Rectangle(0, 0, 100, 100)
'Größe des Ziels
Dim dstRect As New Rectangle(0, 0, 200, 200)
'Erstellt das Zielobject
Dim BM_Dst As New Bitmap(dstRect.Width, dstRect.Height)
'Graphics-Objekt vom Ziel, den dort soll gezeichnet werden.
Dim G_Dst As Graphics = Graphics.FromImage(BM_Dst)
'Ausschnitt auf dem Ziel ausgeben.
G_Dst.DrawImage(BM_Src, dstRect, srcRect, GraphicsUnit.Pixel)
'Zielgrafik auf dem Formular ausgeben.
e.Graphics.DrawImage(BM_Dst, 0, 0)
'Objekte zerstören.
G_Dst.Dispose()
BM_Dst.Dispose()
BM_Src.Dispose()
End Sub
///
Wie Du siehst habe ich ein Quellrechteck(100x100) und ein
Zielrechteck(200x200). D.h. ich will die Quelle doppelt so groß ausgeben.
Wenn die Quelle und das Ziel gleich groß sind findet auch keine Verzerrung
statt.
--
Gruß Scotty
d***@gmail.com
2012-08-16 23:30:38 UTC
Permalink
Post by Herfried K. Wagner [MVP]
Hallo Christian!
Post by Christian Engelhardt
mit der Methode aus einem Image Objet Getthumbnailimage kann ich mir ein
Bild in jeder beliebigen Größe skalieren.
Wie geht es denn, dass ich von einem Bild, nehmen wir an 150 Hoch x 650
Breit, nur einen Teil anzeigen lasse, also bsp. von diesem Bild 150 x 320
herausschneide ?
Schau dir die Überladungen von 'Graphics.DrawImage' an!
--
M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://classicvb.org/petition/>
Loading...