vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
SEPA-Dateien erstellen inkl. IBAN-, BLZ-/Kontonummernprüfung  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Picturebox 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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Picturebox Speichern, allgemeiner GDI+ Fehler 
Autor: ModeratorDieter (Moderator)
Datum: 05.06.09 12:29

Frage: speicherst Du das Bild in eine neue Datei?

_________________________
Professionelle Entwicklerkomponenten
www.tools4vb.de

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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 =)
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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 =)
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel