JPEG XL

Info

rules 57
github 35276
reddit 647

JPEG XL

tools 4225
website 1655
adoption 20712
image-compression-forum 0

General chat

welcome 3810
introduce-yourself 291
color 1414
photography 3435
other-codecs 23765
on-topic 24923
off-topic 22701

Voice Channels

General 2147

Archived

bot-spam 4380

jxl

Anything JPEG XL related

jonnyawsom3
2025-04-21 08:57:10
During our work for <#1358733203619319858>, we found that jxl-oxide can be up to 2x faster than libjxl in certain scenarios, showing there's still lots of room for improvement
Demiurge Group by group sequential. Nothing progressive about it.
2025-04-21 08:57:48
Thinking about it, is centre-first group ordering still sequential?
Demiurge
2025-04-21 08:58:07
Technically yes-no-yes
jonnyawsom3
Mine18 Huh, didnt know that jxl is progressive at all times (thought you had to specify when encoding), and i didnt know that lossless trancodes to jpeg were always progressive
2025-04-21 09:01:40
I kinda already said but I'll clarify it further. Lossy VarDCT is always progressive, but can be made more progressive with -p to the point of 0.1% giving an image. Lossless loads per group by default (128 to 1024 blocks) but can have a custom order like centre-out, with -p replicating the behaviour in lossy
Demiurge
2025-04-21 09:02:40
Center-out is technically sequential but also kinda in its own special cool category
2025-04-21 09:03:05
But jxl can be BOTH sequential and center-out, or any combination of the two
2025-04-21 09:03:19
And it doesn't have to be in the center either
jonnyawsom3
2025-04-21 09:06:16
Group ordering can be arbitrary, though not exposed in the API yet, and level of progressiveness for lossless can also be customised, changing how many passes there are (needs testing)
Mine18
I kinda already said but I'll clarify it further. Lossy VarDCT is always progressive, but can be made more progressive with -p to the point of 0.1% giving an image. Lossless loads per group by default (128 to 1024 blocks) but can have a custom order like centre-out, with -p replicating the behaviour in lossy
2025-04-21 09:06:35
very neat
spider-mario
screwball it seems impossible to me i dont see any blocky artifacting or anything
2025-04-21 12:14:27
it looks ever so slightly blurrier to me (especially noticeable in the top right and when flipping between the two), but not bad indeed
CrushedAsian255 Will there ever be a Rust encoder?
2025-04-21 12:15:00
not a priority for us at the moment (completing the decoder is more important), but of course thereโ€™s always the possibility that someone else would make one
2025-04-21 12:15:38
you could theoretically be the answer to your question!
CrushedAsian255
spider-mario you could theoretically be the answer to your question!
2025-04-21 12:16:11
... if I learned Rust (and how JXL's coding tools work)
spider-mario
2025-04-21 12:16:42
is that out of the question?
CrushedAsian255
spider-mario is that out of the question?
2025-04-21 12:18:25
am I allowed to ~~steal~~ borrow code from the jxl-rs project?
spider-mario
2025-04-21 12:28:44
itโ€™s BSD3 ;)
screwball
spider-mario it looks ever so slightly blurrier to me (especially noticeable in the top right and when flipping between the two), but not bad indeed
2025-04-21 05:34:44
i can see that but its definitely not noticable when zoomed out at the full 10k image
Demiurge
CrushedAsian255 am I allowed to ~~steal~~ borrow code from the jxl-rs project?
2025-04-21 07:42:31
https://github.com/libjxl/jxl-rs/blob/main/LICENSE
gb82
Demiurge Center-out is technically sequential but also kinda in its own special cool category
2025-04-21 07:51:55
Hmm, center out โ€ฆ reminds me of middle-out
Demiurge
2025-04-21 09:44:43
Dick jerk algorithm
2025-04-21 09:58:29
https://youtu.be/P-hUV9yhqgY
jonnyawsom3
_wb_ If it's mostly yellows getting desaturated in non-smooth regions, it suggests we need to allocate relatively more bits to the AC of the B component.
2025-04-22 09:52:55
Hopefully I'm wrong, but I don't think that will help. XYB itself seems to desaturate yellow
2025-04-22 09:53:02
sRGB
2025-04-22 09:53:04
XYB
2025-04-22 09:53:39
That's a ramp from 0,0,0 to 255,255,0
2025-04-22 09:56:57
Only the very end of the scale is the saturation you'd expect, so as soon as the colors are quantized, it starts to desaturate
2025-04-22 10:02:03
Unless this is more color management shenanigans throwing me off... Which also wouldn't surprise me
2025-04-22 10:21:07
Hard to tell... Using this site seems better, but I'm out of gamut constantly so it's hard to judge https://unicolour.wacton.xyz/colour-picker/
_wb_
2025-04-22 11:07:54
how did you do the RGB -> XYB -> RGB?
2025-04-22 11:10:44
doing a very low distance lossy (either with vardct, or with modular with or without squeeze) encode and decode does include an XYB roundtrip, and if I do that, I do get some off-by-ones and off-by-twos in the B channel but nothing nearly as big as the example you show
jonnyawsom3
2025-04-22 11:13:49
I had plucked it from this site, but now I see it's from 2021 and likely very outdated, sorry about that https://raphlinus.github.io/color/2021/01/18/oklab-critique.html
_wb_
2025-04-22 11:36:04
oh but that is doing the gradient in XYB space, which is expected to look different than doing the gradient in other color spaces. That's a way to see how perceptually uniform the space is: if it's perceptually uniform, colors interpolated linearly between two other colors should be "in between" the two colors and in equally spaced steps. You can see that sRGB for example is not very perceptually uniform in this example, since when going from red to cyan you get dark grayish colors in between that perceptually don't "belong" there.
jonnyawsom3
2025-04-22 11:56:23
Ahh right, makes sense
Lumen
2025-04-22 01:51:06
now let's ask the right questions which XYB is it ahah since it is different in ssimu2 or butteraugli for example
_wb_
2025-04-22 01:54:07
according to the description on the site, they use the cube root one, so the one in JPEG XL and ssimu2
Lumen
2025-04-22 01:54:15
I see
Demiurge
_wb_ If it's mostly yellows getting desaturated in non-smooth regions, it suggests we need to allocate relatively more bits to the AC of the B component.
2025-04-22 02:25:47
It's definitely in smooth regions too. It's in almost every single picture at d=1 and up. It's easy to see across a wide variety of images. Not just desaturation but also weird chroma ringing artifacts in very colorful images too, which is a completely separate issue that also affects the quality of colors across a wide range of images encoded with libjxl
2025-04-22 02:27:46
Since it affects the majority of images, literally more than half, and is often noticeable even when sitting a good distance away from the screen, I'm kinda surprised how long such a bug like that has survived for a long time
_wb_
A homosapien I made an issue with a photographic example here: https://github.com/libjxl/libjxl/issues/3616
2025-04-22 02:40:25
Something weird is up with that original image. The original version I have lying around is less saturated.
2025-04-22 02:41:27
this is the version of that image that I know
2025-04-22 02:41:59
this is the version that is in the github issue
Demiurge
2025-04-22 02:44:30
I notice the desaturation issue in more than half of the lossy images I encode locally on my own PC using cjxl and cjpegli.
2025-04-22 02:44:44
It's not specific to a single comparison or image or website
_wb_
2025-04-22 02:44:58
these are both PNG files that are just sRGB images, this has nothing to do with jxl
Demiurge
2025-04-22 02:45:08
It's consistent across practically all images I encode locally myself
_wb_ these are both PNG files that are just sRGB images, this has nothing to do with jxl
2025-04-22 02:48:53
I know it's strange that there's an alternate version of the image with increased saturation. I know it has nothing to do with the issue in libjxl. But there is a real issue with libjxl, and it's noticeable across almost every image I try and usually noticeable from a distance too, depending on the image it's very noticeable even in side by side viewing
2025-04-22 02:51:05
Incremental fixes of bugs that have the biggest impact on image fidelity can easily add up and quickly close the gap between libaom and libjxl.
jonnyawsom3
Demiurge It's definitely in smooth regions too. It's in almost every single picture at d=1 and up. It's easy to see across a wide variety of images. Not just desaturation but also weird chroma ringing artifacts in very colorful images too, which is a completely separate issue that also affects the quality of colors across a wide range of images encoded with libjxl
2025-04-22 03:32:27
At first I thought it affected smooth areas too, but then I double checked and I think it is the AC of the B channel. You can see yellow chroma bleed around the line on the turquoise with blue/grey bleeding into the yellow
2025-04-22 03:34:22
The AQ isn't taking into account that it's a rather narrow range of B required to hit saturated yellows
Demiurge
2025-04-22 03:40:44
But I see it desaturating the green dress in "Japan Expo" photo too
2025-04-22 03:41:00
Maybe there's some blue there too though...
2025-04-22 03:41:04
Hmm
2025-04-22 03:41:09
Yeah it might be
jonnyawsom3
2025-04-22 03:41:30
Original, v0.8 and main. Seems to avoid the yellow bled in the turquoise but desaturates the yellow even more
Demiurge
2025-04-22 03:41:38
B in XYB is kind of a blue-yellow axis
jonnyawsom3
Hard to tell... Using this site seems better, but I'm out of gamut constantly so it's hard to judge https://unicolour.wacton.xyz/colour-picker/
2025-04-22 03:43:08
That site shows the hue of each channel live, so you can see the 'yellow' target move as you adjust Y and B
juliobbv
_wb_ this is the version of that image that I know
2025-04-22 04:21:38
there are two versions of the daala subset1 floating around (where this image came from)
A homosapien
_wb_ Something weird is up with that original image. The original version I have lying around is less saturated.
2025-04-22 06:22:54
Actually, the version you have is not truly the original. I hunted down the source image, which has an Adobe RGB color profile. The daala image set that uses this image "converts" to sRGB by stripping the ICC profile, which is horrible! So I did my due diligence and properly converted it to sRGB (relative colormetric) then downscaled it in linear light (Fant 25%) to mimic the daala image set. By the way, I did my due diligence and I tested it with the ICC profile stripped, identical to the daala set. The desaturation still happens around the yellow leaves. Same thing if the Adobe RGB profile is preserved.
2025-04-22 06:24:57
https://en.m.wikipedia.org/wiki/File:Abandoned_Packard_Automobile_Factory_Detroit_200.jpg
2025-04-22 06:25:02
It's the 2010 version
_wb_
2025-04-22 06:31:15
Ah, good find about the original color space! I was just confused about the difference in saturation but of course then your version is way more correct
2025-04-22 06:35:17
I will take a look tomorrow to see if there is a way to reduce this desaturation effect, I think it is related to the quantization of the HF of X where there's too much rounding towards zero happening
jonnyawsom3
2025-04-22 06:45:10
It could be worth inspecting the individual channels, comparing high quality to low quality if possible
username
A homosapien It's the 2010 version
2025-04-22 06:55:53
what's the deal with the 2023 version? the comment for it says "ShiftN correction" and it's perspective is cropped and changed along with being wayy larger in file size
2025-04-22 06:58:14
the larger file size I assume is the image getting converted from JPEG to raw pixels and then to JPEG again
2025-04-22 07:00:13
I wonder if it's some kinda perspective correction based on the camera metadata embedded in it
A homosapien
2025-04-22 07:15:00
That seems to be the case, correcting for perspective and lens distortion is something I did with my RAWs
Paultimate
2025-04-23 06:31:45
All hail jxl
Demiurge
2025-04-23 06:34:53
Resistance is futile
Fab
2025-04-25 01:12:02
I ported some psychovisual improvements from hydrium and av2 to avif and jpeg
2025-04-25 01:13:14
2025-04-25 01:13:35
Should be posted in benchmark but this is relevsnt
Oleksii Matiash
Fab I ported some psychovisual improvements from hydrium and av2 to avif and jpeg
2025-04-25 01:24:42
This is jxl server, not avif or jpeg
jonnyawsom3
2025-04-25 01:38:50
Ported from hydrium? That's the minimal memory VarDCT encoder, which I doubt has much in terms of psychovisual tuning
Fab
2025-04-25 07:28:32
2025-04-25 07:29:01
I ported another av2 feature subpel Pelรน
2025-04-25 07:29:34
See the red saturation how it increases
2025-04-25 07:30:04
Jon Sneyers had already the right measurements in JPEG xl and pareto front
2025-04-25 07:30:33
In two seconds i configured them for AVIF
Traneptora
Ported from hydrium? That's the minimal memory VarDCT encoder, which I doubt has much in terms of psychovisual tuning
2025-04-25 07:53:36
Almost none
2025-04-25 07:54:14
I have some cheap tricks like zeroing out HF coeffs equal to 1
2025-04-25 07:54:54
or locking hf_mult to 5
2025-04-25 07:55:07
(my revise that one)
2025-04-25 07:55:46
my current goal is to speed it up by trying to remove a lot of tiny mallocs
2025-04-25 07:56:06
use the stack instead
CrushedAsian255
2025-04-26 06:12:23
Did he mean the other way round?
2025-04-26 06:12:40
Maybe he ported stuff from AVIF and JPEG to hydrium and av2
Fab
2025-04-26 10:04:56
No is impossible
2025-04-26 10:06:53
Only jon knows what I cooked but is invasion of Orzivecchi privacy for two person I know
2025-04-26 10:16:16
https://www.pnas.org/doi/full/10.1073/pnas.1010076108
2025-04-26 10:16:36
I'm having a discussion with my cosin
2025-04-26 10:16:40
Cause of aomedia
2025-04-26 10:16:59
And i want to do what i want on the websites
2025-04-26 10:17:04
Gemini etc
2025-04-26 10:17:26
I have done this for 3 yesss been in the music induatry for 21 years
2025-04-26 10:18:10
And now a catholic minor is telling me to SHUT UP and my mind don't accept the refuse
jonnyawsom3
2025-04-26 11:29:43
Huh
MSLP
2025-04-26 01:06:43
Is this the original fab spreading confusion again, or someone else roleplaying spreading fab confusion?
Fab
2025-04-26 02:22:21
Sorry
2025-04-26 02:22:58
But i don't want to get ass with 67,8% of disabled who got 23,9% of people minors cut off
2025-04-26 02:23:08
I'm innocent
2025-04-26 02:23:34
I don't care i want to stay in Discord cause i can act
2025-04-26 02:40:26
I blocked all three contacts for rudeness
2025-04-26 02:40:50
The Activity i do on internet Is seeuoys
jonnyawsom3
2025-04-26 02:50:08
*Huh*
Quackdoc
MSLP Is this the original fab spreading confusion again, or someone else roleplaying spreading fab confusion?
2025-04-26 03:16:16
OG, too hard to emulate lmao
Oleksii Matiash
MSLP Is this the original fab spreading confusion again, or someone else roleplaying spreading fab confusion?
2025-04-26 03:28:39
True original, or well trained AI
jonnyawsom3
2025-04-26 04:00:23
Maybe the original is AI
Fab
2025-04-26 04:26:56
2025-04-26 04:27:10
This video maie me scary
2025-04-26 04:49:23
I found Stress et รฉpuisement professionnel des enseignants tunisiensStress and burnout among Tunisian teachers
2025-04-26 04:49:32
I'm angry
2025-04-26 04:49:44
They discriminate me
2025-04-26 04:49:51
I'm superior
2025-04-26 08:17:08
AI spreads a lot of misinformation I don't trust things entitely lookly with AI
2025-04-26 08:18:43
But Jenny Di Guardiano (Catania) has been used by me and Mediaset one year ago in September to training of Gemini
2025-04-26 08:19:29
It learned to act badly and not simply an leader leaflet of the week
2025-04-26 08:21:38
It learned to have that confidence Thatcher rtpicallu of my cousin and also they rrained Ressit
2025-04-26 08:22:04
Now they are at 2.5 flash (thinking)
2025-04-26 08:22:35
But Google has still a lot off to do
Paultimate
2025-04-26 10:13:49
This is what happens when you try and compress better than jxl using only the human mind in 2025.
Demiurge
MSLP Is this the original fab spreading confusion again, or someone else roleplaying spreading fab confusion?
2025-04-27 02:06:39
It's not roleplaying. I don't think anyone else can replicate this.
2025-04-27 02:08:41
Only the real fab can be this confusing and confabulous.
Fab
Paultimate This is what happens when you try and compress better than jxl using only the human mind in 2025.
2025-04-27 04:59:23
https://www.instagram.com/p/DIv_JttT84A/?igsh=azhzazl6bTE2ZzEw
2025-04-27 04:59:36
I'm a slave to AOMEDIA
2025-04-27 04:59:50
Or at least ive done that for two years
CrushedAsian255
Huh
2025-04-27 05:08:31
Here's my best interpretation/translation of their messages with cultural context and logical connections: **Corrected Message:** *"I'm having a discussion with my cousin about AOMedia (Alliance for Open Media) issues. I want to use websites and services like Gemini (the privacy-focused protocol) freely with my preferred tools. I've worked in tech for 3 years and have 21 years of experience in the music industry. Now someone young from the Catholic community (or possibly a moderator using 'Catholic' metaphorically to mean strict) is telling me to shut up about this, and I can't accept being dismissed like this."* **Key Clarifications:** 1. **"Cosin"** โ†’ Likely "cousin" (Italian: *cugino*) 2. **"aomedia"** โ†’ AOMedia, the consortium behind AV1/JPEG XL 3. **"Gemini"** โ†’ Likely Gemini protocol, not the AI 4. **"Catholic minor"** โ†’ Either: - Literal: A young Catholic community member - Metaphorical: A strict moderator (using "Catholic" as Italian slang for rigid authority) 5. **"Mind don't accept the refuse"** โ†’ Rejecting being silenced (*rifiuto* = refusal/rejection in Italian) -# DeepSeek-R1
Fab
2025-04-27 06:31:37
Forget about temptation island and Mediaset and September
2025-04-27 06:31:56
But anyway Ive been defended
CrushedAsian255 Here's my best interpretation/translation of their messages with cultural context and logical connections: **Corrected Message:** *"I'm having a discussion with my cousin about AOMedia (Alliance for Open Media) issues. I want to use websites and services like Gemini (the privacy-focused protocol) freely with my preferred tools. I've worked in tech for 3 years and have 21 years of experience in the music industry. Now someone young from the Catholic community (or possibly a moderator using 'Catholic' metaphorically to mean strict) is telling me to shut up about this, and I can't accept being dismissed like this."* **Key Clarifications:** 1. **"Cosin"** โ†’ Likely "cousin" (Italian: *cugino*) 2. **"aomedia"** โ†’ AOMedia, the consortium behind AV1/JPEG XL 3. **"Gemini"** โ†’ Likely Gemini protocol, not the AI 4. **"Catholic minor"** โ†’ Either: - Literal: A young Catholic community member - Metaphorical: A strict moderator (using "Catholic" as Italian slang for rigid authority) 5. **"Mind don't accept the refuse"** โ†’ Rejecting being silenced (*rifiuto* = refusal/rejection in Italian) -# DeepSeek-R1
2025-04-27 06:33:03
How to do this with gemini flash 2.0 thinking or Deep seek on abdroid 15 and Windows can you share a tutorial on <#806898911091753051>
Demiurge
2025-04-27 07:16:25
No amount of AI processing will make fab's confab comprehensible
2025-04-28 04:32:55
XYB uses defined, constant color primaries? But it can represent out-of-gamut colors with values beyond 0.0-1.0?
2025-04-28 04:33:26
What are the color primaries?
Tirr
2025-04-28 05:17:40
XYB doesn't have primaries because it's not an RGB color space
2025-04-28 05:18:32
iirc it's derived from LMS
_wb_
2025-04-28 05:51:57
XYB has no nominal range, the range just gets larger when gamut or dynamic range gets larger.
Demiurge
2025-04-28 06:12:17
Really? I thought the nominal range was the whole basis for the perceptual model.
_wb_
2025-04-28 08:56:41
it just uses floats, Y is more or less 0..1 but X is signed and close to zero, while B is more or less 0..1 but in practice Y is always subtracted from it so it also becomes signed.
2025-04-28 08:57:30
https://github.com/cloudinary/ssimulacra2/blob/main/src/ssimulacra2.cc#L197 this is what I do in ssimulacra2 to turn XYB into something more or less 0..1
2025-04-28 08:58:36
jpegli when using XYB does something similar with an XYB icc profile that makes the range more or less 0..1
Demiurge
2025-04-28 09:59:58
Well, I just wonder, if the perceptual model is able to generalize well to different primary colors...
2025-04-28 10:00:42
I would imagine probably so.
2025-04-28 10:01:08
So when you create an XYB JPEG with jpegli, the embedded color profile has different primaries depending on the source image?
CrushedAsian255
Demiurge So when you create an XYB JPEG with jpegli, the embedded color profile has different primaries depending on the source image?
2025-04-28 10:30:03
So each image has primaries set to encompass only the colours used in that specific image?
spider-mario
2025-04-28 10:56:19
as far as Iโ€™m aware, we havenโ€™t done that for jpegli (although I had plans to maybe look into that)
2025-04-28 10:56:29
iirc, we just use the XYB range that corresponds to sRGB
Demiurge
2025-04-28 10:59:53
what happens if I use `cjpegli --xyb` to encode an image with an attached color profile with color primaries beyond the sRGB primaries?
2025-04-28 11:01:06
Like Adobe RGB. Can I encode an Adobe RGB source image with cjpegli --xyb and the attached XYB profile will have the primaries for Adobe RGB?
Fab
2025-04-28 11:01:11
Vp9 encoder based on subliminal Jon Sneyers
Demiurge
2025-04-28 11:01:32
subliminal Jon Sneyers ๐Ÿ˜‚
CrushedAsian255
2025-04-28 11:06:43
`1153 kbps`
2025-04-28 11:07:02
also didn't know you could vp9 in mp4 container
Fab
CrushedAsian255 also didn't know you could vp9 in mp4 container
2025-04-28 11:07:18
Discord re encodes
2025-04-28 11:11:43
2025-04-28 11:12:03
Magically I started to understand paper
2025-04-28 11:12:20
Svt av1 psy 3.0.2 in fb vp9 and av1
2025-04-28 12:07:36
Much better now
2025-04-28 12:07:57
Sorry that isn't related to image compression in particolar
2025-04-28 12:08:13
Is video compression in meta
2025-04-28 12:20:03
I think I have succeded and finally jg a bit more less honest in off topic
CrushedAsian255
Fab Sorry that isn't related to image compression in particolar
2025-04-28 01:04:17
This should probably go in <#805176455658733570>
_wb_
spider-mario iirc, we just use the XYB range that corresponds to sRGB
2025-04-28 01:13:53
You don't need a huge amount of extra room in X and B to cover the P3 gamut, which probably suffices in practice since few displays can do wider gamut than that...
Demiurge Well, I just wonder, if the perceptual model is able to generalize well to different primary colors...
2025-04-28 01:15:39
XYB is already generalized to any primaries, since it is an absolute space that covers all visible colors (including gamuts as wide as Rec2020 and beyond, and dynamic range as large as PQ and beyond)
2025-04-28 02:39:59
here are slices of X,B for four values of Y, showing colors within the Rec2020 gamut and with a white border indicating colors within the sRGB gamut
2025-04-28 03:02:00
Here is a better visualization, zooming out a bit so all of Rec2020 fits
2025-04-28 04:23:46
tweaked it further, I might turn it into a figure for the big jxl paper now
2025-04-28 04:24:07
what is shown is Rec2020, yellow is P3, red is sRGB
2025-04-28 07:57:43
final version I'm gonna add to the paper
Demiurge
2025-04-29 12:35:22
I'm kind of confused about what happens to an input image with an attached color profile after cjpegli turns it into an xyb jpeg and creates an xyb profile... Is it always the same xyb profile or is it based off the input profile?
Traneptora
Demiurge I'm kind of confused about what happens to an input image with an attached color profile after cjpegli turns it into an xyb jpeg and creates an xyb profile... Is it always the same xyb profile or is it based off the input profile?
2025-04-29 01:29:38
cjxl and cjpegli use a CMS to convert the image into XYB
2025-04-29 01:30:17
cjxl encodes the original profile as informative. cjpegli just attaches an XYB profile.
2025-04-29 01:31:06
Since the pixels described by xyb jpeg are described by an XYB profile, the input doesn't really matter
Demiurge
2025-04-29 03:23:28
So cjpegli always attaches the same XYB profile regardless of the input profile. And the XYB profile does not have color primaries, or a nominal range...
2025-04-29 03:24:15
I thought all ICC profile has to define primaries
_wb_
2025-04-29 05:47:25
IIRC, ICC profiles define a mapping between your color space and either CIE XYZ or CIE Lab. Defining RGB primaries is one way to do that. The ICC version of XYB does have a nominal range, all components are scaled so they fit in a 0..1 range.
CrushedAsian255
_wb_ IIRC, ICC profiles define a mapping between your color space and either CIE XYZ or CIE Lab. Defining RGB primaries is one way to do that. The ICC version of XYB does have a nominal range, all components are scaled so they fit in a 0..1 range.
2025-04-29 07:34:46
What about JXL XYB?
2025-04-29 07:34:55
Does it not care about primaries?
_wb_
2025-04-29 08:40:41
The jxl encoder takes RGB input and cares about primaries when converting it to XYB. But XYB is always the same space, you just end up using different subvolumes of it depending on what the primaries of the input image are (and the actual pixel values)
Demiurge
2025-04-29 10:20:04
I think he means how does the xyb icc define a mapping to ciexyz or cielab
_wb_
2025-04-29 10:31:50
It uses an `mAB` tag
2025-04-29 10:35:05
this one
2025-04-29 10:37:24
Here's the code that produces that key part of the xyb icc profile: https://github.com/google/jpegli/blob/main/lib/cms/jxl_cms_internal.h#L599
2025-04-29 10:39:04
it's basically a pretty good approximation of XYB, rescaled so the XYB components fit in the 0..1 range which is needed both for ICC profiles in general and for the way JPEG works (it also assumes that all components are in 0..1 range)
Comexs
2025-04-29 01:19:52
How can I verify that `cjxl -d 0` on a png is lossless. When I test it on the original jpeg and the output of djxl from a cjxl output the sha256sums are the same but with png isn't the same most likely because of djxl png encoder since djxl output png is bigger than the original png. what can I do to test it. I have also used (Image Magick) `compare input.png input.jxl -compose src output_compare.png` to compare images with cjxl output and the djxl output too the original png and they came out with no red pixels. Another question i had is my problem with using compare from Image Magick. When I use it on a jpeg and the cjxl output i see red pixels everywhere but if I try it on jpeg and the djxl output from the cjxl output from before it. I don't see any red pixels and as i said before they share the same sha256sums and when i compare jxl and og jpeg in a image viewer on those red pixel areas I don't see anything different.
RaveSteel
2025-04-29 01:32:11
Either use ssimulacra2 `ssimulacra2 orig.png distorted.png` or ImageMagick's identify `/usr/bin/identify -format "%m %#\n" IMG1 IMG2`
Comexs
2025-04-29 01:32:33
Thanks I will check them out
jonnyawsom3
Comexs How can I verify that `cjxl -d 0` on a png is lossless. When I test it on the original jpeg and the output of djxl from a cjxl output the sha256sums are the same but with png isn't the same most likely because of djxl png encoder since djxl output png is bigger than the original png. what can I do to test it. I have also used (Image Magick) `compare input.png input.jxl -compose src output_compare.png` to compare images with cjxl output and the djxl output too the original png and they came out with no red pixels. Another question i had is my problem with using compare from Image Magick. When I use it on a jpeg and the cjxl output i see red pixels everywhere but if I try it on jpeg and the djxl output from the cjxl output from before it. I don't see any red pixels and as i said before they share the same sha256sums and when i compare jxl and og jpeg in a image viewer on those red pixel areas I don't see anything different.
2025-04-29 02:01:15
The reason for the difference between the jpeg and the JXL is that the JXL uses higher precision maths to squeeze a bit more quality out of the same data, but using djxl always returns the same jpeg so it can still be lossless too
Comexs
The reason for the difference between the jpeg and the JXL is that the JXL uses higher precision maths to squeeze a bit more quality out of the same data, but using djxl always returns the same jpeg so it can still be lossless too
2025-04-29 02:04:08
I have see it but only on some images. I guess i can't see it on the images on this test. is the same for using `identify -format "%m %#\n"`? why is "For lossless sources, -d 1 is the default." why is it -d 1 instead of -d 0? and thanks for the useful info.
jonnyawsom3
2025-04-29 02:05:58
The logic is if you have a lossless image, it can be made lossy. If the image is already lossy (JPEG, GIF), store it as lossless to avoid further loss
DZgas ะ–
2025-05-04 12:19:13
Is anyone developing an alternative jpeg xl encoder?
Orum
2025-05-04 12:29:12
IIRC there is a rust-based one in development?
2025-05-04 12:29:18
or maybe that's just a decoder, I don't recall
2025-05-04 12:30:18
ah yeah, decoder only: https://github.com/tirr-c/jxl-oxide
drhead
2025-05-04 01:28:57
Have any efforts been made towards a CUDA-accelerated encoder/decoder for JXL? I don't think I have quite enough CUDA experience to do it easily, but if someone has a rough idea of what parts of the encoding/decoding process can and cannot be parallelized easily and what parts would require CPU sync I would appreciate knowing that.
Orum
2025-05-04 01:30:09
CUDA ๐Ÿคฎ
drhead
2025-05-04 01:31:54
I think that existing pipelines for most CUDA accelerated image decoders do have some CPU operations at the beginning and end (with the exception of their NVJPG hardware decoders), so I wouldn't rule out a useful implementation being possible on that basis.
username
drhead Have any efforts been made towards a CUDA-accelerated encoder/decoder for JXL? I don't think I have quite enough CUDA experience to do it easily, but if someone has a rough idea of what parts of the encoding/decoding process can and cannot be parallelized easily and what parts would require CPU sync I would appreciate knowing that.
2025-05-04 01:33:36
iirc there are a few parts of JXL that don't translate well or at all to GPU processing I wouldn't know which parts exactly but I remember there being some discussions in the past related to this
CrushedAsian255
2025-05-04 01:35:39
ANS and Modular MA trees aren't great for gpu
2025-05-04 01:36:08
but things like RCT, Squeeze, EPF, Gaborish might be able to
drhead
2025-05-04 01:38:45
I mean this is what nvidia describes their software nvJPEG pipeline as being like. So really it would depend on where those operations are. If it's just at the beginning or end it's practically a non issue, if we're doing it several times in the middle then yeah that'd be extremely bad
CrushedAsian255 ANS and Modular MA trees aren't great for gpu
2025-05-04 01:52:47
https://github.com/facebookresearch/dietgpu well it looks like Facebook managed to get ANS working, so that may not be a problem
Orum
drhead I mean this is what nvidia describes their software nvJPEG pipeline as being like. So really it would depend on where those operations are. If it's just at the beginning or end it's practically a non issue, if we're doing it several times in the middle then yeah that'd be extremely bad
2025-05-04 01:58:45
imagine considering a "BMP" to be decoded <:KekDog:805390049033191445>
drhead
Orum imagine considering a "BMP" to be decoded <:KekDog:805390049033191445>
2025-05-04 01:59:41
they're probably just referring to a uint8 image tensor since that's what you'd have in practice
Orum
2025-05-04 02:00:04
in modern times, probably, but it's still a nightmare of a format
CrushedAsian255
2025-05-04 02:00:20
`.ppm` supremacy
Quackdoc
2025-05-04 02:01:58
pfm double supremacy
Jarek Duda
drhead https://github.com/facebookresearch/dietgpu well it looks like Facebook managed to get ANS working, so that may not be a problem
2025-05-04 02:16:21
also https://developer.nvidia.com/nvcomp - in theory both with dietgpu can exceed 100GB/s for rANS on GPU, however, it requires lots of independent data streams - like for different contexts ...
CrushedAsian255
2025-05-04 02:35:32
so its not decompressing 1 ans stream its allowing many ans streams to be decoded in parallel?
drhead
CrushedAsian255 so its not decompressing 1 ans stream its allowing many ans streams to be decoded in parallel?
2025-05-04 02:44:32
> // FIXME: We have no idea how large the decompression job is, as the > // relevant information is on the device. > // Just launch a grid that is sufficiently large enough to saturate the GPU; > // blocks will exit if there isn't enough work, or will loop if there is > // more work. We aim for a grid >4x larger than what the device can sustain, > // to help cover up tail effects and unequal provisioning across the batch Yeah. And as evidenced by this comment it isn't pretty, but it does work.
Jarek Duda
2025-05-04 03:54:34
the fastest ~2GB/s/CPU core SIMD rANS decoder https://github.com/jkbonfield/rans_static needs 32 independent data streams: 8 in vectorization times 4 in interleaving ... in GPU it is probably in hundreds or more, but I don't know the details.
CrushedAsian255
2025-05-04 04:25:17
One issue is I'm pretty sure the JPEG XL entropy coding multiplexes all the rANS streams together so you cannot easily "split" the bitstream into individual rANS contexts
Jarek Duda
2025-05-04 05:17:15
sure I understand, but maybe it could be overcomed e.g. like in above nvJPEG decoder diagram: start with blind entropy decoding into buffers of all e.g. separating contexts (needs some signaling of lengths), then further stages take symbols from such corresponding buffers of decoded?
Tirr
2025-05-04 05:35:03
it would be okay with plain JPEG but JXL changes context based on adjacent image samples within single ANS stream, so it can't be separated easily
Jarek Duda
2025-05-04 05:58:24
if same contexts still correspond to same distributions, you can blindly use such buffers of decoded symbols
Tirr
2025-05-04 06:04:10
in my understanding, within single stream, symbols decoded in order of distribution, say A-A-B, are different from those decoded in A-B-A order
Jarek Duda
2025-05-04 06:06:25
definitely, it needs fixing decoding order
CrushedAsian255
2025-05-04 06:06:42
im pretty sure the way JXL works is an entire set of clustered distributions has to be read sequentially
Tirr
2025-05-04 06:08:58
yeah, JXL can change to different distribution within a stream in data dependent way
Jarek Duda
2025-05-04 06:09:01
if these distributions are finally fixed for the image, still their symbols can be separately entropy decoded, and then used from buffer (maintaining order)
2025-05-04 06:10:59
if I properly understand, this MANIAC tree chooses context, then for each context histograms are calculated - if they are fixed, can be all initially entropy decoded
Tirr
2025-05-04 06:16:45
ah maybe I got what you mean, but I'd say it's no different than decoding image normally, because it's final decoded image sample that decides next distribution, so we still need to decode actual image
2025-05-04 06:16:56
or maybe I'm still not getting it
jonnyawsom3
drhead Have any efforts been made towards a CUDA-accelerated encoder/decoder for JXL? I don't think I have quite enough CUDA experience to do it easily, but if someone has a rough idea of what parts of the encoding/decoding process can and cannot be parallelized easily and what parts would require CPU sync I would appreciate knowing that.
2025-05-04 06:17:30
Maybe not entirely related, but I did stumble across this a few months ago. AMD made hardware acceleration components for JPEG XL encoding https://docs.amd.com/r/en-US/Vitis_Libraries/codec/guide_L2/kernels/jxlEnc.html_0
2025-05-04 06:18:49
Jarek Duda
Tirr ah maybe I got what you mean, but I'd say it's no different than decoding image normally, because it's final decoded image sample that decides next distribution, so we still need to decode actual image
2025-05-04 06:19:00
so do probability distributions for given context from the tree vary through the decoding?
_wb_
2025-05-04 06:20:45
No
2025-05-04 06:21:04
And after clustering the number of distributions is spec limited to 255
2025-05-04 06:21:44
But the ANS decode is not usually the bottleneck anyway, figuring out the right context is
Jarek Duda
2025-05-04 06:21:47
so you can fix them, write in the beginning of file, then fast entropy decode all the symbols into buffers - to be used in fixed order
_wb_ But the ANS decode is not usually the bottleneck anyway, figuring out the right context is
2025-05-04 06:22:21
yes, I believe so, the decision tree seems the bottleneck
_wb_
2025-05-04 06:23:49
Depending on how complicated it is; simple ones can be translated into branchless lookup tables
Tirr
2025-05-04 06:24:27
or maybe even a single distribution
Jarek Duda
_wb_ Depending on how complicated it is; simple ones can be translated into branchless lookup tables
2025-05-04 06:26:28
it could be speedup by splitting image into regions, each using different shallower trees ...
2025-05-04 06:29:32
e.g. k-means clustering can be used in space of models/trees for that ( https://arxiv.org/pdf/2201.05028 ): assign each fragment to the best model, then build model for each cluster, and repeat a few times ...
Traneptora
2025-05-04 08:04:58
As far as I understand there's only one HF histogram set per frame
2025-05-04 08:05:16
You can't have one per LF Group
2025-05-04 08:05:36
without using separate frames per LF Group
DZgas ะ–
2025-05-04 08:26:21
so that's why no one else has written alternative encoders :JXL:
jonnyawsom3
DZgas ะ– so that's why no one else has written alternative encoders :JXL:
2025-05-04 08:32:58
https://github.com/Traneptora/hydrium/
Orum ah yeah, decoder only: https://github.com/tirr-c/jxl-oxide
2025-05-04 08:33:38
Also this, but also just a decoder https://github.com/libjxl/jxl-rs
Orum
2025-05-04 08:34:42
yeah, sadly only one encoder for now
username
2025-05-04 08:35:49
there is that one lossless zune rust encoder or whatever it's called but afaik it's just a port of some code from libjxl to rust
Tirr
2025-05-04 08:37:41
zune-image encoder is a port of libjxl lossless e1
jonnyawsom3
Orum yeah, sadly only one encoder for now
2025-05-04 09:17:32
Hydrium is an encoder
Orum
2025-05-04 09:31:17
> At the moment, it is a work-in-progress and it is still in the early stages of development. The API and CLI are unstable and subject to change without notice. not quite sure it qualifies yet...
jonnyawsom3
2025-05-04 10:19:00
I mean hey, libjxl isn't 1.0 either, you just said encoder ;P
Traneptora
Orum > At the moment, it is a work-in-progress and it is still in the early stages of development. The API and CLI are unstable and subject to change without notice. not quite sure it qualifies yet...
2025-05-04 10:27:56
I still got work to do but it definitely works
2025-05-04 10:28:28
Something I'm considering doing is adding the ability to multithread the encoder for API clients
2025-05-04 10:28:58
the library itself won't have any threading support but clients will be able to thread with it safely
DZgas ะ–
2025-05-04 10:50:39
<:Thonk:805904896879493180>
Traneptora
2025-05-04 10:51:17
currently working on reducing memory consumption though
2025-05-04 10:51:23
in one-frame mode
2025-05-04 10:51:40
I find that small tiles, while compliant, are somewhat impractical as they take a very long time for libjxl to decode
2025-05-04 10:53:10
my idea is that I can use one HF Preset per LF Group, and cluster them so up to 256 LF groups lets me buffer only one set of symbols at a time
2025-05-04 10:53:26
the problem is that JPEG XL has one entropy stream for the whole frame
2025-05-04 10:53:55
if I can separate out the LF Groups via clustering, then I can remember the histograms but discard the un-encoded symbols after I encode them
2025-05-04 10:54:07
rather than buffer all the symbols to calculate the correct histograms
2025-05-04 10:54:36
this works provided I have fewer than 256 LF Groups
2025-05-04 10:54:56
if I have more, I can just base each cluster on `lf_id & 0xFF`
jonnyawsom3
2025-05-04 10:56:18
I've mentioned it before, but libjxl only decodes a single frame at a time currently, so using small tiles means singlethreaded decoding with the overhead of storing and then merging all the frames/layers
Traneptora
2025-05-04 10:56:47
yea, that's why I'm trying to improve upon the one-frame method
_wb_
2025-05-04 12:29:56
256 LF groups is one gigapixel, usually not a real limitation. I would cluster by `lf_id >> 1` (or larger shifts) for larger images, so neighboring LF groups get the same distribution since their content is probably more similar than groups one gigapixel away from one another...
CrushedAsian255
_wb_ 256 LF groups is one gigapixel, usually not a real limitation. I would cluster by `lf_id >> 1` (or larger shifts) for larger images, so neighboring LF groups get the same distribution since their content is probably more similar than groups one gigapixel away from one another...
2025-05-04 01:59:39
is a gigapixel a lot of pixels?
_wb_
2025-05-04 02:00:09
1000 megapixels ๐Ÿ™‚
CrushedAsian255
2025-05-04 02:00:18
hmm 31623 x 31623
_wb_
2025-05-04 02:13:37
it's not like bigger than that would not be handled, it would just have potentially slightly worse compression
Traneptora
_wb_ 256 LF groups is one gigapixel, usually not a real limitation. I would cluster by `lf_id >> 1` (or larger shifts) for larger images, so neighboring LF groups get the same distribution since their content is probably more similar than groups one gigapixel away from one another...
2025-05-05 01:43:30
may be worth just seeing how much im overcounted by using ceildiv, and then dividing by that number
2025-05-05 01:44:01
so <=256 get lfid / 1, <=512 would get lfid / 2
2025-05-05 01:44:04
etc.
2025-05-05 01:44:31
Ive currently implemented this locally but it has a notable drop in density
2025-05-05 01:45:30
compared to my pre-existing cluster map
2025-05-05 01:45:54
I'm wondering how worth it it is to separate out nonzero contextd from the rest
2025-05-05 01:46:08
I may compromise and do those separately
_wb_ 256 LF groups is one gigapixel, usually not a real limitation. I would cluster by `lf_id >> 1` (or larger shifts) for larger images, so neighboring LF groups get the same distribution since their content is probably more similar than groups one gigapixel away from one another...
2025-05-05 03:33:41
Isn't it 268 MP
2025-05-05 03:34:05
(2048x8)^2 is 16384^2
Tirr
2025-05-05 03:36:12
one LF group has 4 megapixels (base 2) because it's 2048x2048
Traneptora
2025-05-05 03:36:19
Either way, if I can cluster by LF group, especially by adjacent LF groups, then I can discard the un-encoded symbols
2025-05-05 03:36:29
so 256 MiP <:KEK:1283989161111715913>
Tirr
2025-05-05 03:37:07
uh then 256 LF groups are 1024 MiP (4x256)
Traneptora
2025-05-05 03:37:19
what am I missing then
2025-05-05 03:38:00
(2048x8)^2 = 16384^2 right
2025-05-05 03:38:12
oh
2025-05-05 03:38:18
8^2 is 64
Tirr
2025-05-05 03:38:18
it's 16
Traneptora
2025-05-05 03:38:25
im smart
2025-05-05 03:38:29
16
2025-05-05 03:38:34
im tired
2025-05-05 03:38:56
either way
2025-05-05 03:39:35
atm in order to compute histograms I need to keep the symbols buffered
2025-05-05 03:40:28
since you need all the symbols to compute freqs
2025-05-05 03:40:54
and need freqs to write the symbols as stateflushes
2025-05-05 03:42:28
if I can compute the histograms by cluster, I can buffer much less
2025-05-05 03:42:44
by using HF presets
CrushedAsian255
Traneptora since you need all the symbols to compute freqs
2025-05-05 06:23:18
If the frequencies are inaccuracies it cause data loss or just inefficiencies?
Traneptora
2025-05-05 11:31:33
imefficient
CrushedAsian255
Traneptora imefficient
2025-05-05 11:33:20
If you just set each token to equal probabilities is that equivilent to just writing them one-by-one?
Traneptora
CrushedAsian255 If you just set each token to equal probabilities is that equivilent to just writing them one-by-one?
2025-05-05 12:44:07
afaik yes
Orum
2025-05-08 05:27:09
man I wish I could get some sort of dark bias on cjxl
2025-05-08 05:27:54
at -d 1, bright, higher contrast areas of the image are indistinguishable from the original, but dark, lower contrast areas are obviously different
A homosapien
Orum man I wish I could get some sort of dark bias on cjxl
2025-05-08 05:38:37
`--intensity_target 1000`
Orum
2025-05-08 05:49:52
yeah, that fucks up decode/display though
2025-05-08 05:50:24
I used to use that though, because some image viewers don't take it into account and it works fine there, but that's little consolation
_wb_
Orum at -d 1, bright, higher contrast areas of the image are indistinguishable from the original, but dark, lower contrast areas are obviously different
2025-05-08 11:31:33
Are you sure it's not some sRGB vs pure-gamma issue? That's something that can end up causing differences in the darks since many viewers misinterpret pure-gamma PNG files as being sRGB.
Orum
2025-05-08 11:33:09
๐Ÿ˜• how would I know? I assume `-d 0` would not look lossless if that was the case
2025-05-08 11:34:08
I'm not even sure what you mean by "pure gamma"
_wb_
2025-05-08 11:34:11
that depends on how you view the jxl images
2025-05-08 11:35:26
I mean a PNG file without icc profile and without the sRGB chunk but with just the cHRM and gAMA chunks
Orum
2025-05-08 11:35:30
I'm normally viewing them in nomacs, and while I know that's *far* from perfect when it comes to viewing images, these are pretty vanilla settings (i.e. sRGB, SDR, etc)
jonnyawsom3
2025-05-08 11:35:48
libjxl seems to pass the gamma value to the viewer in a similar way to PNG. Lossless looked fine for me but `-d 0.01` had very different blacks. Likely due to requested colorspace vs keep_original_colorspace
Orum
_wb_ I mean a PNG file without icc profile and without the sRGB chunk but with just the cHRM and gAMA chunks
2025-05-08 11:36:33
Hmm, what would tell me if that was the case? `exiv2`?
_wb_
2025-05-08 11:38:15
yes, or `identify -verbose`, or `exiftool`, or `pngchunks` or whatever you have lying around
2025-05-08 11:38:24
or you can use `jxlinfo` on the jxl
Orum
2025-05-08 11:39:57
alright, so I assume if imagemagick says `Colorspace: sRGB` (on the PNG) that it has the ICC profile chunk?
2025-05-08 11:41:08
`jxlinfo` on a (losslessly) coded image says: `Color space: RGB, D65, sRGB primaries, sRGB transfer function, rendering intent: Relative`
jonnyawsom3
2025-05-08 11:41:35
I've been using PNGTweak, which is a bit outdated (No EXIF chunk support) but also lets me delete incorrect gAMA chunks. Though that doesn't look like it has Gamma
_wb_
2025-05-08 11:41:57
actually imagemagick is not a very good tool to see what's actually in the PNG file
2025-05-08 11:42:39
anyway that looks good, if it has `sRGB transfer function` then probably this gAMA vs sRGB issue is not causing the difference
2025-05-08 11:44:21
if you could share some example image (or a crop of it) that shows the quality issue, it would probably help. The goal is still to make d1 visually lossless for all (areas of) images...
Orum
2025-05-08 11:44:41
yeah, let me crop it down as it's a massive image RN...
2025-05-08 11:49:17
here it is, losslessly compressed
2025-05-08 11:49:51
at d1 (on v0.11.1) I notice a loss of detail on the dark side, while I see no changes on the right side
2025-05-08 11:51:23
I suppose if I really pixel peep I can see differences on the bright side, but they're not nearly as obvious
spider-mario
_wb_ actually imagemagick is not a very good tool to see what's actually in the PNG file
2025-05-08 11:57:52
yeah, Iย think `identify -verbose` still lies about it and makes up an sRGB chunk even when itโ€™s not there
_wb_
2025-05-08 12:17:37
thanks for the example, I agree the smoothing on the left is more noticeable than on the right
2025-05-08 12:19:48
I think we're being too aggressive on the AC of the B component. <@532010383041363969> what's your opinion?
drhead
2025-05-08 01:40:42
So if I were to attempt to make my own decoder/encoder implementation, where would I want to start? At least for what I need it for, it would probably actually be fine to have only a subset of functionality implemented (where the encoder can produce valid JXL files and the decoder can decode those files but not necessarily arbitrary JXL files, I could just have those fall back to libjxl if needed). The code for libjxl is certainly a lot to take in at once (and it doesn't help that it has been a while since I touched C++ but I'm quite used to learning as I go), but the best hint I can figure out from the documentation is that it might be easier to start by trying to implement the lowest effort level for each to get a bare minimum encoder and a decoder that will decode outputs of that encoder, then build up from there?
_wb_
2025-05-08 01:58:56
are you interested in lossless or lossy? For just lossless, it's not too hard to make a simple encoder...
jonnyawsom3
2025-05-08 02:00:15
VarDCT/regular lossy uses Modular for the DC 1:8 frame, so it may be easiest to only make a minimal modular en/decoder. You can also make it lossy by quantizing residuals after implementing Squeeze, like `cjxl -d 1 -m 1`. Huffman can also be used instead of ANS IIRC, for easier implementation
_wb_
2025-05-08 02:06:22
something like fast_lossless but without all of the SIMD stuff that complicates everything
2025-05-08 02:11:54
does anyone feel like making a simple_lossless? ๐Ÿ™‚
Demiurge
2025-05-08 04:58:48
How does the rate/distortion curve of libjxl-tiny compare to the main libjxl library I wonder...
_wb_
2025-05-08 05:10:14
For high distance, libjxl is better. At low distance the gap gets smaller. At camera qualities, they're very close.
drhead
_wb_ are you interested in lossless or lossy? For just lossless, it's not too hard to make a simple encoder...
2025-05-08 06:26:28
Primarily lossless, probably do want lossy down the line but lossless is priority
A homosapien
Orum at d1 (on v0.11.1) I notice a loss of detail on the dark side, while I see no changes on the right side
2025-05-08 10:13:31
Also, it looks like it's affected by the color desaturation issue we found a while ago
2025-05-08 10:22:06
It does look much sharper on v0.8 and eariler
Demiurge
2025-05-09 08:05:22
These three recurring problems (blurry shadows, general desaturation and chroma ringing artifacts) keep biting libjxl in the side... I wonder if libjxl-tiny is affected by these problems too?
2025-05-09 08:14:16
Those 3 issues are serious enough to make or break most images. Especially the crazy chroma ringing patterns
2025-05-09 08:16:26
I hope someone does an investigation into what causes them to appear... I don't think libjxl is in a position where it can afford to sit on its laurels without any major RDO changes in years.
Orum
2025-05-09 08:17:55
hard to say if the desaturation is simply a side effect of the blurring
Demiurge
2025-05-09 08:18:35
Even though the underlying quantization techniques are very impressive compared to other codecs, the impressive advancements are undermined by simple or trivial mistakes/bugs like that
_wb_
drhead Primarily lossless, probably do want lossy down the line but lossless is priority
2025-05-09 09:18:15
I just created this, perhaps it can be useful as a starting point: https://github.com/libjxl/simple-lossless-encoder
jonnyawsom3
2025-05-09 09:28:07
Like I mentioned before, wouldn't it be less work to implement Squeeze and quantization than VarDCT on top of that? Obviously quality is another matter but it should be relatively straightforward to make *a* lossy encoder
_wb_
2025-05-09 09:47:19
Yeah, it shouldn't be too hard to turn it into a lossy modular encoder. Even without Squeeze, you could just quantize predictor residuals and get something lossy that is not great but maybe good enough for some applications.
drhead
_wb_ I just created this, perhaps it can be useful as a starting point: https://github.com/libjxl/simple-lossless-encoder
2025-05-09 10:25:31
Does look useful, thanks!
Lucius
_wb_ I just created this, perhaps it can be useful as a starting point: https://github.com/libjxl/simple-lossless-encoder
2025-05-09 10:11:45
Thank you! Compiled nicely in Visual Studio, only needed to #define __builtin_clz std::countl_zero (c++20)
Quackdoc
2025-05-10 03:24:38
is the output Information that cjxl prints to console explained anywhere in app or github? was asked by a friend what the output meant of some of the stuff and it got me curious
Jyrki Alakuijala
_wb_ I think we're being too aggressive on the AC of the B component. <@532010383041363969> what's your opinion?
2025-05-10 01:30:49
probably you are right
_wb_ I think we're being too aggressive on the AC of the B component. <@532010383041363969> what's your opinion?
2025-05-10 01:43:45
S receptors don't see blue AC much, but L and M receptors see it when they are not masked by R and G signals
jonnyawsom3
2025-05-10 02:26:58
At least for XYB, a rather narrow range of B is required for saturated yellows, so the lower quality causes it to drift and lower the saturation, as far as I can tell
New Player ๐Ÿ‡ฉ๐Ÿ‡ช
2025-05-10 09:33:22
i need information about which distance values to choose
A homosapien
New Player ๐Ÿ‡ฉ๐Ÿ‡ช i need information about which distance values to choose
2025-05-10 09:37:15
These are my general guidelines. Professional workflow = 0.5 High quality = 1 (default) Medium quality = 2 Low quality = 3 Very low quality preview/thumbnail = 4
2025-05-10 09:38:54
Using distances higher than 2.5 for web images is not recommended in my opinion
jonnyawsom3
2025-05-10 09:48:47
0.3 is "Looks like the original zoomed in 5x" 1 is "Looks like the original without zooming in" 3 is "Good enough for the internet" Very roughly, though anything higher isn't recommended due to lack of tuning
Kupitman
A homosapien These are my general guidelines. Professional workflow = 0.5 High quality = 1 (default) Medium quality = 2 Low quality = 3 Very low quality preview/thumbnail = 4
2025-05-10 09:49:46
What
2025-05-10 09:49:57
Why you use lossy
A homosapien
2025-05-10 09:52:06
Ask new player not me ๐Ÿ˜…
2025-05-10 09:52:48
I know the guidelines but I don't use lossy, I have the storage space to afford lossless.
jonnyawsom3
2025-05-10 09:54:21
I use lossy to test lossy, but until we're done fixing bugs and improving ratios, I'm sticking with the originals
AccessViolation_
2025-05-10 10:20:06
for photographic images, nearly lossless (like quality 98 or 99) is still *so much smaller* than lossless, and even when pixel peeping you're unlikely to spot any meaningful difference. you'll get very slight, often imperceptible changes in pixel values and I don't see value in retaining those. it's not like my camera captured the scene as it truly was anyway: taking a picture is a already a lossy process, I don't see value in preserving the inaccuracies from my camera, it's worth it to shuffle those inaccuracies around a bit and get a massive reduction in file size
2025-05-10 10:21:51
if I did want to capture the exact data from my camera for whatever reason, that's a good place for lossless JXL. like in raw files
A homosapien
2025-05-10 10:23:21
Most of my image files are already jpegs or non-photographic. So I benefit the most from lossless
2025-05-10 10:23:31
I do have several raws lying around that I would like to compress one day
jonnyawsom3
2025-05-10 10:35:30
The main blocker for RAWs in my case is libraw not making a release for 2 years, and not even knowing if it'll support JPEG XL compression because of Adobe's funky licencing of their SDK
๐•ฐ๐–’๐–—๐–Š
2025-05-11 07:38:46
Most RAW formats are proprietary and you need their proprietary tools (most of the time Windows exclusive) to process them properly. They also need color mastering/profiling... So, unless you are a professional dealing with photographs, RAW images probably mean nothing?
jonnyawsom3
2025-05-11 08:30:27
In my case I mean Bayer DNG
Orum
2025-05-11 09:04:37
there is a lot more than just 1 bayer pattern
2025-05-11 09:05:12
and then there's also things like cell response that need to be known to decode it properly
jonnyawsom3
2025-05-11 09:08:50
...yeah that's the point of DNG
2025-05-11 09:09:15
Otherwise I'd just have a PNG
Fab
2025-05-11 04:47:41
I imported all the JPEG XL inprovements into avif on youtube and facebook
2025-05-11 04:48:14
Current the encoder is much advanced even of SVT av1 psy and also all
2025-05-11 04:48:41
But with jxl improvements enforcing encoding is far slow
2025-05-11 04:50:02
Just search rosy rey sciglie tu on yt
2025-05-11 04:50:18
We're doing on logical way
2025-05-11 04:51:53
2025-05-11 04:52:10
Av1 with jxl improvements actually retains noise
Demiurge
2025-05-11 05:10:28
๐Ÿง
CrushedAsian255
Fab Just search rosy rey sciglie tu on yt
2025-05-11 05:14:58
Uhhโ€ฆ unless you work at Google any modifications made to your encoder doesnโ€™t matter as YouTube re-encodes itโ€ฆ.
Fab
CrushedAsian255 Uhhโ€ฆ unless you work at Google any modifications made to your encoder doesnโ€™t matter as YouTube re-encodes itโ€ฆ.
2025-05-11 05:15:47
Yes because they are studio films
2025-05-11 05:15:55
Singers
2025-05-11 05:16:25
Romanian videos exibits lot of bandings
Demiurge
2025-05-11 05:21:27
Where can I download the ultimate fab encoder
2025-05-11 05:22:06
I hope it's compatible with my templeOS
CrushedAsian255
Demiurge Where can I download the ultimate fab encoder
2025-05-11 05:22:26
I should fine tune a small LLM
Fab
Demiurge Where can I download the ultimate fab encoder
2025-05-11 05:26:24
SVT av1 hdr
2025-05-11 05:26:59
2025-05-11 05:27:15
18 hours ago
CrushedAsian255
2025-05-11 05:27:21
That looks quite blocky
Fab
2025-05-11 05:27:44
SVT av1 psy ex according to Julio is worse
2025-05-11 05:27:49
Like 44%
2025-05-11 05:27:59
If you want that
2025-05-11 05:28:22
Also this is 8 bit with zero optimizations
2025-05-11 05:28:27
๐ŸŽ…
2025-05-11 05:29:09
You know pixel 9a Samsung isocell gn8
2025-05-11 05:29:45
Is an innovative sensor but is cheap
2025-05-11 05:37:34
2025-05-11 05:37:53
Another people has bragged off svt av1 hdr
2025-05-11 05:38:29
At 8 bit unfortunately is not really better than original SVT or libaom
jonnyawsom3
2025-05-11 05:44:35
<#805176455658733570>
Kupitman
Fab At 8 bit unfortunately is not really better than original SVT or libaom
2025-05-12 08:12:21
i have result where av1-psy worse than new svt
Orum
2025-05-12 08:35:12
which psy?
Kupitman
Orum which psy?
2025-05-12 10:50:25
Advanced ssim/psy
Orum
2025-05-12 10:50:51
๐Ÿ˜• what?
2025-05-12 10:50:59
I'm asking which encoder
Jyrki Alakuijala
2025-05-12 04:25:09
I have started on reducing oversmoothing in JPEG XL vardct quality. The first PR is https://github.com/libjxl/libjxl/pull/4250
A homosapien
Jyrki Alakuijala I have started on reducing oversmoothing in JPEG XL vardct quality. The first PR is https://github.com/libjxl/libjxl/pull/4250
2025-05-12 04:29:21
I will compile and test on my local image corpus later today
Jyrki Alakuijala
A homosapien I will compile and test on my local image corpus later today
2025-05-12 04:59:58
don't expect much I will read all feedback seven times and reflect on it
New Player ๐Ÿ‡ฉ๐Ÿ‡ช i need information about which distance values to choose
2025-05-12 05:02:11
Choose distance = 1. If it looks too good, go to 1.5, if it looks too bad, go to 0.6
CrushedAsian255
Jyrki Alakuijala Choose distance = 1. If it looks too good, go to 1.5, if it looks too bad, go to 0.6
2025-05-12 11:12:27
> looks too good
Demiurge
Jyrki Alakuijala I have started on reducing oversmoothing in JPEG XL vardct quality. The first PR is https://github.com/libjxl/libjxl/pull/4250
2025-05-13 05:01:43
Wish there was an example image attached ๐Ÿ‘€
Jyrki Alakuijala
2025-05-13 10:09:27
before, after and original
2025-05-13 10:12:48
I'll try to make the L2-based selection criteria to have some SSIM inspiration today in the afternoon, with hopes that I can push for even more sharpness without losing all the good characteristics of smoothing
Tirr
2025-05-13 10:15:34
the new one looks better to me indeed
Jyrki Alakuijala
2025-05-13 10:16:26
๐Ÿ˜…๐Ÿ˜…๐Ÿ˜… if it looked worse, I don't merge the PR ๐Ÿ˜…๐Ÿ˜…๐Ÿ˜…
JKUser4592
2025-05-13 04:50:47
How do I use Image Toolbox from T8RIN to play animated JXL files on Android devices? https://github.com/T8RIN/ImageToolbox https://github.com/T8RIN/ImageToolbox/issues/1733
AccessViolation_
Jyrki Alakuijala before, after and original
2025-05-13 05:18:19
nice ๐Ÿ‘€ I wonder how much this affects the file size?
jonnyawsom3
JKUser4592 How do I use Image Toolbox from T8RIN to play animated JXL files on Android devices? https://github.com/T8RIN/ImageToolbox https://github.com/T8RIN/ImageToolbox/issues/1733
2025-05-13 05:43:50
Please stop opening issues, posting to Reddit and asking here at the same time. It causes a mess and no one knows where they're meant to awnser you
Mine18
JKUser4592 How do I use Image Toolbox from T8RIN to play animated JXL files on Android devices? https://github.com/T8RIN/ImageToolbox https://github.com/T8RIN/ImageToolbox/issues/1733
2025-05-13 06:12:01
use the preview feature
JKUser4592
Mine18 use the preview feature
2025-05-13 06:12:18
How does that work?
Mine18
2025-05-13 06:12:34
you go to the feature, select the image you want, and you view it
Jyrki Alakuijala
AccessViolation_ nice ๐Ÿ‘€ I wonder how much this affects the file size?
2025-05-13 08:23:55
0.1 % perhaps, or 0.05 %, the butteraugli vals get slightly worse so it is a gut feeling guess rather than an exact value
Please stop opening issues, posting to Reddit and asking here at the same time. It causes a mess and no one knows where they're meant to awnser you
2025-05-13 08:24:49
Isn't all PR good PR?!
jonnyawsom3
Jyrki Alakuijala Isn't all PR good PR?!
2025-05-13 08:27:24
The Reddit is good, but opening an issue on github isn't doing much for PR, just making more work for maintainers
2025-05-13 08:29:07
The developer of the app already answered and closed the issue, then they asked the same question on Reddit and here at the same time. Just annoys me a bit since everyone ends up having to say the same thing in three different places
2025-05-13 08:30:48
Wanting help is fine, but they've done this every time they've had a question, so it's getting a bit spammy for me
Jyrki Alakuijala
The Reddit is good, but opening an issue on github isn't doing much for PR, just making more work for maintainers
2025-05-13 08:36:59
I consider every issue is a documented signal of interest in JPEG XL and can end up being valuable in "breaking dams" and letting water to flow. In the past I always tried to encourage creating issues.
jonnyawsom3
Jyrki Alakuijala I consider every issue is a documented signal of interest in JPEG XL and can end up being valuable in "breaking dams" and letting water to flow. In the past I always tried to encourage creating issues.
2025-05-13 08:54:08
An interesting view. I agree with your perspective, but I don't think it applies much when the software already has support. Then questions are better asked here or in the community, if it's technical then an issue is valid. But crossposting across all three should be avoided, it only splits the help that people give and makes it harder to find a definite awnser
AccessViolation_
Jyrki Alakuijala 0.1 % perhaps, or 0.05 %, the butteraugli vals get slightly worse so it is a gut feeling guess rather than an exact value
2025-05-13 11:02:23
oh nice, not bad at all! by the way, are you aware of this thread? might be helpful for benchmarking your work against cherry picked documented cases of the regression if that's something you want to do https://discord.com/channels/794206087879852103/1278292301038227489
2025-05-13 11:04:17
(idk how to make that not sound like I'm requesting something - just making you aware ๐Ÿ™‚)
Jyrki Alakuijala
Jyrki Alakuijala I'll try to make the L2-based selection criteria to have some SSIM inspiration today in the afternoon, with hopes that I can push for even more sharpness without losing all the good characteristics of smoothing
2025-05-14 07:20:24
SSIM as a smoothing selection objective did not work out, not even weighted added to L2. I gave up with it. Now looking at adding an interblock delta correctness objectives for smoothing selection. This looked promising in initial runs, overnight optimization of heuristics parameters have been running... I'm eager to see the results soon ๐ŸŒž๐ŸŒž๐ŸŒž
Demiurge
Jyrki Alakuijala before, after and original
2025-05-15 07:15:02
WAY better! NICE!!
2025-05-15 07:16:42
What promise and potential. If you keep pulling off miracles like this Jyrki you'll really be a wizard
2025-05-15 07:25:57
Is it possible to make photographic images more noisy and gritty without causing mosquito artifacts on high contrast graphics?
2025-05-15 07:29:14
Actually, the most important thing to fix right now is probably the most serious bugs first, with extreme chroma ringing noise as seen in "clovisfest" image, extreme color desaturation as seen in almost all images with yellow/orange/green, and blurry shadows as seen in "pont du qebec" image.
Jyrki Alakuijala I have started on reducing oversmoothing in JPEG XL vardct quality. The first PR is https://github.com/libjxl/libjxl/pull/4250
2025-05-15 07:30:14
Does this PR make a difference on "pont du qebec" bridge image with lots of dark shadows?
2025-05-15 07:32:39
https://commons.wikimedia.org/wiki/File:125_-_Qu%C3%A9bec_-_Pont_de_Qu%C3%A9bec_de_nuit_-_Septembre_2009.jpg
Jyrki Alakuijala
Demiurge Is it possible to make photographic images more noisy and gritty without causing mosquito artifacts on high contrast graphics?
2025-05-16 03:47:13
We could have modes of operation, for example if photon noise option has been chosen then we could use those larger transforms more eagerly, those that are effective at compressing but create a bit of spatial noise in their operation
Demiurge What promise and potential. If you keep pulling off miracles like this Jyrki you'll really be a wizard
2025-05-16 03:49:31
Im just fixing my own old bugs ๐Ÿ˜…
Demiurge
Jyrki Alakuijala We could have modes of operation, for example if photon noise option has been chosen then we could use those larger transforms more eagerly, those that are effective at compressing but create a bit of spatial noise in their operation
2025-05-16 04:15:29
What about automatically measuring and replacing lost noise after encoding instead of relying on manual selection of an ISO number...?
2025-05-16 04:19:00
Either with or without a pre-encode filtering step, whichever's more convenient.
_wb_
2025-05-16 05:24:51
Detection without preprocessing seems the safest approach to me. Where detection is mostly needed (imo) to ensure it's a photographic image, because you don't want to apply photon noise to a screenshot or a perfectly clean illustration.
2025-05-16 05:26:50
The detected noise level would then put an upper bound on the noise added, but the distance setting should also modulate it (less noise added at lower distances).
Demiurge
_wb_ Detection without preprocessing seems the safest approach to me. Where detection is mostly needed (imo) to ensure it's a photographic image, because you don't want to apply photon noise to a screenshot or a perfectly clean illustration.
2025-05-16 06:23:18
But for a clean illustration, without any grain like in a natural image, the detected amount of uniform noise loss after encoding would be much lower than for a natural photographic image, right? So maybe that's how you would be able to detect a clean graphic vs natural photo
2025-05-16 06:31:20
https://afontenot.github.io/image-formats-comparison/#pont-de-quebec&AV1=l&JPEGXL=l
2025-05-16 06:32:38
This is a really bad image for jxl, I wonder if Jyrki's newest PR decreases blurring on the bridge at all?
2025-05-16 06:34:34
https://github.com/afontenot/image-formats-comparison/blob/master/comparisonfiles/subset1/original/125_-_Qu%C3%A9bec_-_Pont_de_Qu%C3%A9bec_de_nuit_-_Septembre_2009.png
2025-05-16 06:35:05
Here's a link to the same version of the file used on the comparison page
2025-05-16 06:35:12
For convenience
2025-05-16 06:37:19
It's the perfect image for demonstrating how jxl reacts badly to dark shadows. You can see JXL preserves the texture of the bricks well. But the steel struts and columns are a complete mess.
2025-05-16 06:37:42
compared to other codecs.
2025-05-16 06:42:11
In fact, even mozjpeg outperforms jxl here
2025-05-16 06:42:22
It's pretty serious
2025-05-16 06:42:43
At least, on the comparison page it does.
_wb_
Demiurge But for a clean illustration, without any grain like in a natural image, the detected amount of uniform noise loss after encoding would be much lower than for a natural photographic image, right? So maybe that's how you would be able to detect a clean graphic vs natural photo
2025-05-16 06:42:59
Exactly, so it would make sense to have some threshold in the detection where if the detected noise is below the threshold, noise generation is just skipped. Possibly this could also be a trigger to make some other decisions like gaborish or the amount of effort spent on patch detection.
Demiurge
2025-05-16 06:43:00
https://afontenot.github.io/image-formats-comparison/#pont-de-quebec&MOZJPEG=l&JPEGXL=l
_wb_ Exactly, so it would make sense to have some threshold in the detection where if the detected noise is below the threshold, noise generation is just skipped. Possibly this could also be a trigger to make some other decisions like gaborish or the amount of effort spent on patch detection.
2025-05-16 06:43:22
Yeah, that would be a super clever idea.
2025-05-16 06:43:35
It would be like knocking out multiple birds with one stone.
A homosapien
Demiurge https://afontenot.github.io/image-formats-comparison/#pont-de-quebec&MOZJPEG=l&JPEGXL=l
2025-05-16 07:08:50
What? Mozjpeg looks terrible here, banding in the sky, blockiness all over
Jyrki Alakuijala Im just fixing my own old bugs ๐Ÿ˜…
2025-05-16 09:01:39
Question, is it possible that epf and/or gaborish are not doing their job properly? In my opinion they seem to ignore artifacts and smooth out detail, adding noise to places where it shouldn't and blurring noisy areas, it's like inverse logic.
2025-05-16 09:06:02
Here is a visual example, in 0.8 it looks like the filters help image quality when compared to `--epf 0 --gaborish 0`. But in Main (with your sharpness PR) the filters looks like it somewhat hurts image quality (in some regions). __Open these animated WebP's in a browser or download them to avoid Discord's compression.__
2025-05-16 09:07:20
This is high fidelity by the way, distances 1.2 - 1.4. All comparisons with similar BPP.
2025-05-16 09:12:06
I think I've mentioned this before, even at a baseline level with `--epf 0 and --gaborish 0` Main still looks blurrier than 0.8. It's just that the filters widen the gap even more I think.
2025-05-16 09:12:52
Oh yeah I did do some testing before hand, sorry for being redundant. ๐Ÿ˜… https://discord.com/channels/794206087879852103/1278292301038227489/1297641128333410404
jonnyawsom3
2025-05-16 11:27:39
During the generation loss PRs, I recall people saying that Gaborish was misaligned with the decoder, causing more blurring than there should be
_wb_
2025-05-16 12:32:06
Encoder gaborish is not perfectly the inverse of decoder gaborish. It does make sense to sharpen slightly more than only inverting decoder gaborish, to compensate for the blurring introduced by DCT quantization. But I think it's somewhat ad hoc right now, not very principled. Encoder gaborish always does the same thing, which doesn't make sense: it should converge towards being as close as possible to the inverse of decoder gaborish as distance goes to zero, while it can deviate more from that as distance gets higher. Also, ideally encoder gaborish should take adaptive quantization into account too (but that is complicated since AQ is done after fwd gaborish is already done).
CrushedAsian255
2025-05-16 12:41:42
does the spec allow that? wouldn't it cause an increase in error?
Tirr
2025-05-16 01:11:34
it's lossy encoder anyway
username
2025-05-16 01:12:00
I mean doesn't the spec just define decoding for the most part? like an encoder can do whatever it wants as long as the result is a valid JXL file or stream that can be decoded
CrushedAsian255
2025-05-16 01:12:25
Oh I thought the decoder was off
_wb_
2025-05-16 01:15:31
The spec only defines decoder gaborish. An encoder can do whatever it wants โ€” of course the goal is always to get as much fidelity as possible at every bitrate. The straightforward thing to do would be to make it so that dec_gaborish(enc_gaborish(image)) = image, but this is not quite possible with a small convolution kernel, and it's also not necessarily the best thing to do because the end result will be something like dec_gaborish(IDCT(DCT(enc_gaborish(image)))) so if enc_gaborish can compensate a bit for the error introduced by the lossy compression, it's better than if it just compensates for dec_gaborish...
CrushedAsian255
_wb_ The spec only defines decoder gaborish. An encoder can do whatever it wants โ€” of course the goal is always to get as much fidelity as possible at every bitrate. The straightforward thing to do would be to make it so that dec_gaborish(enc_gaborish(image)) = image, but this is not quite possible with a small convolution kernel, and it's also not necessarily the best thing to do because the end result will be something like dec_gaborish(IDCT(DCT(enc_gaborish(image)))) so if enc_gaborish can compensate a bit for the error introduced by the lossy compression, it's better than if it just compensates for dec_gaborish...
2025-05-16 01:38:33
ohhh so `dec_gaborish` is well-defined but the encoder can write whatever bits they want
Traneptora
Please stop opening issues, posting to Reddit and asking here at the same time. It causes a mess and no one knows where they're meant to awnser you
2025-05-16 03:21:57
pretty sure they're teh same person as https://discord.com/channels/794206087879852103/794206170445119489/1199019206486806548
jonnyawsom3
2025-05-16 03:26:41
Yeah
Jyrki Alakuijala
_wb_ Encoder gaborish is not perfectly the inverse of decoder gaborish. It does make sense to sharpen slightly more than only inverting decoder gaborish, to compensate for the blurring introduced by DCT quantization. But I think it's somewhat ad hoc right now, not very principled. Encoder gaborish always does the same thing, which doesn't make sense: it should converge towards being as close as possible to the inverse of decoder gaborish as distance goes to zero, while it can deviate more from that as distance gets higher. Also, ideally encoder gaborish should take adaptive quantization into account too (but that is complicated since AQ is done after fwd gaborish is already done).
2025-05-17 08:52:19
Also a matter of added entropy. Id anticipate that encoder does a little less sharpening than the decoder does fot blurring... ๐Ÿ˜…
CrushedAsian255 ohhh so `dec_gaborish` is well-defined but the encoder can write whatever bits they want
2025-05-17 08:53:32
Gaborish coefficients are in the bitstream (to override the default gaborish), so one could play with that
Demiurge
A homosapien What? Mozjpeg looks terrible here, banding in the sky, blockiness all over
2025-05-17 09:42:46
On Large size mozjpeg looks better. On Medium yes the sky is blocky but the bridge is all smudged in libjxl whereas mozjpeg retains more bridge details. libjxl does extremely bad on this image because of all the details in the shadows.
2025-05-17 09:43:41
Aside from the blockiness of the sky, mozjpeg is far better than libjxl here
2025-05-17 09:44:00
Just look at the bridge.
2025-05-17 09:44:19
Even on Large filesize, aka d=1
2025-05-17 09:44:34
The default quality setting of libjxl
jonnyawsom3
2025-05-17 09:45:03
So half the image looks terrible in mozjpeg, half the image looks bad in JXL
Demiurge
2025-05-17 09:45:08
libjxl is supposed to be optimized for high bitrate high fidelity, so losing to mozjpeg is pretty bad
So half the image looks terrible in mozjpeg, half the image looks bad in JXL
2025-05-17 09:47:35
https://raw.githubusercontent.com/afontenot/image-formats-comparison/refs/heads/master/comparisonfiles/subset1/large/MOZJPEG/125_-_Qu%C3%A9bec_-_Pont_de_Qu%C3%A9bec_de_nuit_-_Septembre_2009.jpg
2025-05-17 09:47:39
Does this look terrible to you?
2025-05-17 09:47:55
This is mozjpeg at the same size as libjxl d=1
2025-05-17 09:48:45
https://github.com/afontenot/image-formats-comparison/raw/refs/heads/master/comparisonfiles/subset1/large/JPEGXL/125_-_Qu%C3%A9bec_-_Pont_de_Qu%C3%A9bec_de_nuit_-_Septembre_2009.jxl
2025-05-17 09:49:15
Here's libjxl with less sharpness and more blurring on the bridge details
2025-05-17 09:53:34
mozjpeg large is clearly superior to libjxl large here
2025-05-17 09:54:40
libjxl is supposed to be very well optimized at this bitrate, so this is a pretty severe and embarrassing bug
2025-05-17 09:55:05
The problem lies in how libjxl handles details in dark shaded regions.
2025-05-17 09:55:44
It's a very common problem in a lot of old video codecs
2025-05-17 09:56:21
You can see it in a lot of digital video whenever there is a fade-to-black and the image suddenly looks horrible as it gets darker.
2025-05-17 09:56:41
libjxl evidently has the same problem
2025-05-17 09:57:36
This isn't a problem in newer and more sophisticated video codecs, like libaom, but often a problem with older and more primitive codecs, like hardware encoders.
CrushedAsian255
2025-05-17 10:38:39
Is it due to it not taking into account the 1+1 vs 100+1 human perception thing?
Demiurge
2025-05-17 12:24:28
Basically. It does take it into account, but not very well.
2025-05-17 12:25:43
It over-aggressively quantizes low-contrast, dark regions much worse than mozjpeg or libaom.
jonnyawsom3
2025-05-17 12:33:23
I wonder if that's related to the high quantization of the B channel
A homosapien
Demiurge Does this look terrible to you?
2025-05-17 12:46:59
Yes actually, the JPEG artifacts are too extreme to be considered "high fidelity". The blocking is unacceptably bad and the ringing is immediately apparent at first glance. At worst blacks look about the same in the JXL. Actually JXL is preserving more of what little details there are in the blacks. MozJPEG is noisy and blocky to all hell back, not faithful to the original image at all. Also, the reason I call it "blacks" and not "shadows" is because I consider the night sky a huge shadowed area, which has been marred beyond recognition. Also, the images as a whole seems to be slightly fuzzy/blurry, which is one of my major gripes with MozJPEG in general. I agree with the general sentiment of JXL neglecting darkness at times. I just don't know what you are smoking to say that MozJPEG is better here.
Demiurge
A homosapien Yes actually, the JPEG artifacts are too extreme to be considered "high fidelity". The blocking is unacceptably bad and the ringing is immediately apparent at first glance. At worst blacks look about the same in the JXL. Actually JXL is preserving more of what little details there are in the blacks. MozJPEG is noisy and blocky to all hell back, not faithful to the original image at all. Also, the reason I call it "blacks" and not "shadows" is because I consider the night sky a huge shadowed area, which has been marred beyond recognition. Also, the images as a whole seems to be slightly fuzzy/blurry, which is one of my major gripes with MozJPEG in general. I agree with the general sentiment of JXL neglecting darkness at times. I just don't know what you are smoking to say that MozJPEG is better here.
2025-05-17 01:30:41
You can easily compare here https://afontenot.github.io/image-formats-comparison/#pont-de-quebec&MOZJPEG=l&JPEGXL=l