Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   JPEG Image in Stream schreiben (https://www.delphipraxis.net/196930-jpeg-image-stream-schreiben.html)

Redeemer 1. Jul 2018 20:59

AW: JPEG Image in Stream schreiben
 
"Kinners" ist eine ganz typische Phrase von mir, wenn viele Leute etwas nicht Zielführendes machen. Sie bewertet nicht die Leute, sondern ihre Aktionen.
Aber gut, getroffene Hunde bellen.

Luckie 1. Jul 2018 23:21

AW: JPEG Image in Stream schreiben
 
Könntet ihr mal bitte diese ständigen subtilen Anfeindungen beenden Und sachlich bleiben? :roll:

KodeZwerg 2. Jul 2018 02:29

AW: JPEG Image in Stream schreiben
 
Liste der Anhänge anzeigen (Anzahl: 2)
Nach ein paar selbst-Tests finde ich die Wahl des TE mit JPEG zu arbeiten mehr als Vernünftig.
Hier eine kleine Test-Tabelle Anhang 49438
Legende:
High = höchste Bildqualität / niedrigste Kompression
Mid = mittlere Bildqualität / mittlere Kompression
Low = niedrigste Bildqualität / höchste Kompression
bei Zip habe ich noch ein paar non-Standards getestet, PPMd hat mich mehr als überrascht, dafür das der enorm schnell ist.
Von Rar war ich ein wenig Enttäuscht, man merkt es seinem Alter an :-]
In den Archiven ist die Bmp-Datei, die war auch jeweils Vorlage für die Graphic-Formate.

Und noch das für JPEG, damit man weiß was bei 100% passiert. Vorher -> Nachher Anhang 49439
Links ist 100% Qualität, Rechts 100% Kompression.

DeddyH 2. Jul 2018 06:19

AW: JPEG Image in Stream schreiben
 
Das ist doch gar nicht das Problem, sondern wie schon erwähnt, dass der TStream aus der Kompressionsunit nicht mit dem TStream aus der Classes-Unit kompatibel ist, welchen die Methoden wie SaveToStream erwarten.

Neutral General 2. Jul 2018 08:58

AW: JPEG Image in Stream schreiben
 
Jo, die Lösung ist die Compression-Unit rauszuschmeißen, da es eh wenig Sinn macht ein JPEG nochmal nachträglich zu komprimieren.
Zweitens (wie schon jemand erwähnt hat) solltest du den Stream direkt versenden und ihn nicht vorher in einen String umwandeln (das kann nur schief gehn).
Und noch eine kleine Anmerkung (nur für den Fall dass es dir nicht klar ist): Du musst das JPEG nicht vorher mit SaveToFile speichern.
Falls das nur zu Debug-Zwecken da steht hab ich nichts gesagt, ansonsten kannst du das weglassen.

@EWeiss: Ich glaube keiner will dir hier dein Wissen und können bzgl. GDI/GDI+ absprechen, aber was man hier bedenken muss, ist dass der Threadersteller eindeutig ein Anfänger ist der (noch) nicht wirklich weiß was er tut und wie einige grundlegende Dinge funktionieren. Und in seiner Situation bin ich mir ziemlich sicher, dass ihn Windows API-Funktionen mit Handles, Pointern und drölf Parametern mehr verwirren als helfen.

EWeiss 2. Jul 2018 09:14

AW: JPEG Image in Stream schreiben
 
Zitat:

Und in seiner Situation bin ich mir ziemlich sicher, dass ihn Windows API-Funktionen mit Handles, Pointern und drölf Parametern mehr verwirren als helfen.
Ok.. Danke habe ich nicht bedacht.
Vielleicht kann er sich trotzdem mal mit beschäftigen wenn er mal nichts zu tun hat.

gruss

KodeZwerg 2. Jul 2018 10:20

AW: JPEG Image in Stream schreiben
 
Falls es hilft, so könnte es mit den Delphi eigenen Units realisiert werden.
Delphi-Quellcode:
uses
  ...
   jpeg, GIFImg, pngimage;

procedure TFrmPicStream.btnCreateJPEGClick(Sender: TObject);
var
  Img: TJPEGImage;
  ms: TMemoryStream;
begin
  ms := TMemoryStream.Create;
  Img := TJPEGImage.Create;
  Img.ProgressiveEncoding := True;
  Img.CompressionQuality := trckbrJPEGcomp.Position; // 0..100
  Img.Assign(imgSource.Picture.Bitmap);
  Img.Compress;
  imgDest.Picture.Bitmap.Assign(Img); // hier wird das Resultat dargestellt
  Img.SaveToStream(ms);
  lblStreamsize.Caption := IntToStr(ms.Size)+ ' (JPG) byte';
// mach was mit Stream
  ms.Free;
  Img.Free;
end;

procedure TFrmPicStream.btnCreatePNGClick(Sender: TObject);
var
  Img: TPngImage;
  ms: TMemoryStream;
