Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Picture aus DBImage in Stream um Größe festzustellen (https://www.delphipraxis.net/34781-picture-aus-dbimage-stream-um-groesse-festzustellen.html)

AndreT 28. Nov 2004 12:31


Picture aus DBImage in Stream um Größe festzustellen
 
Ich möchte mit einem ähnlichen Code wie diesen die Größe eines bmp´s bestimmen.

Code:
procedure TForm1.Button1Click(Sender: TObject);
var fileheader : TBitmapfileheader;
   
    s         : TFilestream;
begin
   if openpicturedialog1.Execute then begin
      s := TFilestream.Create(openpicturedialog1.FileName,fmOpenRead or fmShareDenyNone);
      s.Read(fileheader,sizeof(fileheader));
      s.free;
      listbox1.Items.Clear;
      listbox1.items.add('Dateigröße:  ' + inttostr(fileheader.bfSize));
   end;
end;
ich möchte allerings nicht wie in dem Code eine OpenDiaolog verwenden, sondern das aktuelle Bild einen DBIMages.
Anschließend möchte ich die Größe in eine Datenbank schreiben.

wenn ich aber "s:= TFilestream.create(dbimage.picture.bitmap)" versuche bekomme ich einen Fehler.

Was hab ich noch für Möglicheiten?


Nachher möchte ich mit "DataModule1.ADOTable.FieldValues['Groesse']:=IntToStr(fileheader.bfSIze)" in die Datenbank schreiben.
Das dürfte kein Problem darstellen.

Aber wie bekomme ich das Bild erstmal in den den Stream?

Danke

Moyyer 29. Nov 2004 15:33

Re: Picture aus DBImage in Stream um Größe festzustellen
 
Du könntest das Bild deines Dbimages erstmal speichern und es dann neu laden, wie z.B.

Code:
procedure TMusik.Button2Click(Sender: TObject);
var fileheader : TBitmapfileheader;
    s         : TFilestream;
begin
      dbimage1.Picture.SaveToFile('c:\xxx.bmp');
      s := TFilestream.Create('c:\xxx.bmp',fmOpenRead or fmShareDenyNone);
      s.Read(fileheader,sizeof(fileheader));
      s.free;
      listbox1.Items.Clear;
      listbox1.items.add('Dateigröße:  ' + inttostr(fileheader.bfSize));
end;

Ist nicht die perfekte Lösung, aber sie funktioniert.

MfG Moyyer

dizzy 29. Nov 2004 15:38

Re: Picture aus DBImage in Stream um Größe festzustellen
 
Was spricht gegen TDBImage.Picture.Bitmap.Width bzw. .Height?
(Ist heute großes F1-Tastensterben angesagt? :gruebel: :zwinker:)

kiar 29. Nov 2004 16:54

Re: Picture aus DBImage in Stream um Größe festzustellen
 
dizzy,

was spricht gegen richtig lesen?

raik

dizzy 29. Nov 2004 17:14

Re: Picture aus DBImage in Stream um Größe festzustellen
 
Ich habe das hier als Frage angesehen:
Zitat:

Zitat von AndreT
Ich möchte mit einem ähnlichen Code wie diesen die Größe eines bmp´s bestimmen.

Und das hier garnicht mehr gesehen...
Zitat:

Zitat von AndreT
Aber wie bekomme ich das Bild erstmal in den den Stream?

Jedoch: Er braucht das Bild selbst doch garnicht in der Datenbank - er will doch nur die Größe haben! Und das aus dem BMP-Header auszulesen ist doch etwas umständlich, oder?


Was ich aber nicht bedacht habe: AndreT möchte nicht die Größe des Bildes, sondern wohl die Bytes die es belegt! Dazu musst du erstmal nachschauen von welchem Typ dein Bitmap ist: "TBitmap.PixelFormat". In den meisten Fällen wird es wohl ein pf24Bit, bzw. pf32Bit sein. Also ist die Größe in Bytes (Width*Height*3), bzw. (Width*Height*4).

Das Bild erst auf Platte zwischenspeichern um dann den Header auszulesen ist, finde ich, etwas "unschön" ;). (Zumal sich die benötigte Information ja auch anders beschaffen lässt.)

Gruss,
Fabian

AndreT 30. Nov 2004 06:01

Re: Picture aus DBImage in Stream um Größe festzustellen
 
Danke für Eure Hilfe - Versuche.

Hab inzwischen einen ähnlichen Lösungsweg gewählt, wie Moyyer ihn vorgeschlagen hat.

Eine andere Lösung habe ich auch nicht gefunden. Ist eine Unschöne Lösung, aber funktioniert.

Sorry, das meine Formulierung in der Fragestellung für manche die Größe als BxH erkennen lies. Ich meinte aber wirklich schon den belegten Speicherplatz.

Danke

jim_raynor 30. Nov 2004 06:44

Re: Picture aus DBImage in Stream um Größe festzustellen
 
Du kannst das Bild auch in einen MemoryStream speichern und dann dessen Größe auslesen.

Delphi-Quellcode:
var
  Mem: TMemoryStream;
begin
  Mem:=TmemoryStream.Create;
  dbimage1.Picture.SaveToStream(Mem);
  Mem.Position:=0;
  Mem.Read(...);
  Mem.Free;
end;
Hat den Vorteil, dass du wirklich die Größe bekommst, auch wenn das Bild zum Beispiel komprimiert ist, und sparst dir die Speicherung auf der Platte.

Orbmu2k 30. Nov 2004 07:35

Re: Picture aus DBImage in Stream um Größe festzustellen
 
ungetestet, sollte dir aber die grösse zurückgeben ...

Delphi-Quellcode:
   DataModule1.ADOTable.CreateBlobStream(DataModule1.ADOTable.FieldByName('Bild'),bmRead).Size

AndreT 30. Nov 2004 16:02

Re: Picture aus DBImage in Stream um Größe festzustellen
 
Danke,

der letzte einzeiler hat geholfen :bounce1:

es muss dazu nur auf jeden fall die uses db hinzugefügt werden.

jim_raynor 30. Nov 2004 16:51

Re: Picture aus DBImage in Stream um Größe festzustellen
 
Zitat:

Zitat von Orbmu2k
ungetestet, sollte dir aber die grösse zurückgeben ...

Delphi-Quellcode:
   DataModule1.ADOTable.CreateBlobStream(DataModule1.ADOTable.FieldByName('Bild'),bmRead).Size

Bin mir nicht sicher, aber hinterlässt das nicht ein hässliches Speicherleck, weil der erstellte Stream doch nicht freigegeben wird :roll:
Wenn dann wird ich es so machen:

Delphi-Quellcode:
with DataModule1.ADOTable.CreateBlobStream(DataModule1.ADOTable.FieldByName('Bild'),bmRead) do
begin
  MySize:=Size;
  Free;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz