Announcement

Collapse
No announcement yet.

Suche schlankes TDBImage

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Suche schlankes TDBImage

    Hallo,

    wenn ich Bilder in einer Datenbank speichere, die im JPG-Format
    vielleicht 300k haben dann werden die in der Datenbank immer
    im BMP-Format gespeichert und haben dann ca. 3 MB.

    Gibt es irgendwo Platzsparende Komponenten?
    (Auf der DSP habe ich nichts gefunden)

    Gruß Matthias

  • #2
    Hallo,

    Borland liefert mit Delphi die Unit <b>ZLib</b> aus, so dass man die Grafiken vor dem Ablegen in der Datenbank in eigener Regie komprimieren kann (wenn nicht gleich nur JPGs verwendet werden sollen). Sollen die Grafiken später angezeigt werden, macht man die Komprimierung rückgängig und stellt die BMP- oder die JPG-Grafik in einer TImage-Instanz dar. Der folgende Auszug soll das Prinzip verdeutlichen:
    <pre>
    procedure TFormGraphicViewer.OpenBLObAndShow(iAnhangID, iTyp: Integer);
    resourcestring
    cErrNullData = 'TBlobStream enthält keine Daten!';
    cMsg1 = '%d komprimierte Bytes zu %d Bytes expandiert.';
    var
    InFile : TStream;
    OutFile : TStream;
    ZStream : TCustomZLibStream;
    Count : Integer;
    aJPG : TJPegImage;
    begin
    with DMAnhang.IBQSelectBLOb do
    begin
    Params[0].Value := iAnhangID;
    Open;
    end;
    InFile := DMAnhang.IBQSelectBLOb.CreateBlobStream(
    DMAnhang.IBQSelectBLObDATEN, bmRead);
    // wurden Daten aus dem Blob-Feld gelesen ?
    if InFile.Size = 0 then
    begin
    InFile.Free;
    ShowMessage(cErrNullData);
    Exit;
    end;
    try
    OutFile := TMemoryStream.Create;
    try
    // komprimierte Blob-Daten entkomprimieren
    ZStream := TDecompressionStream.Create(InFile);
    try
    // in 4096-Byte Häppchen in die Datei schreiben
    while True do begin
    Count := ZStream.Read(ZLibBuffer, ZLibBufferSize);
    if Count <> 0
    then OutFile.WriteBuffer(ZLibBuffer,Count)
    else Break;
    end;
    finally
    // Free -> Buffer wird geleert
    ZStream.Free;
    // Ergebnis anzeigen
    OutFile.Position := 0;
    case iTyp of
    3 : ImageViewer.Picture.Bitmap.LoadFromStream(OutFile) ;
    4 : begin
    aJPG := TJPegImage.Create;
    try
    aJPG.LoadFromStream(OutFile);
    ImageViewer.Picture.Assign(aJPG);
    finally
    aJPG.Free;
    end
    end;
    end;
    end;
    finally
    OutFile.Free;
    end;
    finally
    InFile.Free;
    DMAnhang.IBQSelectBLOb.Close;
    end;
    end;
    </pre&gt

    Comment

    Working...
    X