JPEG, PNG, GIF - Resize

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: JPEG, PNG, GIF - Resize

Beitrag von Michl »

... nur so´n Gedanke:

Evtl. hilft es ja, wenn du im Hintergrund immer eine Datei wie z.B. die thumbs.db bei Windows erstellst (oder bei Win, falls vorhanden, diese nutzt) und bei der Miniaturansicht zuerst diese ausliest?! Somit könnte man einen schnellen Start ermöglichen, in der Zwischenzeit, während der User sich durch Thumbnails blättert, könnten ja die anderen Dateien in die Miniaturansicht geladen werden.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: JPEG, PNG, GIF - Resize

Beitrag von gocher »

Ich benötige die Thumbnails fürs Internet sonst hätte ich direkt Theo's Superlösung OPBitmap genutzt die würde sonst allemal reichen!
Da ich von meinen Tausenden Bildern keine Voransichten in den unterschiedlichsten Auflösungen auf meiner Platte haben möchte, generiere ich sie immer aus dem Original, im Moment mache ich alles noch mit GDIPlus unter Windows, wie schon erwähnt jedes Thumbnail ~100x75 8-16 ms und davon dann noch bis zu 8 gleichzeitig, da ist nur die Bandbreite meines bescheidenen Internetanschlusses ein Problem!
215 Requests, also ~200 Bilder und alles Andere drum herum in 5,3 Sekunden halte ich da noch für akzeptabel.
Ich speichere die Thumbs auch nie in eine Datei (dann spare ich mir die Zeit fürs speichern) sondern sende sie immer als Stream, das ist auch kein Problem mehr bei dem Beispiel braucht man dann nur das Speichern durch Folgende Zeile ersetzen!

Code: Alles auswählen

Writer.ImageWrite(MemoryStream, DestImage); 
Ich suche nun noch einen schnellen Weg um an die Voransichten aus den JPEGs (Exif) zu kommen, dann müsste das Problem mit den ~500 Thumbs :) in einer Galerie auch zu lösen sein. Dafür brauche ich allerdings eine ordentliche Exif-Routine.
Das Problem mit den GIFs ist nicht so tragisch, zumindest im Moment, denn ich habe keine GIFs die zur Laufzeit skaliert werden müssten, wäre halt nur schön damit es komplett wäre!

Wenn man PHP nutzt nimmt man sich adaptive-image und kümmert sich um nichts, dann werden die Voransichten zwischengespeichert (müllen einem die Platte voll) und da möchte ich nicht hin! Mal abgesehen davon das die php-Funktionen grotten lahm im Vergleich zu Free Pascal sind :) und es beim ersten generieren dann trotz dem sehr lange dauert!
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: JPEG, PNG, GIF - Resize

Beitrag von gocher »

Hallo zusammen,
also der erste Test ist gelungen, Zeit zum erzeugen nicht messbar :shock: zumindest nicht mit GetTickCount, na geht doch!
die Voransicht bei meiner Kamera 160x120
die Voransicht bei meiner Kamera 160x120
Tiger~original.jpg (10.16 KiB) 2313 mal betrachtet
aus interner Voransicht verkleinert -> 0 ms
aus interner Voransicht verkleinert -> 0 ms
Tiger~.jpg (4.61 KiB) 2313 mal betrachtet
Nun noch einen Weg finden der die hässlichen Balken entfernt!
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: JPEG, PNG, GIF - Resize

Beitrag von Christian »

W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: JPEG, PNG, GIF - Resize

Beitrag von gocher »

Christian hat geschrieben:https://github.com/cutec-chris/promet-erp/tree/master/promet/source/components/dexif
Also das Selbe kann die Routine die ich schon gefunden habe auch, ich möchte sie eigentlich abspecken denn ich benötige nur RelatedImageWidth, RelatedImageHeight und das Thumbnail. Aus den beiden Werten lässt sich das Seitenverhältnis berechnen, womit ich dann die Differenzen im Thumbnail ermitteln kann (also die schwarzen Balken) um sie abzuschneiden!
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: JPEG, PNG, GIF - Resize

Beitrag von gocher »

