Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi JPG Resize bei großen Dateien (https://www.delphipraxis.net/175838-jpg-resize-bei-grossen-dateien.html)

OlliWW 23. Jul 2013 11:00

JPG Resize bei großen Dateien
 
Hallo Zusammen,

Ich habe eine kleine Routine zum Verkleinern von JPG-Bildern. Bei vielen Bildern funktioniert es auch wunderbar, bei einigen nicht.
Was die Bilder gemeinsam haben, bei denen es nicht funktioniert, ist, dass sie sehr groß sind (> 2 MB).
Hier mal der Code:
Delphi-Quellcode:
  procedure prcResizeJPG(sPath: String; iWidth: Integer; iHeight: Integer);
  var
    imgBMP: TBitmap;
    imgJPG: TJpegImage;
  begin
    imgJPG := TJpegImage.Create;
    try
      imgJPG.LoadFromFile(sPath);
      imgBMP := TBitmap.Create;
      try
        imgBMP.Width := iWidth;
        imgBMP.Height:= iHeight;
        imgBMP.Canvas.StretchDraw(imgBMP.Canvas.Cliprect, imgJPG);
        Self.Canvas.Draw(100, 10, imgBMP);
        imgJPG.Assign(imgBMP);
        imgJPG.SaveToFile(sPath);
      finally
        imgBMP.free;
      end;
    finally
      imgJPG.free;
    end;
  end;
Probiere ich diesen Code, stürzt es bei StrechDraw ab. Gibt es eine Möglichkeit, dies zu verbessern?

Mavarik 23. Jul 2013 16:03

AW: JPG Resize bei großen Dateien
 
Zitat:

Zitat von OlliWW (Beitrag 1222360)
Hallo Zusammen,

Ich habe eine kleine Routine zum Verkleinern von JPG-Bildern. Bei vielen Bildern funktioniert es auch wunderbar, bei einigen nicht.
Was die Bilder gemeinsam haben, bei denen es nicht funktioniert, ist, dass sie sehr groß sind (> 2 MB).
Hier mal der Code:
Delphi-Quellcode:
  procedure prcResizeJPG(sPath: String; iWidth: Integer; iHeight: Integer);
  var
    imgBMP: TBitmap;
    imgJPG: TJpegImage;
  begin
    imgJPG := TJpegImage.Create;
    try
      imgJPG.LoadFromFile(sPath);
      imgBMP := TBitmap.Create;
      try
        imgBMP.Width := iWidth;
        imgBMP.Height:= iHeight;
        imgBMP.Canvas.StretchDraw(imgBMP.Canvas.Cliprect, imgJPG);
        Self.Canvas.Draw(100, 10, imgBMP);
        imgJPG.Assign(imgBMP);
        imgJPG.SaveToFile(sPath);
      finally
        imgBMP.free;
      end;
    finally
      imgJPG.free;
    end;
  end;
Probiere ich diesen Code, stürzt es bei StrechDraw ab. Gibt es eine Möglichkeit, dies zu verbessern?

Sicher, dass es an der Größe liegt und nicht am jpg File?

Delphi-Quellcode:
        imgJPG.Assign(imgBMP);
        imgJPG.Compress; // <-- fehlt das nicht? 
        imgJPG.SaveToFile(sPath);
Mavarik

Capstone 24. Jul 2013 05:32

AW: JPG Resize bei großen Dateien
 
also hier mit Delphi 3 funktioniert der o.g. Code.

Code:
imgJPG.Compress; // <-- fehlt das nicht?
jetzt wo Du's sagst ... vermiß ich das auch ....
funzt aber bei mir trotzdem ohne.

wobei ich mich irgendwie erinnere, daß da noch weitere Einstellungen zu fehlen: Irgendwie, welcher Sampling modus Progress;, Qualität: Quality:= 90;, etc.

keine Ahnung, vielleicht haben die ja was (d3->x4) bei Embargochaero "verbessert" , was Borland damals nicht konnte :D


lad mal ein Bild rauf, was nicht funktioniert.
Hab das hier sogar mit nem 5,88 MB 10 MPx Bild gemacht.
Und sogar mit ungeraden Abmessungen PcrResize(Edit1.text,300,161);

das funktioniert.


hier mal ein nicht-privates:

3 MB Bild
3648 x 2736 Pixel (9.98 MPixels) (4:3)
-http://abload.de/img/claudia_giorgetti_1mwaav.jpg

Kleiner: 201 x 201 Pixel (1.00)
http://abload.de/img/claudia_giorgetti_1_ke0l3e.jpg

OlliWW 24. Jul 2013 08:13

AW: JPG Resize bei großen Dateien
 
Hallo,

Das compress fehlt in der Tat. Aber wie gesagt, es stürzt beim StrechDraw ab.

Anbei ein Beispielbild, das abstürzt.

DeddyH 24. Jul 2013 08:36

AW: JPG Resize bei großen Dateien
 
Ich habe gerade mal mein StretchGraphic darauf losgelassen, funktioniert.

OlliWW 24. Jul 2013 09:50

AW: JPG Resize bei großen Dateien
 
Naja die Methode wäre natürlich ein Workarround, erklärt aber nicht warum meine Funktion nicht manchen Bildern nicht funktioniert.

Ich habe auf der Form ebenfalls noch ein Vorschau-TImage liegen, das bei Bedarf das Bild anzeigen kann, auch das stürzt ab, in meinem Code ist es:
Delphi-Quellcode:
imgVorschau.Picture.LoadFromFile(lstData.Items[Row].rec_PATH);
Anhand des Eurekalog-Debuggers, seh ich dass danach noch ein paar Sachen in der Unit "jpeg" geschehen.

Capstone 24. Jul 2013 22:06

AW: JPG Resize bei großen Dateien
 
öh, Tatsache -
bei mir hat es mit dem von Dir hochgeladenen Bild auch nicht funktioniert.

Dann aber habe ich mir das Bild genau angeschaut.
An der Megapixelzahl kann es nicht liegen;
an der Dateigröße kann es auch nicht liegen - äh, aber HALT - etwas fett is die scho, gell ?
auf 98% komprimiert.

und dann hab ich mir die mal genau angeschaut.
Aber nicht mit Windows Imageviewer, sondern im Detail.
und siehe da ...
gespeichert mit Photoshop 7.0
und das schon ... 2003 - (wat ne alte Kamelle ... :oops: )

aber daran liegt's nicht ....

sondern ...
Code:
Filename - 82039999-Bild.jpg
Orientation - Top left
XResolution - 304
YResolution - 304
ResolutionUnit - Inch
Software - Adobe Photoshop 7.0
DateTime - 2003:05:13 08:58:57
ExifOffset - 156
ColorSpace - Uncalibrated/Unknown (-1)
ExifImageWidth - 1944
ExifImageHeight - 1944

Thumbnail: - 
Compression - 6 (JPG)
XResolution - 72
YResolution - 72
ResolutionUnit - Inch
JpegIFOffset - 294
JpegIFByteCount - 6227
und dann ist mir noch aufgefallen: JPEG, CMYK, quality: 98, subsampling OFF

mitunter könnte es daran liegen, daß es Farbinformationen im CMYK Format und nicht RGB format hat.
Vermutlich wird dies von der JPEG-Decompression-Unit nicht beachtet, da es kein Standard im eigentlichen Sinne ist.

kannste nur mit try imageload .. except abfangen.

evtl. solche CMYK-JPEGS besser vorher mit nem andern Programm [xnview, etc.] konvertieren oder nochmal abspeichern. Ist zwar Qualitätsverlust, aber funzt dann wenigstens.

Diese im CMYK gespeicherten JPEG Dateien werden eigentlich nur im Druckbereich benötigt.
Falls Dein Programm kommerziell orientiert ist, solltest Du vielleicht besser eine Bilder-import-Komponente kaufen, falls es eine gibt. Damit Deine Kunden keine böse Überraschung erleben.

Aber: Wieso funktioniert das bei mir auch anscheinend ohne .Compress?
(-> bei den andern Bildern)

roga 25. Jul 2013 04:50

AW: JPG Resize bei großen Dateien
 
Für CMYK gab es doch ein Update der JPEG-Komponente. Also einfach mal Google fragen...

OlliWW 25. Jul 2013 08:06

AW: JPG Resize bei großen Dateien
 
Zitat:

Zitat von roga (Beitrag 1222585)
Für CMYK gab es doch ein Update der JPEG-Komponente. Also einfach mal Google fragen...

Great! Works perfect.

Vielen Dank an alle die geholfen haben. Ich habe nun die erweiterte JPEG Unit genommen, damit funktioniert es einwandfrei.

roga 25. Jul 2013 16:08

AW: JPG Resize bei großen Dateien
 
...zu erwähnen wäre vielleicht noch, dass bei den neueren Delphi-Versionen das CMYK-Modell (JPEG) unterstützt wird. Mit Delphi 2007 gab es hier noch Probleme, bei XE2 läuft's.

Vielleicht wäre es für andere nützlich, wenn Du deinen Lösungsweg hier posten würdest.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:51 Uhr.
Seite 1 von 2  1 2      

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