Discussion:
BLOB-Feld und JPEG-Bild
(zu alt für eine Antwort)
Josef Koller
2005-04-06 16:15:42 UTC
Permalink
Hallo,

ich komme einfach nicht recht weiter.Ich habe jetzt mit verschiedenen
Komponenten (IBO, ZEOS) versucht ein JPEG-bild in eine Firebird Datenbank
einzufügen.

Das Datenbankfeld ist folgendermassen definiert:

CREATE DOMAIN LOGO AS BLOB SUB_TYPE 0 SEGMENT SIZE 20480

Wenn ich mit folgendem code ein bmp-file einfüge klappt alles bestens.

procedure TForm1.Button3Click(Sender: TObject);
var bildstream:TMemoryStream;
Nummer:integer;
//bild:tjpegimage;
bild:tbitmap;
begin
if openpicturedialog1.execute then begin
//bild:=Tjpegimage.create;
bild:=tbitmap.Create;
bild.LoadFromFile(openpicturedialog1.FileName);
Nummer:=ztable4fir_schluessel.value;
end;
try begin
bildstream:=TMemoryStream.Create;
bild.SaveToStream(bildstream);
zquery1.SQL.Text:='Update T_Firma set LOGO = :ThePicture where
Fir_Schluessel = :Nummer ';
zquery1.Params.Clear;
zquery1.Params.CreateParam(ftblob,'ThePicture',ptinput);
zquery1.ParamByName('ThePicture').loadfromstream(bildstream, ftblob);
zquery1.Params.CreateParam(ftinteger,'Nummer',ptinput);
zquery1.ParamByName('Nummer').asinteger:=Nummer;
zquery1.ExecSQL;
ztable4.Refresh;
end;
finally
bildstream.free;
end;
end;

Wenn ich statt TBitmap für die Variable bild TJPEGImage nehme, bekomme ich
eine Fehlermeldung 'Bitmap ist ungültig'.

Könnt Ihr mir sagen, wie das Einfügen in Firebird und das Anzeigen des
JPEG-Bildes in einem DBImage richtig gemacht wird?
Dirk Stein
2005-04-06 17:34:37 UTC
Permalink
Post by Josef Koller
Hallo,
ich komme einfach nicht recht weiter.Ich habe jetzt mit verschiedenen
Komponenten (IBO, ZEOS) versucht ein JPEG-bild in eine Firebird
Datenbank einzufügen.
CREATE DOMAIN LOGO AS BLOB SUB_TYPE 0 SEGMENT SIZE 20480
So mach ich es......

procedure BlobBild(sMake: string; tData: TDataSet; tFeld: TBlobField;
tBild: TImage);
var
memStream: TMemoryStream;
jpg: TJPEGImage;

begin
{$IFDEF DEBUG}Debugger.EnterProc('BlobBild');
{$ENDIF}
//
try
jpg := TJPEGImage.Create;
memStream := TMemoryStream.Create;

if UpperCase(sMake) = 'SAVE' then
begin //speichere ins Blob
{$IFDEF DEBUG}Debugger.LogMsg('BlobBild... SAVE');
{$ENDIF}

if tBild.Picture.Graphic <> nil then
begin
jpg.assign(tBild.Picture.Graphic);
jpg.SaveToStream(memStream);
memStream.Position := 0;
tFeld.LoadFromStream(memStream);
end;
end;

if UpperCase(sMake) = 'LOAD' then
begin //lade aus dem Blob
{$IFDEF DEBUG}Debugger.LogMsg('BlobBild... LOAD');
{$ENDIF}
if Tfeld.BlobSize > 0 then
begin
tFeld.SaveToStream(memStream);
memStream.Position := 0;
jpg.LoadFromStream(memStream);
tBild.Picture.assign(jpg);
end
else
tBild.Picture := nil;
end;
finally
memStream.Free;
jpg.free;
end;

{$IFDEF DEBUG}Debugger.LeaveProc('BlobBild');
{$ENDIF}
end;


Sample:

BlobBild('SAVE', nil, ibdwptestBildBLOB, frmBlobtest.Image1);
BlobBild('load', nil, ibdwptestBildBLOB, frmBlobtest.Image1);
--
--
mfg
Dirk Stein

Schon eingetragen? http://www.delphiuser.de.vu
- Lang ist der Weg durch Lehren, kurz und wirksam durch Beispiele.
(Seneca, röm. Dichter u. Phil., 4 v. Chr. - 65 n.Chr.) -
Josef Koller
2005-04-06 18:55:23 UTC
Permalink
Hallo,

