![]() |
Datenbank: Access Datenbank • Version: 2000 • Zugriff über: ADOTable
DBImage - Bitmap ist ungültig
Warum kommt immer der Fehler ,,Bitmap ist ungültig"?
Ich habe eine datenbank, wo bitmap dateien gespeichert sind. Auf die Datenbank greif ich über ein AdoTable zu. Nun möchte ich mit ein DBImage die Bitmap Datei aus der Datenbank anzeigen lassen. Aber es kommt immer die Fehlermeldung ,,Bitmap ist ungültig". |
Re: DBImage - Bitmap ist ungültig
Wie wurden die Bitmaps in der DB gespeichert? Mit Access-Mitteln?
|
Re: DBImage - Bitmap ist ungültig
ich habe eine spalte mit ole-object in access angelegt und lade das Bitmap über Access in die Datenbank
|
Re: DBImage - Bitmap ist ungültig
Zitat:
Du mußt vor dem Anzeigen diese Bytes wegschneiden. Hier im Forum müssten auch schon fast fertige Lösungen vorhanden sein welche auf TImage statt TDBImage basieren. |
Re: DBImage - Bitmap ist ungültig
also müsste ich statt eines DBImages ein Image nehmen?
|
Re: DBImage - Bitmap ist ungültig
Zitat:
|
Re: DBImage - Bitmap ist ungültig
wie soll das funnktionieren mit dem abschneiden von dem header?
|
Re: DBImage - Bitmap ist ungültig
Ich komme einfach nicht weiter. Habe keine Ahnung wie das funktionieren soll.
|
Re: DBImage - Bitmap ist ungültig
Könntet ihr mir mal bitte weiterhelfen? Da ich absolut nicht weiterkomme mit dem Image.
|
Re: DBImage - Bitmap ist ungültig
1, Lade das Image aus der DB in einen TMemory/TFileStream
2, Schreibe ab dem 79 Byte die Daten in einen weiteren Stream
Delphi-Quellcode:
3, Speichere diesen 2ten Stream als Temporäre Datei
OrgStream.Position := 78
OrgStream.SaveToStream(DestStream) 4, Lade diese temporäre Datei in einer TImage-Komponente 5, Lösche die temporäre Datei Wenn du diesen Weg erstmal hast kannst du probieren diesen zu optimieren (Keine zwischenspeicherung auf Festplatte, ...) |
Re: DBImage - Bitmap ist ungültig
Krieg das irgendwie nich hin.
Hab jetz folgendes da stehn, aber wenn ich die Datei mit nem Hex-Editor öffne, is der header noch vorhanden. Was mache ich falsch?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var MemoryStream, DestStream: TMemoryStream; Bitmap: TBitmap; begin with AdoDataset1 do begin Bitmap:= TBitmap.Create; MemoryStream := TMemoryStream.Create; Deststream := TMemoryStream.Create; MemoryStream.LoadFromStream(CreateBlobstream(FieldByName('Bild'),bmRead)); MemoryStream.Position := 78; MemoryStream.SaveToStream(DestStream); MemoryStream.SaveToFile('temp.bmp'); // Bitmap.LoadFromStream(DestStream); // Image1.Picture.Bitmap := Bitmap; end; end; |
Re: DBImage - Bitmap ist ungültig
Hmm...das ist merkwürdig. Müsste eigtl. funktionieren...
Probier mal nochn bisschen rum... |
Re: DBImage - Bitmap ist ungültig
müsste auch ohne Zwischenspeichern gehen. Folgendes funzt, wenn das Bitmap direkt drinsteht (also ohne OLE Header):
Delphi-Quellcode:
Du müsstest eigentlich nur noch die richtige Position rausfinden und den Stream sauber positionieren.
procedure TMainForm.LoadBMP;
var bmp:TBitmap; ms:TMemoryStream; begin ms:=TMemoryStream.Create; try TBlobField(tbBilder.FieldByName('Bild')).SaveToStream(ms); ms.Position:=0; bmp:=TBitmap.Create; try bmp.LoadFromStream(ms); Image1.Picture.Assign(bmp); finally FreeAndNil(bmp); end; finally FreeAndNil(ms); end; end; |
Re: DBImage - Bitmap ist ungültig
wie meinst du, wenn das Bitmap direkt drin steht? Wie funktioniert das (ohne Header)?
|
Re: DBImage - Bitmap ist ungültig
Zitat:
Delphi-Quellcode:
Der Datei-Header steht da schon drin, nur nicht das, was Krüppel-ACCESS drumrum baut.
TBlobField(tbBilder.FieldByName('Bild')).LoadFromFile('test.bmp');
|
Re: DBImage - Bitmap ist ungültig
Ob ich bei Position 78 oder 200 eintrage, ist egal. Denn irgendwie schneidet der nichts davon weg. Ich komme irgendwie nicht damit zurecht. Es kommt immer die Fehlermeldung ,,Bitmap ist ungültig".
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var bmp:TBitmap; ms:TMemoryStream; begin ms:=TMemoryStream.Create; try TBlobField(AdoDataset1.FieldByName('Bild')).SaveToStream(ms); ms.Position:=0; bmp:=TBitmap.Create; ms.SaveToFile('temp.bmp'); try bmp.LoadFromStream(ms); Image1.Picture.Assign(bmp); finally FreeAndNil(bmp); end; finally FreeAndNil(ms); end; TBlobField(AdoDataset1.FieldByName('Bild')).LoadFromFile('temp.bmp'); end; |
Re: DBImage - Bitmap ist ungültig
Zitat:
Nimm Access, speicher darin ein Bild aus einer Datei. Dann speicher es über TBlobField(...).SaveToFile ab und vergleiche mit einem Hex-Editor, wo denn das durch Access verwurstelte Bild mit der gleichen Signatur anfängt wie das Original (42 4D ...) und schwupps, solltest Du die OLE-Header-Länge haben. Frage: ist es eigentlich ein Bitmap oder zufällig ein JPEG - oder sogar noch was anderes? |
Re: DBImage - Bitmap ist ungültig
ne, das ist schon ein Bitmap.
|
Re: DBImage - Bitmap ist ungültig
Ich habe jetzt die Position gefunden, aber irgendwie wird der bereich nicht weggeschnitten. Es bleibt die Datei unverändert.
|
Re: DBImage - Bitmap ist ungültig
Das ist aber komisch o.O
Mich tät aber auch mal interessieren, wie das funktioniert. |
Re: DBImage - Bitmap ist ungültig
Zitat:
Delphi-Quellcode:
ist es richtig, dass Du jetzt ms.Position auf 78 o.ä. gesetzt hast? Wenn Du danach vom Stream speicherst, musst Du den Stream wieder "zurückspulen" (ms.Position:=78;), bevor Du das LoadFromStream machen kannst. Ein Stream ist ein Bandlaufwerk...Wie bei den guten alten VHS-Kassetten kannst Du nur einmal anschauen, dann musst Du spulen;) Wenn Du also zwei Aktionen machst, setzt dein LoadFromStream am Ende auf...und nicht an Position 78.
ms.Position:=0;
bmp:=TBitmap.Create; ms.SaveToFile('temp.bmp'); try bmp.LoadFromStream(ms); |
Re: DBImage - Bitmap ist ungültig
Ja, damit hast du recht. Aber selbst die Datei(temp.bmp), die aus dem Stream gespeichert wird enthält ja noch diese 78 Bits, die er nicht will und ist damit nicht zu öffnen. Es wird also ab Position 0 gespeichert und nicht ab position 78...
|
Re: DBImage - Bitmap ist ungültig
maron hat Recht. Der Stream wird nicht ab Position 78 gespeichert, sondern der komplette Stream wird gespeichert mit dem falschen header.
|
Re: DBImage - Bitmap ist ungültig
ich kriegs net hin :wall:
|
Re: DBImage - Bitmap ist ungültig
Hallo,
Das Problem ist aber bekannt. Nehme ich mal Google mit delphi access bitmap blob bekomme ich folgende Seite. ![]() Da kann man sich das schön erklären lassen und die Lösung wäre dann ab Seite 4. Heiko |
Re: DBImage - Bitmap ist ungültig
ich habe mir jetzt mal das Beispielprogramm heruntergeladen, aber jetzt kommt immer folgende Meldung:
[Pascal Fataler Fehler] E2202 Package 'VCL50' wird benötigt, konnte aber nicht gefunden werden. |
Re: DBImage - Bitmap ist ungültig
Hallo,
kompilier mal ohne Packages. Entscheidend ist doch aber der Code auf der Seite. Heiko |
Re: DBImage - Bitmap ist ungültig
Ich habe jetzt die Packages entfernt, aber jetzt kommt folgende Fehlermeldung: [Pascal Fehler] Unit1.pas(68): E2010 Inkompatible Typen: 'TBlobField' und 'TADOTable'.
Delphi-Quellcode:
bS := TADOBlobStream.Create(AdoTable1, bmRead);
|
Re: DBImage - Bitmap ist ungültig
Hallo,
da steht aber bS := TADOBlobStream.Create(AdoTable1Picture, bmRead); und nicht bS := TADOBlobStream.Create(AdoTable1, bmRead); Edit: Hm, er findet die MDB nicht ... Heiko |
Re: DBImage - Bitmap ist ungültig
ich habe aber doch das AdoTable in AdoTable1 umbenannt. Das heißt jetzt nicht mehr AdoTable1Picture sondern AdoTable1.
|
Re: DBImage - Bitmap ist ungültig
Hallo,
AdoTable1Picture ist ein Blobfeld, kein TAdoTable. hier sogar ein sogenanntes persistentes Feld (per Doppelklick auf die AdoTable erzeugt). Heiko |
Re: DBImage - Bitmap ist ungültig
Ich habe jetzt bei dem Beispielprogramm mal eine Variable mit dem Namen ,,Bild" deklariert. Aber wenn ich nach dem Ausführen auf den Button drücke, dann kommt immer eine Fehlermeldung. Ich weis auch nicht, ob ich überhaupt eine Variable deklarieren muss. Ich komme einfach nicht weiter.
Delphi-Quellcode:
var bS : TADOBlobStream; Pic : TJpegImage; Bild:TBlobfield; begin bS := TADOBlobStream.Create(Bild, bmRead); try bS.Seek(JpegStartsInBlob(Bild), soFromBeginning); |
Re: DBImage - Bitmap ist ungültig
Hallo,
Bild: TBlobfield ist eine Klasse, die muss vorher natürlich erst mal erzeugt werden, bevor sie verwendet werden kann. -> Online-Hilfe. Heiko |
Re: DBImage - Bitmap ist ungültig
cool ich habe es endlich durch eure Hilfe hinbekommen. Danke nochmal. :bounce1:
Ich habe mal noch ne Frage. Und zwar wie kann ich das Bild, das über einen Openpicturedialog in ein image geladen wird nun in der Datenbank speichern. |
Re: DBImage - Bitmap ist ungültig
Dafür solltest du vielleicht lieber einen neuen Thread aufmachen ;)
|
Re: DBImage - Bitmap ist ungültig
du hast recht :shock:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz