Hallo, ich habe ein schwerwiegendes Problem.
Ich habe ein Programm geschrieben,mit welchem ich objekte in einer kiste separiere. ich zeichne dann ein binärbild(blau/weiß). ich möchte nun dieses binärbild speichern. Jedoch speichert er immer nur das originalbild.
ich lade ein bild in die picturebox1 und dort wird auch das bild ausgewertet. es entsteht irgendwie kein neues bild, sondern lediglich eine art „maske“, die beim bewegen der maus wieder verschwindet.
wie schaffe ich es, dieses bild als ein neues bild zu speichern.
Kann mir da jemand helfen, ich würde euch mal das projekt schicken, damit ihr mein problem besser versteht.
ich weiß wirklich nicht weiter!
Vielen Dank
Christian Krummrich
Hallo!
Ohne eine einzige Zeile Code kann man Dir nur äußerst schwer helfen.
Nach der Beschreibung könnte es aber sein, dass Du einen recht typischen Anfängerfehler machst: Direktes Zeichnen irgendwohin, außerhalb des OnPaint-Handlers. Das Ergebnis solcher Zeichenaktionen ist immer in dem Moment wieder verloren, wo das zugrunde liegende Control sich selbst neu zeichnet, z.B. beim Verschieben.
Um in ein neues Bild zu malen, musst Du grob sowas schreiben (aus dem Gedächtnis, kein Anspruch auf Vollständigkeit/Fehlerfreiheit!):
Bitmap bmp = new Bitmap(200,100);
using (Graphics g = Graphics.FromBitmap(bmp))
{
g.FillRectangle(Brushes.Red, 10, 10, 100, 50);
}
pictureBox1.Image = bmp;
Gruß,
Martin
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Hi Martin,
ich habe inzwischen das Projekt, verstehe aber .NET noch nicht.
Ich habe das Projekt in VB6 nachgebaut, da ist das nicht viel, aber schnell. Kannst Du das nach VB.NET umschreiben?
Gruß Rainer
Option Explicit
Private Type BITMAP
bmType As Long
bmWidth As Long
bmHeight As Long
bmWidthBytes As Long
bmPlanes As Integer
bmBitsPixel As Integer
bmBits As Long
End Type
Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
Private Declare Function SetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
Dim PicBits() As Byte, PicInfo As BITMAP
Dim Cnt As Long, BytesPerLine As Long
Private Sub Command2\_Click()
Dim tm As Long
tm = Timer
GetObject Picture1.Image, Len(PicInfo), PicInfo
BytesPerLine = (PicInfo.bmWidth \* 3 + 3) And &HFFFFFFFC
ReDim PicBits(1 To BytesPerLine \* PicInfo.bmHeight \* 3) As Byte
GetBitmapBits Picture1.Image, UBound(PicBits), PicBits(1)
'Auswertung
For Cnt = 1 To UBound(PicBits) Step 4
If PicBits(Cnt) \> 100 Then
PicBits(Cnt) = 255
PicBits(Cnt + 1) = 255
PicBits(Cnt + 2) = 255
End If
Next Cnt
SetBitmapBits Picture1.Image, UBound(PicBits), PicBits(1)
Picture1.Refresh
Me.Caption = Round(Timer - tm, 2)
End Sub
Private Sub Command1\_Click()
CommonDialog1.ShowOpen
Picture1.Picture = LoadPicture(CommonDialog1.FileName)
End Sub
Private Sub Command3\_Click()
CommonDialog1.ShowSave
SavePicture Picture1.Image, CommonDialog1.FileName
End Sub
Private Sub Form\_Load()
Picture1.AutoSize = True
Picture1.AutoRedraw = True
Command1.Caption = "laden"
Command2.Caption = "bearbeiten"
Command3.Caption = "sichern"
End Sub
Hi!
Sorry, aber einerseits habe ich nicht den Nerv/die Zeit, jemand anderes Projekte zu übersetzen und andererseits ist der Lerneffekt für alle Beteiligten dabei nicht wirklich gegeben.
Soweit ich dem Code entnehmen konnte, soll wohl ein Schwellwertfilter für den Rotanteil dabei rauskommen, aber was genau mit den Pixeln passiert ist letztlich für das grundsätzliche Verständnis zweitrangig.
Unter http://www.codeproject.com/info/search.aspx?artkw=im…
findet man eine ausgezeichnete Serie von Artikeln von Christian Graus zum Thema „Image Processing mit .NET“.
Gleich der erste Artikel (http://www.codeproject.com/KB/GDI-plus/csharpgraphic…) zeigt gut, wie solche Filter erstellt werden - sehr empfehlenswert.
Gruß,
Martin