vielen Dank für Deine Prozedur. Hab's natürlich gleich ausprobiert.
Und ... der gleiche Effekt, bzw. die gleiche Fehlermeldung: 'Bitmap
ungültig'.
Wenn ich in Deiner Prozedur die Zuweisung von TJPEG in TBitmap ändere,
werden Bitmaps geladen. Sie funktioniert also.

Aber warum bekomme ich kein jpg-Bild rein. Es ist zum Verzweifeln. alle
Beispiele
z. B. die ZEOS Demos oder die Beispiele auf der CD zum Buch
"Datenbankprogrammierung mit InterBase" nehmen immer TBitmap. Ich finde
einfach nichts, damit ich diese blöden JPG's reinbekomme.

Das Dumme ist, das ich z. B. in ein Image JPG's laden kann.An der JPEG.dcu
kann's also auch nicht liegen.

Bleibt eigentlich nur die Deklaration in der Firebird Datenbank. Aber die
dürfte ja auch stimmen.
(CREATE DOMAIN LOGO AS BLOB SUB_TYPE 0 SEGMENT SIZE 20480)

Viele Grüße

Josef
Florian Hector
2005-04-06 19:22:00 UTC
Permalink
Post by Josef Koller
Bleibt eigentlich nur die Deklaration in der Firebird Datenbank. Aber die
dürfte ja auch stimmen.
(CREATE DOMAIN LOGO AS BLOB SUB_TYPE 0 SEGMENT SIZE 20480)
Meine Blobdomain sieht so aus:
CREATE DOMAIN TPICTURE AS
BLOB SUB_TYPE 0 SEGMENT SIZE 80

Versuchs mal damit und wenn das auch nichts bringt, ganz ohne Segment Size.

Florian
Josef Koller
2005-04-06 20:03:23 UTC
Permalink
Hallo,
Post by Florian Hector
CREATE DOMAIN TPICTURE AS
BLOB SUB_TYPE 0 SEGMENT SIZE 80
Versuchs mal damit und wenn das auch nichts bringt, ganz ohne Segment Size.
es hilft alles nichts. Ich hab auch unterschiedliche Char Set einstellungen
probiert:
ASCII, ISO8859_1,BIG_5, es hilft nichts.

Der Compiler steht nach der Fehlermeldung in der ZStreamBlob (ZEOS)
.....................

constructor TZBlobStream.Create(Field: TBlobField; Blob: IZBlob; Mode:
TBlobStreamMode);
var
TempStream: TStream;
begin
inherited Create;

FBlob := Blob;
FMode := Mode;
FField := Field;
if (Mode in [bmRead, bmReadWrite]) and not Blob.IsEmpty then
begin
TempStream := Blob.GetStream;
try
TempStream.Position := 0;
CopyFrom(TempStream, TempStream.Size);
Position := 0;
finally
TempStream.Free;
end;
end;
end;

type THackedDataset = class(TDataset);

{**
Destroys this object and cleanups the memory.
}
destructor TZBlobStream.Destroy;
begin
if Mode in [bmWrite, bmReadWrite] then
begin
Blob.SetStream(Self);
try
if Assigned(FField.Dataset) then
THackedDataset(FField.DataSet).DataEvent(deFieldChange,
LongInt(FField));
except
{$IFNDEF VER130BELOW}
ApplicationHandleException(Self);
{$ENDIF}
end;
end;
inherited Destroy;
end;

auf dieser Zeile

THackedDataset(FField.DataSet).DataEvent(deFieldChange, LongInt(FField));

Gibt es verschieden jpg-formate? Ich mach meine Bilder mit Corel. Aber daran
dürfte es ja auch nicht liegen.

Vielleicht gibt es sonst noch irgendwas, was ich übersehe?

Vielen Dank

Josef
Josef Koller
2005-04-06 21:02:42 UTC
Permalink
Hallo,

ich habe folgende Lösung gefunden:
...
bild:tjpegimage;
bild1:tbitmap;
begin
if openpicturedialog1.execute then begin
bild:=tjpegimage.create;
bild1:=tbitmap.Create;
bild.LoadFromFile(openpicturedialog1.FileName);
bild1.Assign(bild);

Das Umwandeln des Bildes bild1.assign(bild) ist zwar nicht das Gelbe vom Ei.
Es funktioniert aber. Der Datenbank ist es egal. Die Größe ändert sich
dadurch nicht.

Wenn trotzdem noch jemand was Eleganteres hat, .. naj her damit.

Vielen Dank

Josef

Loading...