begin
  ms := TMemoryStream.Create;
  Img := TPngImage.Create;
  Img.CompressionLevel := trckbrPNGComp.Position; // 0..9, bei 9 dauert es eine Ewigkeit mit den CodeGear Units
  Img.Assign(imgSource.Picture.Bitmap);
  imgDest.Picture.Bitmap.Assign(Img); // hier wird das Resultat dargestellt
  Img.SaveToStream(ms);
  lblStreamsize.Caption := IntToStr(ms.Size)+ ' (PNG) byte';
// mach was mit Stream
  ms.Free;
  Img.Free;
end;

procedure TFrmPicStream.btnCreateGIFClick(Sender: TObject);
var
  Img: TGIFImage;
  ms: TMemoryStream;
begin
  ms := TMemoryStream.Create;
  Img := TGIFImage.Create;
  Img.Assign(imgSource.Picture.Bitmap);
  Img.Pack;
  imgDest.Picture.Bitmap.Assign(Img); // hier wird das Resultat dargestellt
  Img.SaveToStream(ms);
  lblStreamsize.Caption := IntToStr(ms.Size)+ ' (GIF) byte';
// mach was mit Stream
  ms.Free;
  Img.Free;
end;

Zodi 2. Jul 2018 21:00

AW: JPEG Image in Stream schreiben
 
Mit dem BMP file funktioniert es mit meinere Compression unit.
Da ich es mit Stream.writeBuffer in den stream schreibe.

Delphi-Quellcode:
function SaveBitmapToFile(HBM: HBitmap;BitCount: word): string;
const
  BMType = $4D42;
type
  TBitmap = record
    bmType: Integer;
    bmWidth: Integer;
    bmHeight: Integer;
    bmWidthBytes: Integer;
    bmPlanes: Byte;
    bmBitsPixel: Byte;
    bmBits: Pointer;
  end;
var
  BM: TBitmap;
  BFH: TBitmapFileHeader;
  BIP: PBitmapInfo;
  DC: HDC;
  HMem: THandle;
  Buf: Pointer;
  ColorSize, DataSize: Longint;
  stream: tmemorystream;

  function AlignDouble(Size: Longint): Longint;
  begin
    Result := (Size + 31) div 32 * 4;
  end;

begin
  if GetObject(HBM, SizeOf(TBitmap), @BM) = 0 then Exit;



  //BitCount := 4;
  if (BitCount <> 24) then ColorSize := SizeOf(TRGBQuad) * (1 shl BitCount) else ColorSize := 0;

  DataSize := AlignDouble(bm.bmWidth * BitCount) * bm.bmHeight;
  GetMem(BIP, SizeOf(TBitmapInfoHeader) + ColorSize);

  if BIP <> nil then begin
    with BIP^.bmiHeader do begin
      biSize := SizeOf(TBitmapInfoHeader);
      biWidth := bm.bmWidth;
      biHeight := bm.bmHeight;
      biPlanes := 1;
      biBitCount := BitCount;
      biCompression := 0;
      biSizeImage := DataSize;
      biXPelsPerMeter := 0;
      biYPelsPerMeter := 0;
      biClrUsed := 0;
      biClrImportant := 0;
    end;

    with BFH do begin
      bfOffBits := SizeOf(BFH) + SizeOf(TBitmapInfo) + ColorSize;
      bfReserved1 := 0;
      bfReserved2 := 0;
      bfSize := longint(bfOffBits) + DataSize;
      bfType := BMType;
    end;

    HMem := GlobalAlloc(gmem_Fixed, DataSize);
    if HMem <> 0 then begin
      Buf := GlobalLock(HMem);
      DC := GetDC(0);
      if GetDIBits(DC, hbm, 0, bm.bmHeight,Buf, BIP^, dib_RGB_Colors) <> 0 then begin

        Stream := TMemoryStream.Create;
        Stream.WriteBuffer(BFH, SizeOf(BFH));
        Stream.WriteBuffer(PChar(BIP)^, SizeOf(TBitmapInfo) + ColorSize);
        Stream.WriteBuffer(Buf^, DataSize);
        SetString(Result, PChar(Stream.Memory), Stream.Size);
        stream.Free;

      end;
      ReleaseDC(0, DC);
      GlobalUnlock(HMem);
      GlobalFree(HMem);
    end;

  end;
  FreeMem(BIP, SizeOf(TBitmapInfoHeader) + ColorSize);
  DeleteObject(HBM);
end;
Gibts da nicht auch nen ansatz für jpeg oder PNG

KodeZwerg 2. Jul 2018 21:19

AW: JPEG Image in Stream schreiben
 
Wenn Du die Unit jpeg einbindest und nach meinem Beispiel vorgehst bist Du am Ziel, deswegen Frage ich mal was damit nicht stimmt?
BMP ist nunmal das einfachste Format zum Schreiben, das ist mit allen drum und dran in den Units supported.
JPEG hat seine eigenen Header und Format, dazu brauch man eine unit die das bereitstellt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:58 Uhr.
Seite 2 von 2     12   

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