Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DBImage - Bitmap ist ungültig (https://www.delphipraxis.net/132989-dbimage-bitmap-ist-ungueltig.html)

uwe12 23. Apr 2009 11:23

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".

Bernhard Geyer 23. Apr 2009 11:35

Re: DBImage - Bitmap ist ungültig
 
Wie wurden die Bitmaps in der DB gespeichert? Mit Access-Mitteln?

uwe12 23. Apr 2009 12:28

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

Bernhard Geyer 23. Apr 2009 13:19

Re: DBImage - Bitmap ist ungültig
 
Zitat:

Zitat von uwe12
ich habe eine spalte mit ole-object in access angelegt und lade das Bitmap über Access in die Datenbank

Und da ergänzt Access noch ein paar Bytes "OLE-Header" so das nur noch Access damit was anfangen kann.
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.

uwe12 23. Apr 2009 13:29

Re: DBImage - Bitmap ist ungültig
 
also müsste ich statt eines DBImages ein Image nehmen?

Bernhard Geyer 23. Apr 2009 13:32

Re: DBImage - Bitmap ist ungültig
 
Zitat:

Zitat von uwe12
also müsste ich statt eines DBImages ein Image nehmen?

Ja. Und den Header selbst wegschneiden.

uwe12 23. Apr 2009 13:54

Re: DBImage - Bitmap ist ungültig
 
wie soll das funnktionieren mit dem abschneiden von dem header?

uwe12 23. Apr 2009 19:30

Re: DBImage - Bitmap ist ungültig
 
Ich komme einfach nicht weiter. Habe keine Ahnung wie das funktionieren soll.

uwe12 24. Apr 2009 08:32

Re: DBImage - Bitmap ist ungültig
 
Könntet ihr mir mal bitte weiterhelfen? Da ich absolut nicht weiterkomme mit dem Image.

Bernhard Geyer 24. Apr 2009 08:37

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:
OrgStream.Position := 78
OrgStream.SaveToStream(DestStream)
3, Speichere diesen 2ten Stream als Temporäre Datei
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, ...)

uwe12 24. Apr 2009 08:47

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;

maron 24. Apr 2009 12:22

Re: DBImage - Bitmap ist ungültig
 
Hmm...das ist merkwürdig. Müsste eigtl. funktionieren...
Probier mal nochn bisschen rum...

joachimd 24. Apr 2009 13:51

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:
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;
Du müsstest eigentlich nur noch die richtige Position rausfinden und den Stream sauber positionieren.

uwe12 24. Apr 2009 14:37

Re: DBImage - Bitmap ist ungültig
 
wie meinst du, wenn das Bitmap direkt drin steht? Wie funktioniert das (ohne Header)?

joachimd 24. Apr 2009 14:52

Re: DBImage - Bitmap ist ungültig
 
Zitat:

Zitat von uwe12
wie meinst du, wenn das Bitmap direkt drin steht? Wie funktioniert das (ohne Header)?

Delphi-Quellcode:
TBlobField(tbBilder.FieldByName('Bild')).LoadFromFile('test.bmp');
Der Datei-Header steht da schon drin, nur nicht das, was Krüppel-ACCESS drumrum baut.

uwe12 24. Apr 2009 15:31

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;

joachimd 24. Apr 2009 15:53

Re: DBImage - Bitmap ist ungültig
 
Zitat:

Zitat von uwe12
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".

Es ist immer eins mehr oder weniger als man denkt [tm]!
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?

uwe12 24. Apr 2009 19:28

Re: DBImage - Bitmap ist ungültig
 
ne, das ist schon ein Bitmap.

uwe12 25. Apr 2009 15:50

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.

maron 27. Apr 2009 10:59

Re: DBImage - Bitmap ist ungültig
 
Das ist aber komisch o.O
Mich tät aber auch mal interessieren, wie das funktioniert.

joachimd 27. Apr 2009 11:04

Re: DBImage - Bitmap ist ungültig
 
Zitat:

Zitat von uwe12
Ich habe jetzt die Position gefunden, aber irgendwie wird der bereich nicht weggeschnitten. Es bleibt die Datei unverändert.

Du hast oben mal sowas geposted:
Delphi-Quellcode:
    ms.Position:=0;
    bmp:=TBitmap.Create;
    ms.SaveToFile('temp.bmp');
    try
      bmp.LoadFromStream(ms);
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.

maron 27. Apr 2009 16:11

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...

uwe12 28. Apr 2009 08:21

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.

maron 28. Apr 2009 10:24

Re: DBImage - Bitmap ist ungültig
 
ich kriegs net hin :wall:

hoika 28. Apr 2009 10:32

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.

Bitmaps in Access

Da kann man sich das schön erklären lassen
und die Lösung wäre dann ab Seite 4.


Heiko

uwe12 28. Apr 2009 11:13

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.

hoika 28. Apr 2009 11:19

Re: DBImage - Bitmap ist ungültig
 
Hallo,

kompilier mal ohne Packages.

Entscheidend ist doch aber der Code auf der Seite.


Heiko

uwe12 28. Apr 2009 11:25

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);

hoika 28. Apr 2009 11:32

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

uwe12 28. Apr 2009 12:00

Re: DBImage - Bitmap ist ungültig
 
ich habe aber doch das AdoTable in AdoTable1 umbenannt. Das heißt jetzt nicht mehr AdoTable1Picture sondern AdoTable1.

hoika 28. Apr 2009 13:48

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

uwe12 28. Apr 2009 15:51

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);

hoika 28. Apr 2009 16:25

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

uwe12 28. Apr 2009 16:41

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.

maron 28. Apr 2009 18:10

Re: DBImage - Bitmap ist ungültig
 
Dafür solltest du vielleicht lieber einen neuen Thread aufmachen ;)

uwe12 28. Apr 2009 19:13

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