![]() |
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. |
AW: JPEG Image in Stream schreiben
Könntet ihr mal bitte diese ständigen subtilen Anfeindungen beenden Und sachlich bleiben? :roll:
|
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. |
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.
|
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. |
AW: JPEG Image in Stream schreiben
Zitat:
Vielleicht kann er sich trotzdem mal mit beschäftigen wenn er mal nichts zu tun hat. gruss |
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; |
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:
Gibts da nicht auch nen ansatz für jpeg oder PNG
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; |
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 02:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz