2012-04-13 11 views
4

Ich implementiere derzeit einen JPEG Resizer in C++ mit der jpeglib-turbo Bibliothek.Kann eine hochleistungsfähige jpeglib-turbo Implementation in <100ms dekomprimieren/komprimieren?

Ich habe das Ziel von 100 Millisekunden für JPEG-Dekompression und Rekompression mit der Bibliothek gegeben. Das Beste, was ich mit den empfohlenen Optimierungseinstellungen (dokumentiert in jpeglib-turbo usage.txt) erreichen kann, ist ungefähr 320ms, also frage ich mich, ob 100ms sogar möglich/realistisch sind? Dies würde ein Bild mit 3000x4000 px von etwa 6MB auf 130Kb dekomprimieren/komprimieren.

Der Code, den ich für eine schnelle Dekompression ist:

dinfo.dct_method = JDCT_IFAST; 
    dinfo.do_fancy_upsampling = FALSE; 
    dinfo.two_pass_quantize = FALSE; 
    dinfo.dither_mode = JDITHER_ORDERED; 
    dinfo.scale_num = 1/8; 
+0

Aus Neugier, warum brauchen Sie es so schnell zu sein? 320ms für ein 6MB JPEG ist ziemlich schnell. – Bojangles

+1

Sie haben keine Plattform erwähnt. Ist das für Handys? Desktop? Single oder Multithread? Ich habe einen schnellen DCT-Miniatur-Code, an dem ich gearbeitet habe. Auf meinem 2GHz Core i7 (mit einem einzigen Thread) kann ein RGB-Bild mit einer Größe von 1/8 aus 6 Megabyte JPEG-Daten (einem 4000x4000 Bild) in etwa 120 ms extrahiert werden. Um das 500x500 Bild auf 130KB neu zu komprimieren würde wahrscheinlich noch weitere 40-100ms dauern (ich habe noch keine extreme Optimierung am Kompressor vorgenommen). Der zeitkritische Teil des Thumbnail-Extrakt-Codes wird in einer 64-Bit-Assemblersprache geschrieben. Kontaktieren Sie mich für weitere Informationen ([email protected]). – BitBank

+2

ist dieses Projekt Open Source zufällig? post a link :) – kritzikratzi

Antwort

4

Danke für die Antworten.

Es ist tatsächlich möglich, in ca. 100ms zu dekomprimieren und neu zu komprimieren. Nachdem er den Autor von libjpeg-turbo kontaktiert hatte, erzählte er mir, dass die von mir verwendete Eigenschaft dinfo.scale_num falsch war. Diese Eigenschaft ist die Skala Zähler - Ich musste auch die scale_denom (Nenner) -Eigenschaft setzen.

So würde der gute Code sein:

dinfo.dct_method = JDCT_IFAST; 
dinfo.do_fancy_upsampling = FALSE; 
dinfo.two_pass_quantize = FALSE; 
dinfo.dither_mode = JDITHER_ORDERED; 
dinfo.scale_num = 1; 
dinfo.scale_denom = 8; 

ich den Code soll so schnell sein wie die Bildskalierung für den Benutzer nicht wahrnehmbar sein sollte, wie es in einer Client-Anwendung ist, wo Geschwindigkeit/user-Erfahrung die ist Das Wichtigste.

+0

Sie stellen 'scale_num' zweimal ein, raten Sie, dass einer der Anrufe' scale_denom' stattdessen setzen soll? –