Autor |
Beitrag |
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Di 12.04.11 15:27
Hi!
Ich komme momentan echt in Geschwindigkeitsprobleme, weil TJPEGImage aus der Delphi-JPEG-Unit tierisch langsam ist. Einiges rumlesen hat oft den Hinweis auf die Intel JPEG Lib gebracht, aber die hat einen Nachteil: sie existiert nicht mehr.
Ich suche also einen schnelleren JPEG-Loader. Schön wäre ein TGraphic-kompatibler Wrapper, aber wenn man den erst bauen muss nicht wäre es auch kein Beinbruch.
Gibts da was schönes? Ich weiß, dass GDI+ einen hat, aber die möchte ich hier eigentlich nicht verwenden.
Danke schonmal,
Martok
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 12.04.11 15:44
Hast du einmal diese Unit zum Beispiel probiert?
cc.embarcadero.com/item/19723
|
|
Martok 
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Di 12.04.11 17:34
Danke, ist geringfügig schneller, aber noch lange nicht ausreichend.
6600x4400px, 3MByte; 800Mhz gedrosseltes System:
jpeg.pas: 20s
jpegex.pas (mitgeliefertes Demoprogramm): 16s
ACDSee: 1.6s in Vollansicht (da wird er wohl nicht jeden Block laden), fies reingezoomt ~6s (realistischer).
Irgendwas, was in die Gegend kommt wäre schon toll. Muss ja nicht ganz so schnell sein, aber im Test unter 10s kommen will ich schon  Taktgedrosselt deswegen, damit man die Unterschiede einfacher messen kann. Normal kommt ungefähr ein Drittel der Zahlen oben raus.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Zuletzt bearbeitet von Martok am Di 12.04.11 17:38, insgesamt 1-mal bearbeitet
|
|
j.klugmann
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 12.04.11 17:37
Gibt's nicht Delphi Bindings für DevIl?
|
|
Martok 
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Di 12.04.11 17:41
Mindestens in Andorra ist sowas drin. Und DevIL selber listet auch
# Delphi support.
in der Featureliste.
Danke, werde ich mir mal ansehen!
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Aya
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: Di 12.04.11 18:35
Alternativ einfach die libJPEG wrappen, du bräuchtest da nur etwa 5-10 funktionen von - dafür einen Wrapper zu basteln sollte kein großer aufwand sein und dürfte das schnellst-mögliche sein.
_________________ Aya
I aim for my endless dreams and I know they will come true!
|
|
Martok 
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Sa 21.05.11 16:21
Und mal wieder an diesem Problem arbeiten...
Aya hat folgendes geschrieben : | Alternativ einfach die libJPEG wrappen, du bräuchtest da nur etwa 5-10 funktionen von - dafür einen Wrapper zu basteln sollte kein großer aufwand sein und dürfte das schnellst-mögliche sein. |
5-10 Funktionen stimmt - aber genausoviele seitenlange Structs, die in kaputtem C sowas ähnliches wie Objekte oder viel mehr Interfaces darstellen.
Da steig ich nicht wirklich durch  Gibts sowas nich schon? Kann doch nicht der erste sein der sowas will.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Sa 21.05.11 16:56
|
|
Martok 
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Sa 21.05.11 18:11
Könnte es tatsächlich. Er hat ja auch noch einen eigenen Loader geschrieben, wird auf der MyJPEG-Seite verlinkt. Mal alles testen. Im Synopse-Projekt selbst hatte ich sowas ja schon gefunden, aber das war wohl nicht sehr kompatibel (= kann viele Dateien nicht lesen)
So wie ich das verstanden habe, darf man die IJL so direkt ja auch nicht weitergeben. Was ich allerdings mittlerweile rausgefunden habe: ACDSee nutzt die die IJL 1.1, also sogar eine relativ alte. Na mal sehen, vielleicht bau ich auch eine Klasse mit Fallbacks auf irgendwas erlaubtes und überlasse das dem User, da was passendes zu "finden"
EDIT/UPDATE:
Testszenario wie im ersten Beitrag 1: 2: 3:
| Graphics TJPEGImage: 9193,82994207364ms MyJPEG TJPEGImage (IJL): 1843,05519276891ms JPEGFast: 2673,43754583334ms |
Also werde ich IJL mit Fallback auf JPEGFast mit Fallback auf MyJPEG ohne IJL (was nur ein paar ms schneller ist als das Original-IJG) nehmen. Irgendwie 
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Sa 21.05.11 20:10
Frag doch wegen der Lizenz einfach bei Intel nach. Fragen kostet nix, und mehr als Nein sagen können die auch nicht. 
|
|
Gummibär
      
