Najszybszy generator miniatur JPEG dla systemu Linux

9

Szukam najszybszego konwertera obrazów wiersza polecenia dla systemu Linux, który może odczytać obraz JPEG, przeskalować go maksymalnie do 1366 x 768 i napisać wysokiej jakości obraz JPEG 50. Coś takiego, ale znacznie szybsze niż ImageMagick:

$ convert -resize x768 -quality 50 foo42.jpg foo42.th.jpg
# takes 0m16.713s for my test image set

Próbowałem również tego:

$ <foo42.jpg djpeg | pnmscale -xysize 1366 768 | cjpeg -quality 50 >foo42.th.jpg
# takes 0m12.007s for my test image set, and has lower visual quality than ImageMagick

Więc chciałbym mieć program, najlepiej napisany w C, który integruje djpeg, wyższą jakość wersji pnmscale i cjpeg.

Właśnie znalazłem swiggle (program C korzystający z libjpeg), wyłączyłem niektóre jego funkcje, których nie potrzebuję w kodzie źródłowym, i mam:

$ swiggle -f -H 768 .
# takes 0m11.378s for my test image set, yields high quality results

Czy masz inną sugestię? Myślę, że większość konwerterów obrazów używa libjpeg, więc ciężko byłoby uzyskać znacznie szybsze wyniki niż przełączanie.

pkt
źródło
1
Myślę, że najszybszy skorzystałby z CUDA lub OpenCL (które wykorzystują moc twojego procesora graficznego NVidia lub AMD). Myślę, że OpenCV używa teraz CUDA w częściach. Możesz być w stanie coś wymieszać, jeśli jesteś pod ręką z c
Matt H
Zgadzam się z Mattem. Jeśli są to ogromne obrazy (a jeśli zajmie to 12 sekund, to chyba nie są małe), wtedy CUDA / OpenCL wykona to zadanie. Lub zdobądź lepszy komputer.
Apache
Obrazy nie są zbyt duże (maksymalnie 4000 x 3000) - konwersja zajmuje 12 sekund dla zestawu kilkudziesięciu zdjęć.
pkt

Odpowiedzi:

13

Najszybszą biblioteką, z której korzystałem do tej pory, jest zdecydowanie EPEG . Może tworzyć kciuki tylko z plików JPG, ale tworzy je bardzo szybko:

$ identify worldmap.jpg
worldmap.jpg JPEG 6400x3200 6400x3200+0+0 DirectClass 8-bit 6.85727mb 0.840u 0:02

Imagemagick:

$ time convert -resize 1536x768 -quality 50 worldmap.jpg im_thumb.jpg
# 2.93s user 0.23s system 85% cpu 3.718 total

EPEG:

$ time epeg -w 1536 -h 768 -q 50 worldmap.jpg epeg_thumb.jpg
# 0.31s user 0.01s system 79% cpu 0.404 total

Korzystałem z tej biblioteki, aby tworzyć kciuki do ogromnej liczby naprawdę dużych obrazów.

Sebastian Stumpf
źródło
2
github.com/mattes/epeg ... sprawdź też ten widelec.
Mattes
1
Zobacz również github.com/fawick/speedtest-resize za punkt odniesienia w różnych bibliotekach
NH2
2

Rozwiązałem ten problem, pobierając swiggle (miniatura JPEG z wiersza poleceń + generator galerii obrazów HTML) i modyfikując źródło dla moich potrzeb. Zobacz pomiary prędkości w pytaniu (mniej niż 10% szybciej niż djpeg + pnmscale + cjpeg).

pkt
źródło