LoadFromStream Lesefehler (Bitmap)
-
und wie wir so etwas gemacht, habe noch nicht viel mit den Builder gearbeitet.
Also ich habe auf der Form ein Image erstellt und dort möchte ich das Livebild darstellen. So eine Framegrabberfunktion liefert mir immer den Pointer mit den Bildinformationen. Wenn ich jetzt mit ScanLine arbeite, wir mir immer nur das letzte aufgenommene Bild gezeigt. Arbeite ich aber im Debug-Modus, werden mir alle Bilder gezeigt. Woran kann das Liegen?
-
Die Optimierung faßt Teilvorgänge zusammen und zeigt nur das Ergevnis an. Solche Probs hab ich öfter. Du mußt etwas einbauen, daß den Prozess dazu zwingt, eine Anzeige durchzuführen.
Geht es, wenn du myImage->Visible = false; setzt? Die Zuweisung des Bildes unsichtbar, dann wieder Visible schalten.
Hab aber auch mit sowas nicht immer Glück. myImage->Refresh(), ProzessMessages()... klappen manchmal, können aber auch als müde Fehlversuche enden. Bin also auch gespannt, was die Profis empfehlen.
-
Hallo
super Omega-X das mit Image->Refresh() funktioniert super. Danke für den Tip. Nur Flackert das Bild ein wenig. Kann man das unterbinden?
-
Super, wenn's geklappt hat. In Schleifen ist es besonders schwer realisierbar.
Das mit dem Flickern hängt mit der Widerholrate zusammen. Noch geht es nicht so schnell, daß das Auge es nicht wahrnimmt. - Da du immer ganze Bilder einfügst, ist es mit einem Film vergleichbar.
Hast du eine neuere BCB-Version. Kannst mal mit DoubleBuffering probieren.
Oder:
Mach das Image unsichtbar
weis das Bild einer Speicherbitmap zu
übernimm das Bild von der Speicherbitmap ins Image
mach Image wieder sichtbar.Warum nicht? Einen versuch könnte es wert sein. Auf die Art funktioniert ja DoubleBuffering (wenngleich es hier nicht so hilfreich sein dürfte).
-
Hallo
Danke für den nächsten Tip. Habe BCB 6.0 und das DoubleBuffering habe ich für
die Form aktiviert. Also das hat nicht geholfen. Habe gelesen das die Funktion keinen einfluss auf das Image hat (habe in der Suchfunktion nachgesehen). Der zweite Vorschlag war schon etwas besser es Flackert immer noch aber ich glaube weniger. Hast mich aber schon sehr weit gebracht, deshalb nochmals Danke
-
Nichts zu danken. Du beziehst dich doch auf meinen Vorschlag, "das fertig gezeichnete Bitmap zB. einem TImage zuzuweisen", oder?

-
War auch über den Dank ganz kleinlaut, @Jansen.
Was ich gesagt hab, waren ja wirklich nur Zusatzinformationen.Jetzt könnte ich zB. sagen, daß es jetzt besser zu sein scheint, rührt ggf. von der größeren Ordnung her. Das noch teilweise im Laden begriffene Bild wurde auf's bereits sichtbare Image übertragen, das bringt dann so einen Wischeffekt. Das vollständige Bild direkt aus dem Speicher mit Assign() kann die volle systemperformance nutzen. Aber ich sag es nicht. Das sind die kleinen Lerneffekte, die mit der Übung sowieso kommen.

-
Hi,
hab ein ähnliches Problem.
Ich will den Inhalt eines Arrays in einen Stream schreiben, und aus diesem Stream dann ein TBitmap erzeugen.
Das Array habe ich vorher schon so bearbeitet, daß dort sämtliche Informationen enthalten sind(FileHeader, InfoHeader...)Der Buffer (m_RcvBuf) ist wie folgt deklariert:
//Breite * Hoehe * Byte/Pixel(24 bit)
MAX_IMAGE_LEN_ = 640*280*3
char m_RcvBuf[MAX_IMAGE_LEN_];TMemoryStream *pms = new TMemoryStream; Graphics::TBitmap *bmp = new Graphics::TBitmap(); if(m_RcvBuf[0] == 0) return false; pms->WriteBuffer(m_RcvBuf, sizeof(m_RcvBuf))); pms->Position = 0; int test = pms->Size; bmp->LoadFromStream(pms); Image2->Picture->Bitmap = bmp;Beim LoadFromStream bekomme ich immer den Fehler: Stream Read Error.
Kann bitte jemand helfen, ich verzweifel gleich;)
Vielen Dank.
mfg
-
Hallo,
Evtl. liegt es an der Anzahl der Bytes beim Rausschreiben. Du schreibst ja hier den gesamten verfügbaren Puffer raus. Ist der aber auch vollständig belegt?
Wie beschreibst du denn m_RcvBuf?
-
Hi,
der Buffer ist vollständig beschrieben.
Er liegt entsprechend dem HBITMAP Format vor.Im Prinzip:
BitmapFileHeader + BitmapInfoHeader + 640*240 Pixel * 3(wegen 24 Bit-Codierung)
Mit den entsprechenden Windows-Api-Funktionen kann ich mir das Bitmap als DIB mit vorher gesetztem DeviceContext auch wunderbar anzeigen lassen.
Nur brauch ich es eben als TBitmap.mfg
-
Wenn du den MemoryStream als Datei rausschreibst, lässt sich die Datei dann als BMP öffnen/wird sie korrekt angezeigt?