Hallo zusammen,
kennt jemand von Euch einen Weg aus einem TFPMemoryImage heraus ein GIF zu speichern oder besser als Stream auszulesen, denn ein TFPReaderGIF gibt es aber ein TFPWriterGIF nicht?
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Benutzeravatar
theo
Beiträge: 10900
Registriert: Mo 11. Sep 2006, 19:01

Re: JPEG, PNG, GIF - Resize

Beitrag von theo »

gocher hat geschrieben:Hallo zusammen,
kennt jemand von Euch einen Weg aus einem TFPMemoryImage heraus ein GIF zu speichern oder besser als Stream auszulesen, denn ein TFPReaderGIF gibt es aber ein TFPWriterGIF nicht?
Hatte ich doch hier schon geschrieben: http://www.lazarusforum.de/viewtopic.php?p=64596#p64596

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: JPEG, PNG, GIF - Resize

Beitrag von Christian »

Gibts nen Grund warum du die abspecken willst, oder hast zuviel zeit ?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: JPEG, PNG, GIF - Resize

Beitrag von gocher »

Christian hat geschrieben:Gibts nen Grund warum du die abspecken willst, oder hast zuviel zeit ?
Ich hab Zeit :) , mein Server nicht :( , ja und da suche ich halt nach Millisekunden die ich einsparen kann, für JPEGs ist mir das geglückt, bei PNGs hat sich nichts geändert durch den Wechsel und bei GIFs fehlt mir heute noch die Zündende Idee!

GIFs sind im eigentlichen auch die Nebensache da sie eh meist nicht skaliert werden müssen, meistens sind es halt JPEGs und selten bei mir auch Grafiken/Diagramme als PNGs, aber dennoch möchte ich auch GIFs unterstützen und die Routine klein und schnell halten, denn im Augenblick ist sie gerade mal 330 Zeilen lang und nutzt die Units: FPImage, FPImgCanv, FPReadJPEG, FPWriteJPEG, FPReadPNG, FPWritePNG, FPReadGIF, FPReadBMP und ist schneller (zumindest im Haupteinsatzgebiet) als die bisher eingesetzte GDIPlus.

Aber es macht auch nichts wenn sich damit noch keiner befasst hat, war nur eine Frage, OpBitmap und besonders Vampyre sind halt zu schwerfällig, besonders weil ich das ganze Drumherum nicht benötige.
Unter Lazarus /Free Pascal stehen einem etliche Möglichkeiten zu Verfügung, BGRABitmap unterstützt wohl auch alle Formate, aber ich such dann den Vergleich und muss wohl wieder eine Testroutine schreiben und alle Komponenten testen, so bin ich nun mal! :? Ich mache nun mal alles was meinem Server die Arbeit erleichtert. :mrgreen:
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Benutzeravatar
theo
Beiträge: 10900
Registriert: Mo 11. Sep 2006, 19:01

Re: JPEG, PNG, GIF - Resize

Beitrag von theo »

gocher hat geschrieben: Aber es macht auch nichts wenn sich damit noch keiner befasst hat, war nur eine Frage, OpBitmap und besonders Vampyre sind halt zu schwerfällig,
Was bitte ist "schwerfällig"? OpBitmap ist superleicht. ;-)
gocher hat geschrieben: besonders weil ich das ganze Drumherum nicht benötige.
Dann lass das Drumherum weg.
gocher hat geschrieben: BGRABitmap unterstützt wohl auch alle Formate,
Afaik ist BGRABitmap auf TFPCustomImage aufgebaut und unterstützt gar keine weiteren Formate als die TFPWriter.

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: JPEG, PNG, GIF - Resize

Beitrag von gocher »

theo hat geschrieben: Afaik ist BGRABitmap auf TFPCustomImage aufgebaut und unterstützt gar keine weiteren Formate als die TFPWriter.
Ok, da hast Du wohl mehr Ahnung, da bist Du tiefer in der Materie, ich schau mich halt gerade erst mal um und da bin ich halt auf das Lazarus Wiki http://wiki.freepascal.org/Graphics_libraries gestoßen, um alle Alternativen zu finden dachte ich wäre das eine gute Übersicht.
Ich dachte halt wenn dort Supported File Formats steht heißt das halt unterstützte Dateiformate, aber ich lasse mich gerne eines besseren belehren!
Ok dann schaue ich mir OpBitmap noch mal an!
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: JPEG, PNG, GIF - Resize

