This program tries to recover the lost precision of DCT coefficients based on a quantization table from a JPEG image. The result is saved as a JPEG image with quantization set to 1 (like a JPEG saved at 100% quality).
You may not notice jpeg artifacts on the screen without zooming in, but you may notice them after printing. Also, when editing compressed images, artifacts can accumulate, but if you use this program before editing - the result will be better.
The original project page is here.
You can save a smoothed image with the original quantization tables, which will result in the same DCT coefficients as in the original image. (Note: chroma will be slightly different if upsampling is used at quality level 6)
Since this program uses quantization tables to recreate DCT coefficients, applying it to JPEG images that have been re-saved multiple times may not produce good results, as it can recover only from the last JPEG recoding, and not from the previous ones.
Web version available here. Images are processed locally on your computer. Without multithreading and SIMD optimizations it runs slower than native code.
jpegqs [options] input.jpg output.jpg
-q, --quality n
Quality setting (0-6, default is 3)
-n, --niter n
Number of iterations (default is 3)
-t, --threads n
Set the number of CPU threads to use
-o, --optimize
Option for libjpeg to produce smaller output file
-v, --verbose n
Print libjpeg debug output
-i, --info n
Print quantsmooth debug output (default is 15)
Use the sum of flags: 0 - silent, 1/2/4 - various information, 8 - processing time, 16 - SIMD type.
-p, --cpu n
Use to lower the SIMD type if CPU detection fails:
0 - auto, 1 - scalar, 2 - SSE2, 3 - AVX2, 4 - AVX512.
(x86
build selects between modes 1-3, x86_64
from 2-4)
The quality setting sets a combination of flags for processing:
DIAGONALS
flagJOINT_YUV
flagUPSAMPLE_UV
flagfancy upsampling
from libjpegLOW_QUALITY
flagLOW_QUALITY
implies DIAGONALS
(always set)
Original images:
JPEG with quality increasing from 8% to 98%:
After processing:
If your system have libjpeg development package installed, just type make
.
Tested with libjpeg-turbo8-dev
package from Ubuntu-18.04.
Use the SIMD=select
switch, so that jpegqs
is compiled for different CPU vector extensions.
amd64 application: make SIMD=select MFLAGS="-m64" clean app
i386 application: make SIMD=select MFLAGS="-m32 -march=i386" clean app
Package dependencies: libc, libjpeg, openmp
wget https://www.ijg.org/files/jpegsrc.v6b.tar.gz
tar -xzf jpegsrc.v6b.tar.gz
wget -O libjpeg-turbo-2.0.4.tar.gz https://sourceforge.net/projects/libjpeg-turbo/files/2.0.4/libjpeg-turbo-2.0.4.tar.gz
tar -xzf libjpeg-turbo-2.0.4.tar.gz
jpegqs
in a simpler way:make JPEGSRC=jpeg-6b
jconfig.h
, which should work for common systems.Configure and build libjpeg:
(cd jpeg-6b && ./configure && make all)
./configure
script is replaced with cmake
:(cd libjpeg-turbo-2.0.4 && mkdir -p .libs && (cd .libs && cmake -G"Unix Makefiles" .. && make all))
Tell make
where to find libjpeg includes and libjpeg.a
make JPEGLIB="-Ijpeg-6b jpeg-6b/libjpeg.a
For a newer versions libjpeg.a
is located in a .libs/
dir.
The jpegqs
makefile can download sources, extract and compile libjpeg
for you. Replace %VER%
with a version.
make jpeg-%VER%/libjpeg.a
Tested versions: 6b, 7, 8d, 9cmake libjpeg-turbo-%VER%/libjpeg.a
Tested versions: 1.0.0, 1.4.2, 1.5.3, 2.0.4It will print you link to archive which you need to download, or you can allow the downloads by adding WGET_CMD=wget
to the make
command line.
Get MSYS2, install needed packages with pacman and build with release.sh. If you are not familiar with building unix applications on windows, then you can download program from releases.
Can be easily added to other software that uses libjpeg
to read JPEG images.
jpeg_start_decompress
and jpeg_finish_decompress
.quantsmooth.h
(compile jpegqs as inline) or libjpegqs.h
(link to the jpegqs library).jpeg_
to jpegqs_
for these two functions.jpegqs_start_decompress
takes an additional argument with options, see example.c
for how to use it.libjpegqs.a
static library with make SIMD=select lib
Similar projects, and how I see them after some testing.
jpeg2png:
✔️ good documentation and math model
✔️ has tuning options
✔️ better at deblocking low quality JPEG images
❓ has an overblurring (-w 0.0
switch makes the result a little sharper, but doesn't fix it)
➖ 10 to 20 times slower
➖ less permissive license (GPL-3.0)
jpeg2png can provide roughly same quality (better in not common cases), but significantly slower.
knusperli:
✔️ more permissive license (Apache-2.0)
➖ you can hardly see any improvements on the image
➖ no performance optimizations (but roughly same speed as for quantsmooth with optimizations)
➖ no any command line options
➖ uncommon build system
knusperli is good for nothing, in my opinion.