Benutzer mit den meisten Antworten
Ausschnitt einer Bitmap in neue Bitmap speichern

Frage
-
Hallo Forum,
ich habe für mein Problem einen Lösungsvorschlag siehe unten) gefunden. Aber der hilft mir bei WPF nicht wirklich da die Funktionen nicht gleich sind und ich mit probieren nicht weiterkomme. Kann mir da wer helfen?
Hier der gefundene Lösungsvorschlag:
Hallo Jan,
das geht über Graphics.DrawImage:
Dim sourceBitmap = New Bitmap(200, 200)
Dim targetBitmap = New Bitmap(25, 25)
Using g = Graphics.FromImage(sourceBitmap)
g.DrawImage(targetBitmap, _
New Rectangle(0, 0, targetBitmap.Width, targetBitmap.Height), _
New Rectangle(20, 20, targetBitmap.Width, targetBitmap.Height), _
GraphicsUnit.Pixel)
End Using
DrawImage hat reichlich Überladungen, schneller kann sein DrawImageUnscaled
Antworten
-
Hallo Thorsten,
ja, das war der richtige Hinweis. Die funktionierende Funktion sieht nun wie folgt aus:
lg heinz
' Image aus Bitmap-Ausschnitt erstellen Private Sub BitmapAusschnittErstellen() Dim m_BasisBitmapSource As New BitmapImage ' BitmapImage.UriSource must be in a BeginInit/EndInit block. m_BasisBitmapSource.BeginInit() m_BasisBitmapSource.UriSource = New Uri("Resources\Bilder1.jpg", UriKind.RelativeOrAbsolute) m_BasisBitmapSource.EndInit() ' Create an Image element. Dim croppedImage As New System.Windows.Controls.Image() croppedImage.Width = 100 croppedImage.Margin = New Thickness(5) ' Create a CroppedBitmap based off of a xaml defined resource. Dim cb As New CroppedBitmap(m_BasisBitmapSource, New Int32Rect(50, 100, 100, 100)) croppedImage.Source = cb 'set image source to cropped mx_Grid.Children.Add(croppedImage) End Sub
- Als Antwort markiert Heinz9 Donnerstag, 14. März 2013 13:30
Alle Antworten
-
Hallo,
ich weiß leider auch nicht wie man ein Bild in WPF "beschneiden" kann, aber eine Möglichkeit wäre, das BitmapImage in eine Bitmap zu konvertieren: http://stackoverflow.com/questions/6484357/converting-bitmapimage-to-bitmap-and-vice-versa
Ein Konverter für C# <> VB.NET: http://codeconverter.sharpdevelop.net/SnippetConverter.aspx
Damit solltest du deinen Codeschnippsel verwenden können. Speichern eines BitmapImages ist dagegen ziehmlich einfach: http://blogs.msdn.com/b/kirillosenkov/archive/2009/10/12/saving-images-bmp-png-etc-in-wpf-silverlight.aspx
Tut mir leid, das ich nur C# code gefunden habe, aber der Konverter meistert das meistens ohne Probleme.
<Code:13/> - Koopakiller [kuːpakɪllɐ]
Webseite | Code Beispiele | Facebook | Snippets -
Hi,
um einen Ausschnitt als neues Bitmap zu erhalten, kannst Du die Überladung der Clone() Methode benutzen die ein Rechteck als Parameter empfängt:
Dim bCropped As Bitmap = CType(bmOrig.Clone(New Rectangle(20, 20, 200, 250), Imaging.PixelFormat.Format32bppArgb), Bitmap)
[Darauf achten dass das Rectangle valide, dh im Bildbereich des Origs ist]
[Graphics. DrawImage geht - natürlich - auch und zwar immer, dann die richtigen Dest und Source rectangles/rectangleFs definieren]
Viele Grüße,
Thorsten
-
Hallo Koopakiller,
ich habe mir die Links angesehen und sie in meinen Code eingebunden. Dabei bekomme ich 2 Fehlermeldungen mit denen ich nichts anfangen kann,
lg heinz
Imports System.IO Imports System.Windows.Controls Imports System.Drawing Imports System.Collections ' Bitmap in BitmapImage konvertieren Private Function BitMapToBitMapImage(ByVal m_Bitmap As Bitmap) As BitmapImage Using ms As MemoryStream = New MemoryStream() Bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png)
<- In oberer Zeile: "Der Verweis auf einen nicht freigegebenen Member erfordert einen Objektverweis ms.Position = 0 Dim bi As New BitmapImage bi.BeginInit() bi.StreamSource = ms bi.EndInit() Return Imaging.CreateBitmapSourceFromHBitmap( Bitmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions())
In obiger Funktion: "CreateBitmapSourceFromHBitmap ist kein Member von Imaging" (was nicht stimmt)
End Using End Function
-
Ein neuer Ansatz mit CopyPixels:
Dabei meckert er bei "m_Array" das diesem noch kein Wert zugewiesen ist und bricht die Verarbeitung ab. Ich weiß aber nicht welchen Wert ich dem Array zuweisen soll? Das "New" geht nicht?
lg heinz
Dim m_rect As New Int32Rect(20, 20, 20, 20) Dim m_Array As Array() m_BasisBitmapSource.CopyPixels(m_rect, m_Array, 0, 0)
-
Hi,
wenn Du nun WPF oder ähnliche Technologien nutzt, dann schau Dir mal die Klasse CroppedBitmap an. Edit: Okay ich sehe, Du hast ja auf WPF hingewiesen im OP... Habs nicht genau genug gelesen.
http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.croppedbitmap.aspx
und diesen Konstruktor:
http://msdn.microsoft.com/en-us/library/ms602486.aspx
Viele Grüße,
Thorsten
- Bearbeitet Thorsten Gudera Donnerstag, 14. März 2013 11:56
-
Hallo Thorsten,
ja, das war der richtige Hinweis. Die funktionierende Funktion sieht nun wie folgt aus:
lg heinz
' Image aus Bitmap-Ausschnitt erstellen Private Sub BitmapAusschnittErstellen() Dim m_BasisBitmapSource As New BitmapImage ' BitmapImage.UriSource must be in a BeginInit/EndInit block. m_BasisBitmapSource.BeginInit() m_BasisBitmapSource.UriSource = New Uri("Resources\Bilder1.jpg", UriKind.RelativeOrAbsolute) m_BasisBitmapSource.EndInit() ' Create an Image element. Dim croppedImage As New System.Windows.Controls.Image() croppedImage.Width = 100 croppedImage.Margin = New Thickness(5) ' Create a CroppedBitmap based off of a xaml defined resource. Dim cb As New CroppedBitmap(m_BasisBitmapSource, New Int32Rect(50, 100, 100, 100)) croppedImage.Source = cb 'set image source to cropped mx_Grid.Children.Add(croppedImage) End Sub
- Als Antwort markiert Heinz9 Donnerstag, 14. März 2013 13:30