[v1.104] JPEG decoding with dithering

XnConvert Multi Platform - Windows, MacOSX, Linux

Moderator: xnview

User avatar
XnTriq
Forum Librarian
Posts: 6563
Joined: Sun Sep 25, 2005 3:00 am
Location: Ref Desk

[v1.104] JPEG decoding with dithering

Post by XnTriq »

  1. Go to SettingsLoad format settings…Read.
  2. Set DCT to Floating.
  3. Set Dithering to None.
  4. Convert a JPEG to PNG.
  5. Repeat the conversion with Dithering = Ordered.
  6. Repeat the conversion with Dithering = Floyd-Steinberg.
The resulting PNGs are identical :bug:
Xn User
Posts: 279
Joined: Sat Jan 05, 2019 1:16 pm

Re: [v1.104] JPEG decoding with dithering

Post by Xn User »

Which method compression in JPEG file was be used ? This very need for report , I mean what 1x1 1x1 1x1 or 1x2 1x1 1x1 or 2x2 1x1 1x1 )
And test was be do with classic JPEG compression methods or JPEG LI compression methods ?
User avatar
XnTriq
Forum Librarian
Posts: 6563
Joined: Sun Sep 25, 2005 3:00 am
Location: Ref Desk

Re: [v1.104] JPEG decoding with dithering

Post by XnTriq »

testorig.jpg
Encoder: libjpeg
Chroma subsampling: 4:2:0 (2×2,1×1,1×1)
You do not have the required permissions to view the files attached to this post.
User avatar
xnview
Author of XnView
Posts: 47743
Joined: Mon Oct 13, 2003 7:31 am
Location: France

Re: [v1.104] JPEG decoding with dithering

Post by xnview »

XnTriq wrote: Mon Mar 10, 2025 2:30 am testorig.jpg
Encoder: libjpeg
Chroma subsampling: 4:2:0 (2×2,1×1,1×1)
if i check the code of libjpeg, it seems that dithering is only used when quantize with colormap :(
Pierre.
Xn User
Posts: 279
Joined: Sat Jan 05, 2019 1:16 pm

Re: [v1.104] JPEG decoding with dithering

Post by Xn User »

Right , Dithering must be do use only for 1x2 1x1 1x1 or 2x1 1x1 1x1 or 2x2 1x1 1x1 , for 1x1 1x1 1x1 dithering not need use )
I also asked in JPEGLi https://github.com/libjxl/libjxl/issues/4146 , you can see what XnView MP and ACDSee Pro 5.0 with IDE_ACDstd 5.0.56.0000 reading file with differ , in result XnView MP with Floyd-Steinberg colors a little rude if compare with ACDSee Pro , I see rude gradients
Xn User
Posts: 279
Joined: Sat Jan 05, 2019 1:16 pm

Re: [v1.104] JPEG decoding with dithering

Post by Xn User »

Please , add all this algorithms https://surma.dev/things/ditherpunk/ and will be learn which is better
In the end will better if this algoritms will be apply optionaly to all lossy or images with less colors
this for testing methods of dithering https://surma.dev/lab/ditherpunk/lab.html
User avatar
XnTriq
Forum Librarian
Posts: 6563
Joined: Sun Sep 25, 2005 3:00 am
Location: Ref Desk

Re: [v1.104] JPEG decoding with dithering

Post by XnTriq »

User avatar
user0
XnThusiast
Posts: 2922
Joined: Sat May 09, 2015 9:37 am

Re: [v1.104] JPEG decoding with dithering

Post by user0 »

xnview wrote: Mon Mar 10, 2025 7:20 am if i check the code of libjpeg, it seems that dithering is only used when quantize with colormap :(
yep,
  • Color quantization [legacy feature]
    is an optional post-decoding step that maps full-color pixel data to a limited palette
    • Dithering [legacy feature]
      is an optional component of color quantization that introduces structured noise to mask quantization errors, reduce visible artifacts such as banding and improve perceived color transitions
since these steps are not applicable when rendering 24/32/48-bit images, the following should be removed:
- Dithering combobox in Settings>Formats>Read - JPEG
- -dither fs switch when lib is used internally


Some details

Doc
it is clearly written in DJPEG DETAILS section of usage.txt
"Note that these switches (-dither) have no effect unless color quantization is being done."
  • libjpeg
    https://www.ijg.org/files/jpegsr10.zip

    Code: Select all

    	-colors N	Reduce image to at most N colors.  This reduces the
    	or -quantize N	number of colors used in the output image, so that it
    			can be displayed on a colormapped display or stored in
    			a colormapped file format.  For example, if you have
    			an 8-bit display, you'd need to reduce to 256 or fewer
    			colors.  (-colors is the recommended name, -quantize
    			is provided only for backwards compatibility.)
    

    Code: Select all

    	-dither fs	Use Floyd-Steinberg dithering in color quantization.
    	-dither ordered	Use ordered dithering in color quantization.
    	-dither none	Do not use dithering in color quantization.
    			By default, Floyd-Steinberg dithering is applied when
    			quantizing colors; this is slow but usually produces
    			the best results.  Ordered dither is a compromise
    			between speed and quality; no dithering is fast but
    			usually looks awful.  Note that these switches have
    			no effect unless color quantization is being done.
    			Ordered dither is only available in -onepass mode.
    
  • libjpeg-turbo
    https://github.com/libjpeg-turbo/libjpe ... /usage.txt

    Code: Select all

            -colors N       Reduce image to at most N colors [legacy feature].
            or -quantize N  This reduces the number of colors used in the output
                            image so that it can be stored in a colormapped file
                            format.  This feature cannot be used when decompressing
                            lossless JPEG images.  (-colors is the recommended
                            name.  -quantize is provided only for backward
                            compatibility.)
    

    Code: Select all

            -dither fs      Use Floyd-Steinberg dithering when quantizing colors
                            [legacy feature].
            -dither ordered Use ordered dithering when quantizing colors [legacy
                            feature].
            -dither none    Do not use dithering when quantizing colors [legacy
                            feature].  By default, Floyd-Steinberg dithering is
                            applied when quantizing colors.  This is slower but
                            usually produces the best results.  Ordered dithering
                            is a compromise between speed and quality.  No
                            dithering is faster but usually looks awful.  Note that
                            these switches have no effect unless color quantization
                            is being done.  Ordered dithering is only available in
                            -onepass mode.
    

Code
dither_mode is ignored if quantize_colors is false
StepCode FileAction
Parsing djpeg.c captures -dither and -colors flags
Master Control jdmaster.c sees quantize_colors == TRUE; enables the quantizer
Processing jquant*.c checks cinfo->dither_mode to decide which math loop to run (1or2 pass)
Output wr*.c writes the dithered, low-color pixels to a BMP/GIF/PPM file


Test
  1. get libjpeg-turbo binary
  2. decode jpeg
    • default output

      Code: Select all

      djpeg.exe -bmp -outfile test_0.bmp test.jpg
      Note: by default the following applied as well:
      -dct int
      chroma fancy upsampling
    • add dithering

      Code: Select all

      djpeg.exe -bmp -dither fs -outfile test_1_dither_fs.bmp test.jpg
  3. compare
    default vs dithering - images are the same


ps: hope this is enough to discourage this ignorant behavior