AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

JPEG Image in Stream schreiben

Ein Thema von Zodi · begonnen am 1. Jul 2018 · letzter Beitrag vom 2. Jul 2018
Antwort Antwort
Seite 2 von 2     12   
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.054 Beiträge
 
Delphi 2009 Professional
 
#11

AW: JPEG Image in Stream schreiben

  Alt 1. Jul 2018, 21:59
"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.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#12

AW: JPEG Image in Stream schreiben

  Alt 2. Jul 2018, 00:21
Könntet ihr mal bitte diese ständigen subtilen Anfeindungen beenden Und sachlich bleiben?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: JPEG Image in Stream schreiben

  Alt 2. Jul 2018, 03:29
Nach ein paar selbst-Tests finde ich die Wahl des TE mit JPEG zu arbeiten mehr als Vernünftig.
Hier eine kleine Test-Tabelle screenshot-02_07-002.jpg
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 screenshot-02_07.jpg
Links ist 100% Qualität, Rechts 100% Kompression.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#14

AW: JPEG Image in Stream schreiben

  Alt 2. Jul 2018, 07:19
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#15

AW: JPEG Image in Stream schreiben

  Alt 2. Jul 2018, 09:58
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#16

AW: JPEG Image in Stream schreiben

  Alt 2. Jul 2018, 10:14
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
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: JPEG Image in Stream schreiben

  Alt 2. Jul 2018, 11:20
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;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von Zodi
Zodi

Registriert seit: 19. Jul 2017
Ort: Berlin
47 Beiträge
 
Delphi XE7 Ultimate
 
#18

AW: JPEG Image in Stream schreiben

  Alt 2. Jul 2018, 22:00
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
Pascal
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: JPEG Image in Stream schreiben

  Alt 2. Jul 2018, 22:19
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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:31 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