Einzelnen Beitrag anzeigen

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, 21: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