Beitrag von gocher »

Also abgekürzt siet mein Test nun so aus:

Code: Alles auswählen

uses .., opbitmapformats;
function getScaledImage(const InFile, OutFile: string; const maxWidth, maxHeight: word): boolean;
var
  StartTime: DWord; 
  bmp: TOPPicture; 
begin
  ...
   StartTime := GetTickCount(); 
   bmp := TOPPicture.create;
   bmp.LoadFromFile(InFile);
   bmp.Bitmap.Canvas.Resample(160,109);
   WriteLn('Zeit nach (ResizeImage): ' + IntToStr(GetTickCount() - StartTime));
   bmp.SaveToFile(OutFile);
   bmp.free; 
  ...
end;
In der Explorer Voransicht ist alles ok, aber wenn ich mir das Ergebnis unter Paint oder Paint.Net ansehen/öffnen möchte, bekomme ich folgende Meldungen! Muss ich vorm speichern noch Parameter setzen, gibt es zu OpBitmap eine Dokumentation?
Fehlermeldung bei Paint.Net
Fehlermeldung bei Paint.Net
error_paint.net.png (11.66 KiB) 2290 mal betrachtet
Fehlermeldung bei Paint
Fehlermeldung bei Paint
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Benutzeravatar
theo
Beiträge: 10900
Registriert: Mo 11. Sep 2006, 19:01

Re: JPEG, PNG, GIF - Resize

Beitrag von theo »

gocher hat geschrieben: Ich dachte halt wenn dort Supported File Formats steht heißt das halt unterstützte Dateiformate, aber ich lasse mich gerne eines besseren belehren!
Ich bin auch nicht total sicher, aber GIF wird von FPImage lesernderweise unterstützt. Wenn du dort einen WriteGif Code findest, lass es mich wissen.

Benutzeravatar
theo
Beiträge: 10900
Registriert: Mo 11. Sep 2006, 19:01

Re: JPEG, PNG, GIF - Resize

Beitrag von theo »

gocher hat geschrieben: In der Explorer Voransicht ist alles ok, aber wenn ich mir das Ergebnis unter Paint oder Paint.Net ansehen/öffnen möchte, bekomme ich folgende Meldungen!
Keine Ahnung, unter Linux (Gimp, Showfoto, Okular etc.) geht's. Die Browser (Firefox, Opera, Chromium, Konqueror) haben auch kein Problem damit.
Vllt. ist diese Software sehr intolerant gegenüber kleinen Inkompatibilitäten. Ich weiss es nicht.

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: JPEG, PNG, GIF - Resize

Beitrag von gocher »

Also ich habe mir die Resultierende Datei mal im Hexeditor angesehen:
Hexdump Result
Hexdump Result
hexdump_result_gif.png (9.71 KiB) 2284 mal betrachtet
Ich habe dann noch einmal das Bild mit Paint.Net und GDIPlus generiert und festgestellt das die anderen Routinen alle den Gif-Header nach den Konventionen generieren.
Der Gif-Header sollte so aussehen:

Code: Alles auswählen

  TGifHeader = record
    Signature: array [0..5] of char;
    Width, Height: word;
    Flags, Background, Aspect: byte;
  end;       
In gifwrite.pas Zeile: 690 soll das wohl auch passieren aber rWidth und rHeight sind 0.

Code: Alles auswählen

    WriteSourceInteger(2, rWidth);                  // logical screen width
    WriteSourceInteger(2, rHeight);                 // logical screen height
Wenn Du in gifwrite.pas Zeile: 548 die beiden Zeilen einfügst, funktioniert es:

Code: Alles auswählen

        rGlobalColorValid := true;
        rWidth := Abitmap.Width;  //**neu
        rheight := Abitmap.Height; //**neu
        end;    // with
 
Es wäre noch zu prüfen ob es so auch für Animated-GIFs richtig ist, aber so weit wollte ich mich eigentlich gar nicht hinein knien, denn eigentlich habe ich ja was fertiges gesucht oder nur eine einfache Lösung!
Zuletzt geändert von gocher am So 6. Okt 2013, 16:57, insgesamt 2-mal geändert.
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Antworten