Beiträge: 18
Erhaltene Danke: 11
Delphi 7, Turbo Delphi
|
Verfasst: Mo 23.05.11 15:19
Ist es nur für eine Vorschau? Diese Riesen-Bilder passen ja eh auf keinen (bezahlbaren) Bildschirm.
Falls ja, könnte TJPEGImage.Scale helfen. Wenn man das beim Laden des JPEGs beispielsweise auf jsQuarter setzt, spart man einiges an Lade-Zeit. Und wenn man dann feststellt, dass das Bild doch kleiner war, lädt man es einfach nochmal mit Scale:=jsFullSize. Die Datei ist dann eh schon im Windows-Cache...
Gruß
Michael
|
|
Martok 
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Mo 23.05.11 16:52
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mo 23.05.11 17:10
Ich habe vor ein paar Jahren mal was auf die schnelle gebastelt. Programm ist im Anhang.
Wenn das für dich brauchbar ist, dann bekommst du die Sourcen. Aber dann nicht wundern. War wirklich ein Schnellschuss damals.
Mist. Dateianhang kann ich gerade nicht hinzufügen. Ist das ein Bug?
EDIT:
FireFox wollte nicht. Mit dem IE funktioniert es.
Noch ein EDIT:
Jetzt mit Source.
Das ist wirklich nur ein Mini-Programm mit 120 Zeilen Code. Allerdings sind die Jedi-Komponenten drin. Ohne gehts nicht.
Das Programm ist echt schon 6 Jahre alt. 
Einloggen, um Attachments anzusehen!
Zuletzt bearbeitet von jasocul am Mo 23.05.11 17:56, insgesamt 2-mal bearbeitet
|
|
Gummibär
      
Beiträge: 18
Erhaltene Danke: 11
Delphi 7, Turbo Delphi
|
Verfasst: Mo 23.05.11 17:52
(Irgendwie gehen die BB-Codes nicht, sorry  )
Zitat Martok:
"Das ist eine Nette Theorie, hatte ich ursprünglich auch mal probiert, funktioniert aber nicht. Habs mal kurz ins Testprogramm integriert:"
Ich habe es jetzt mal mit einem 6000*6000 Pixel Bild versucht (Sorry, die Einrückungen müßt ihr euch denken, die BB-Codes verweigern die Mitarbeit):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.LoadFast; VAR JPEG: TJPEGImage; begin JPEG := TJPEGImage.Create; JPEG.LoadFromFile('big.jpg'); JPEG.Scale := jsEighth; JPEG.DIBNeeded; JPEG.Free; end; | Mit Scale jsEighth komme ich auf ca. 170msec, ohne diese Einschränkung auf die 10-fache Dauer.
Habe auch mal DIBNeeded statt Canvas.Draw getestet, um nicht die Dauer mit zu messen, die für's Umkopieren von JPG nach BMP benötigt wird. Hat aber kaum was geändert (Draw hatte ich gewählt, weil ich das Bitmap so zuvor auch auf 6000*6000 Pixel setzen konnte und beide Methoden keinen Bitmap-Speicher allokieren müssen. Ansonsten hätt's ein assign() auch getan)
Vielleicht hängt das auch von den JPEGs ab? Kompressionsstärke, Progressive, etc.?
Ratloser Gruß
Michael
Moderiert von Narses: Delphi-Tags hinzugefügt
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 23.05.11 18:08
|
|