Autor Beitrag
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 12.04.11 15:44 
Hast du einmal diese Unit zum Beispiel probiert?
cc.embarcadero.com/item/19723
Martok Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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



BeitragVerfasst: Di 12.04.11 17:37 
Gibt's nicht Delphi Bindings für DevIl?
Martok Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Sa 21.05.11 16:21 
Und mal wieder an diesem Problem arbeiten... ;)

user profile iconAya hat folgendes geschrieben Zum zitierten Posting springen:
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 :nixweiss: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Sa 21.05.11 16:56 
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Intel JPEG Lib gebracht, aber die hat einen Nachteil: sie existiert nicht mehr. :(

Hilft Dir das vielleicht weiter? bouchez.info/micropic.html
Martok Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Sa 21.05.11 18:11 
user profile iconGerd Kayser hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Intel JPEG Lib gebracht, aber die hat einen Nachteil: sie existiert nicht mehr. :(

Hilft Dir das vielleicht weiter? bouchez.info/micropic.html
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" :P

EDIT/UPDATE:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18
Erhaltene Danke: 11


Delphi 7, Turbo Delphi
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Mo 23.05.11 16:52 
user profile iconGummibär hat folgendes geschrieben Zum zitierten Posting springen:
Ist es nur für eine Vorschau? Diese Riesen-Bilder passen ja eh auf keinen (bezahlbaren) Bildschirm.
Sowohl als auch.


user profile iconGummibär hat folgendes geschrieben Zum zitierten Posting springen:
Falls ja, könnte TJPEGImage.Scale helfen. Wenn man das beim Laden des JPEGs beispielsweise auf jsQuarter setzt, spart man einiges an Lade-Zeit.
Das ist eine Nette Theorie, hatte ich ursprünglich auch mal probiert, funktioniert aber nicht. Habs mal kurz ins Testprogramm integriert:

ausblenden Quelltext
1:
2:
Graphics TJPEGImage Eighth: 9288,68864618269ms
Graphics TJPEGImage Full: 9250,47345402838ms

:nixweiss:

_________________
"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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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. :shock:
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von jasocul am Mo 23.05.11 17:56, insgesamt 2-mal bearbeitet
Gummibär
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18
Erhaltene Danke: 11


Delphi 7, Turbo Delphi
BeitragVerfasst: 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):
ausblenden 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;  // Decompression. Usually not neccessary
  //Image1.Picture.Bitmap.Canvas.Draw(0, 0, JPEG);
  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 user profile iconNarses: Delphi-Tags hinzugefügt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 23.05.11 18:08 
user profile iconGummibär hat folgendes geschrieben Zum zitierten Posting springen:
(Irgendwie gehen die BB-Codes nicht, sorry :( )
Die kannst du auch manuell einfügen, aber davon abgesehen reicht es, wenn du deinen Cache leerst, dann gehen die Knöpfe wieder. Es gab ein Update für das Forum. ;-)