[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


ps: some details
  • test
    1. get libjpeg-turbo binary
    2. use commands

    Code: Select all

    djpeg.exe -bmp -outfile test_0.bmp test.jpg
    djpeg.exe -bmp -dither fs -outfile test_1_dither_fs.bmp test.jpg
    
    note: -dct int switch is applied by default
    3. compare files - images are the same
  • 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
  • doc
    it is also 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.
      
pps: hope this is enough to discourage this ignorant behavior