AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Array of TJepeg in Blob schreiben und lesen
Thema durchsuchen
Ansicht
Themen-Optionen

Array of TJepeg in Blob schreiben und lesen

Ein Thema von Smiley · begonnen am 15. Dez 2020 · letzter Beitrag vom 16. Dez 2020
 
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#1

Array of TJepeg in Blob schreiben und lesen

  Alt 15. Dez 2020, 20:25
Ich möchte meine alte Datenbanklösung zur speicherung von Bildern erneuern und auf den neuesten Stand bringen.
Bisher habe ich die Bilder auf die Platte geschrieben und von dort dann in ein Blob-Feld geschrieben (LoadFromFile).
Das ist natürlich recht langsam.
Meine Bildfolgen (Video) habe ich in eine Zip-Datei gepackt und dann in das Blob-Feld geschrieben.
Funktioniert zwar, ist aber langsam.
Die Datenbank ist eine AbsoluteDatabase, soll eventuell auf Firebird umgestellt werden.

Nun will ich das ganze mal neu aufbauen und mit Streams im Speicher arbeiten.
Mit einzelnen Bildern habe ich das bisher auch gut hinbekommen.
Hier ein Beispiel:
Code:
// **************************************************************************
// *    Bild oder Bildfolge aus Datenbank lesen und in Image schreiben     *
// **************************************************************************
procedure TDM.BildAnzeigen(ID: Integer);
  var
    BlobStream: TStream;
    PicJpg: TJPEGImage;
    JpegArray :Array[0..39] of TJpegImage;
  begin
    qData.SQL.Text                   := 'Select * From Bilder Where ID = :ID';
    qData.ParamByName('ID').AsInteger := ID;
    qData.Open;

    // Bild einlesen und in Image schreiben
    if (AktData.Typ = 'B') then
      begin
        try
          PicJpg    := TJPEGImage.Create;

          // Bild aus Datenbank lesen und in Stream schreiben
          BlobStream         := qData.CreateBlobStream(qData.FieldByName('PicData'), bmRead);
          BlobStream.Position := 0;

          // JPEG lesen und der ImageBox zuweisen
          PicJpg.LoadFromStream(BlobStream);
          frmMain.img.Picture.Assign(PicJpg);

          frmMain.lblBGroese.Caption  := 'Größe: ' + frmMain.img.Picture.Width.ToString + 'x' + frmMain.img.Picture.Height.ToString;
          frmMain.lblQualitaet.Caption := 'Aufnahme Qualität: ' + Config.Kompression.ToString;
        finally
          BlobStream.Free;
          PicJpg.Free;
        end;
        uSubs.StatusBarChange(1);
      end;

    // Video einlesen und in Image schreiben
    if (AktData.Typ = 'V') then
      begin
        try

          // Bild aus Datenbank lesen und in Stream schreiben
          BlobStream         := qData.CreateBlobStream(qData.FieldByName('PicData'), bmRead);
          BlobStream.Position := 0;

          // JPEGArray lesen und der ImageBox zuweisen
          JpegArray[0].LoadFromStream(BlobStream);
          frmMain.img.Picture.Assign(JpegArray[0]); // Hier Fehler

          frmMain.lblBGroese.Caption  := 'Größe: ' + frmMain.img.Picture.Width.ToString + 'x' + frmMain.img.Picture.Height.ToString;
          frmMain.lblQualitaet.Caption := 'Aufnahme Qualität: ' + Config.Kompression.ToString;
        finally
          BlobStream.Free;
          PicJpg.Free;
        end;
        uSubs.StatusBarChange(1);
      end;

    qData.Close;
  end;
Falls jemand dazu Verbesserungsvorschläge hat bitte melden, habe erst seit kurzem mit Streams angefangen.

Meine alte Datenbank möchte ich gerne umstellen und die Zip-Dateien mit den Jpeg-Bildern darin in ein Array of TJpegImage speichern und dann das Array komplett in den Blob speichern und später wieder lesen als Array.
Ist das machbar ? und wie ist die Syntax, wäre froh über ein Beispiel.

Wie mache ich das am Besten mit den Zip-Dateien aus der alten DB.
Ich nehme an in einen MemoryStream lesen und dann mit der Zip-Lib irgendwie auspacken und dann die einzelnen Bilder in ein Array of TJpegImage speichern.
Ein Beispiel dazu wäre schön.

Eine weitere Frage ist wie es mit der Größe von Arrays aussieht, im Speicher und im Blob.
Kann ich z.B. ein Array [0..120] of TJpegImage anlegen und dann nur 40 Einträge beschreiben, werden dann nur die Bytes der 40 Bilder als Speicherbedarf wirksam oder wird der Speicher für alle Bilder gleich angelegt ? (vom kleinen Overhead des Arrays mal abgesehen)

Bin für jede Hilfe dankbar
  Mit Zitat antworten Zitat
 

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:15 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