| |
VB.NET - Ein- und UmsteigerPicturebox Speichern, allgemeiner GDI+ Fehler | | | Autor: Sentai | Datum: 05.06.09 10:36 |
| Ich habe ein kleines Problem mit dem Speichern einer Picturebox.
Ich habe eine Bilddatei entschlüsselt und lese diese Byteweise aus und es wird zum Filestream.
Ich hab es als Filestream gemacht, weil ich so das bild schneller in eine Picturebox bekomme, als wenn ich diese selber mit Punkten zeichnen lasse.
Ich musste nur einige Änderungen am Bildformat vornehmen.
Folgendes Problem:
Ich lade das Bild mit dem Befehl in die Picturebox ein.
PictureBox1.Image = Drawing.Bitmap.FromStream(reader)
Das Bild wird auch korrekt angezeigt.
Speichern möchte ich es so.
PictureBox1.Image.Save(filename, System.Drawing.Imaging.ImageFormat.Bmp)
Hier kommt eine Fehermeldung:
Allgemeiner Fehler in GDI+.
Errorcode: -2147467259
Seltsam ist nur, wenn ich das Bild Punktweise mit einer Selbstgeschrieben routine in die Picturebox zeichne, lässt sich das Bild problemlos speichern.
Das Zeichnen dauert aber schon 10-15sec. je nach Bildgröße. Für die Bilder gibt es kein guten Konverter im Netz und woltle selber ein schreiben, dazu musste ich nur paar sachen im Filestream ändern, dann ist es eine normale .bmp Datei mit 24bit.
Hat jemand eine Idee wo der fehler liegen könnte?
Danke im vorraus=)
Gruß Sentai | |
Re: Picturebox Speichern, allgemeiner GDI+ Fehler | | | Autor: jvbsl | Datum: 05.06.09 10:40 |
| Hallo,
"Allgemeiner Fehler in GDI+" kenne ich eigentlich nur, wenn eine Bilddatei gespeichert werden soll, obwohl diese bereits vorhanden ist. Aber komisch finde ich dann, dass es bei Pixelweißem einlesen, dieser Fehler nicht kommt...
Gruß jvbsl | |
Re: Picturebox Speichern, allgemeiner GDI+ Fehler | | | Autor: Sentai | Datum: 05.06.09 12:20 |
| hmm, ich denke es muss am Stream liegen, da sind wohl daten drin, die nicht rein gehören, aber die Picturebox scheint es trozdem an zu zeigen, nur beim speichern kommt ein error.
Check ich mal zuhause genauer. | |
Re: Picturebox Speichern, allgemeiner GDI+ Fehler | | | Autor: Sentai | Datum: 05.06.09 12:42 |
| Ja, eine neue Datei, bzw über SaveFileDialog oda wie das heisst =) | |
Re: Picturebox Speichern, allgemeiner GDI+ Fehler | | | Autor: Sentai | Datum: 08.06.09 14:40 |
| Ich hab den Fehler gefunden, nur evt. könnte mir jemand nun helfen.
Ich habe schon viele Berichte über den aufbau einer .bmp Datei gelesen, allerdings wird mir Folgendes nicht ganz klar.
Es geht um ein 256x256 großes Bild mit 24 bits (also 3 Bytes per pixel).
Ich habe nun mit meinem Filestream folgendes gemacht.
Die länge der bmp Datei ergibt sich für mich so.
(header der bmp Datei) + X * Y * 3
=196.608 Bytes
Mit einem Bildbetrachter (Infranview) lässt sich die Datei öffnen, allerdings nicht mit Windows Vorschau und damit wohl auch nicht korrekt in einer Picturebox.
Speichere ich die Datei mit dem Programm als .bmp schreibt er genau den gleichen header, allerdings am ende der Datei füllt er nullen hinzu.
Damit ergibt sich eine Dateigröße von:
=196.662 Bytes (54 bytes mehr)
Ich kann keine Infos dazu finden, wieso das so sein muss, nur lässt sich diese Datei problemlos per Filestream in einer Picturebox laden und auch speichern.
Immer 54 bytes ran hängen scheint nicht die Lösung zu sein.
Kennst sich evt. jemand damit aus? Muss die Größe am Ende eine bestimmte sein?
(z.B. muss jede Zeile in bytes einer BMP Datei durch 4 teilbar sein, wenn nicht werden null bytes angehängt bis es durch 4 teilbar ist)
Sowas ähnliches scheint wohl auch am Ende der Datei zu sein. | |
Re: Picturebox Speichern, allgemeiner GDI+ Fehler | | | Autor: Sentai | Datum: 09.06.09 10:40 |
| Ich komm einfach nicht weiter =(
Ich bin mir sicher das es am den Stream liegt, ich falsche werte übergebe, seltsam ist nur, das die Picturebox es anzeigen kann, aber nicht speichern.
Sub FastFileLoader(ByVal File As String, ByVal x As Integer, ByVal y As _
Integer)
'x,y = Auflösung des Bildes immer 24 bit´s (also 3 Bytes)
Dim Header(13) As Byte
'Vorerst Manueller Header der .bmp Datei
Header(0) = Convert.ToByte(CInt("&h42"))
Header(1) = Convert.ToByte(CInt("&h4D"))
Header(2) = Convert.ToByte(CInt("&h36"))
Header(3) = Convert.ToByte(CInt("&h0c"))
Header(4) = Convert.ToByte(CInt("&h00"))
Header(5) = Convert.ToByte(CInt("&h00"))
Header(6) = Convert.ToByte(CInt("&h00"))
Header(7) = Convert.ToByte(CInt("&h00"))
Header(8) = Convert.ToByte(CInt("&h00"))
Header(9) = Convert.ToByte(CInt("&h00"))
Header(10) = Convert.ToByte(CInt("&h36"))
Header(11) = Convert.ToByte(CInt("&h00"))
Header(12) = Convert.ToByte(CInt("&h00"))
Header(13) = Convert.ToByte(CInt("&h00"))
'wenn temp.bmp vorhanden, dann löschen
IO.File.Delete(Application.StartupPath & "\" & "temp.bmp")
Dim Reader As New IO.FileStream(File, IO.FileMode.Open, _
IO.FileAccess.Read)
Dim Writer As New IO.FileStream(Application.StartupPath & "\" & _
"temp.bmp", IO.FileMode.CreateNew, IO.FileAccess.ReadWrite)
Dim korrektur As Integer
If x * 3 Mod 4 <> 0 Then ' .bmp muss jede Zeile durch 4 Teilbar sein
Do Until (x * 3 + korrektur) Mod 4 = 0
korrektur = korrektur + 1
Loop
End If
'Header der neuen .bmp Schreiben
For a As Integer = 0 To 13
Writer.WriteByte(Header(a))
Next
Reader.Position = 14
'rest Kopieren
Do Until Reader.Position = Reader.Length
Writer.WriteByte(Reader.ReadByte)
Loop
Dim Check As Integer = 54 + (x * y * 3) + (korrektur * y) 'mein Versuch
' die Größe der bmp manuell zu berechnen (Header+x*y*3+Korrektur*y)
'anzeigen der .bmp
PictureBox1.Image = Bitmap.FromStream(Writer)
Reader.Close()
Writer.Close()
End Sub Gespeichert wird so:
PictureBox1.Image.Save(filename, System.Drawing.Imaging.ImageFormat.Bmp)
Neues File wird dabei erzeugt, kein altes oder vorhandenes Überschrieben.
Keiner eine Idee? =(
Beitrag wurde zuletzt am 09.06.09 um 10:58:53 editiert. | |
Re: Picturebox Speichern, allgemeiner GDI+ Fehler | | | Autor: Sentai | Datum: 09.06.09 11:41 |
| Hab eine andere Lösung gefunden -.-, das ich nicht gleich auf die Idee gekommen bin.
Wenn man das Bild speichern möchte, kopiere ich einfach die mit dem writer erzeugte temp.bmp Datei.
Aber mich würde es Trozdem interessieren wieso die Picturebox hier "spinnt", liegt bestimmt an meinem erzeugten File, aber Falls jemand eine Idee hat =) | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats sevWizard für VB5/6
Professionelle Assistenten im Handumdrehen
Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) Weitere Infos
|