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

website

To discuss updates to the jpegxl.info community website

Demiurge
2025-03-18 03:36:09
At least it's only the frame start, and not something even more crucial. Like image size or something.
Traneptora
2025-03-18 03:44:51
yea the super tiny header is useful for many super tiny images
2025-03-18 03:45:12
but in those cases the TLS handshake and the HTTP roundtrip is more important than the size of the image
AccessViolation_
2025-03-18 03:50:59
that's true
2025-03-18 03:51:14
that's why I'm a big QUIC proponent as well
_wb_
Traneptora but in those cases the TLS handshake and the HTTP roundtrip is more important than the size of the image
2025-03-18 07:28:20
Images can be data-uri inlined in a page, and requests can be multiplexed etc...
CrushedAsian255
2025-03-19 09:37:52
<:JXL:805850130203934781>
2025-03-19 09:39:11
For this small of an image you can probably afford `-e 10` in which i get a 1775 byte JXL file for that emoji
AccessViolation_
2025-03-19 09:44:46
it's probably still more efficient to put them all in a sprite sheet and make browsers selectively render parts of them (which I think HTML/CSS can do natively?), but it's only economical if you know you're going to be using most of them
2025-03-19 09:49:03
for example Discord could just make you download the sprite sheet that contains all of a server's custom emoji at react size, and then at message size. Twitch could have a sprite sheet for global emotes and make you download the channel-specific emotes for the specific channel you're watching, and still use a request per emote for any emotes from external channels that are posted in the stream from someone else
2025-03-19 09:50:26
but loading them individually when needed gets more efficient if you serve many different sizes of the same image in many different places, because all size options would require their own sprite sheet
jonnyawsom3
CrushedAsian255 For this small of an image you can probably afford `-e 10` in which i get a 1775 byte JXL file for that emoji
2025-03-19 11:37:08
I'd try lossless with --keep_invisible 0
CrushedAsian255
2025-03-19 11:41:25
still 1775 bytes
_wb_
2025-03-19 07:56:09
.svg.br is the way to go for such images
2025-03-19 07:56:28
Don't rasterize vectors unless you have to
couleur
_wb_ .svg.br is the way to go for such images
2025-03-19 08:35:22
whats .br
TheBigBadBoy - 𝙸𝚛
2025-03-19 08:35:39
brotli
CrushedAsian255 For this small of an image you can probably afford `-e 10` in which i get a 1775 byte JXL file for that emoji
2025-03-19 08:36:04
`-e 11` ftw
_wb_ Don't rasterize vectors unless you have to
2025-03-19 08:36:28
yeah but JXL's splines [⠀](https://cdn.discordapp.com/emojis/1059276598660059136.webp?size=48&name=av1_trollhq)
AccessViolation_
2025-03-19 08:37:58
for brotli they really took the "compact header" idea to the next level didn't they <:tfw:843857104439607327>
2025-03-19 08:39:00
who needs magic signatures
_wb_
2025-03-19 09:01:29
Aren't all compressed streams like that? IIRC, a raw deflate stream is also headerless
AccessViolation_
2025-03-19 09:22:00
hmm maybe, but the problem is that you if you just brotli compress a file you end up with a nondistinct blob that software can't automatically check the format of. whereas zstd for example includes a magic number
2025-03-19 09:22:56
i'm only now realizing that this isn't an issue at all if you use a container format compatible with brotli
_wb_
2025-03-19 10:23:23
It's like gzip vs raw deflate. Both have their uses.
5peak
Traneptora but in those cases the TLS handshake and the HTTP roundtrip is more important than the size of the image
2025-03-25 04:14:08
This is different problem domain. Speed of light is the limit.
Demiurge
2025-04-10 03:24:17
So there was some talk earlier about good images to use for visual comparison demos versus other codecs to showcase the strengths of JXL. I think I found some really impressive samples where jxl utterly dominates.
2025-04-10 03:26:14
And it would be cool to show these actual real life examples on the fan website. Photos where other codecs don't even come close and libjxl seems decades ahead.
2025-04-10 03:34:25
https://afontenot.github.io/image-formats-comparison I was looking at this comparison again recently, and it has some examples where libjxl is unbelievably superior compared to others, as well as a few examples of libjxl doing poorly, but overall libjxl tends to outperform other codecs if you overlook 3 main weaknesses with libjxl. In order of how noticeable the flaws are, they are: Reduced color saturation across a wide range of images, excessive punishment of darker shaded image regions, and excessive ringing and colorful specks at lower bitrates
2025-04-10 03:36:39
One of the best examples of supreme libjxl domination over competitors is the "Sunset" image.
2025-04-10 03:37:55
There are many images where entire details and textures completely disappear in avif and only libjxl preserves them! This would be great on the fan site!
2025-04-10 03:41:38
Take a look at "Sunset," "Seikima," and "White Dune" for some good examples of libjxl domination.
2025-04-10 03:45:55
Also the water and trees in "Reykjavik." Or the red details on the merry-go-round or the texture on the black fish and foliage texture in "Kopenhagen."
2025-04-10 04:21:47
"Mercado" also is a very dramatic difference on that page. With the tiles, and stone surfaces, completely smoothed away by avif but not by libjxl
2025-04-10 04:22:24
I can also list some examples where libjxl does particularly poorly and highlights the 3 flaws I mentioned.
2025-04-10 04:22:32
If anyone's interested
2025-04-10 04:22:58
Either way someone should put these demos on the fan site for sure, in my opinion
2025-04-10 04:23:47
I would credit the source too, "afontenot"
gb82
Demiurge https://afontenot.github.io/image-formats-comparison I was looking at this comparison again recently, and it has some examples where libjxl is unbelievably superior compared to others, as well as a few examples of libjxl doing poorly, but overall libjxl tends to outperform other codecs if you overlook 3 main weaknesses with libjxl. In order of how noticeable the flaws are, they are: Reduced color saturation across a wide range of images, excessive punishment of darker shaded image regions, and excessive ringing and colorful specks at lower bitrates
2025-04-11 05:21:59
Looks like they aren’t using tune iq for avif, that’s a big disadvantage to avif
Demiurge
2025-04-11 05:24:23
Is that a recently added thing?
gb82
2025-04-11 05:54:39
Yeah pretty recent
Demiurge
2025-04-11 11:56:04
Part of psy tuning fork merge?
2025-04-11 11:59:19
Really hope those folks patch libjxl next 😂
2025-04-12 12:00:32
libjxl is already really impressive for a DCT codec but it's got some stiff competition from libaom, sometimes it even looks like av1 is using splines
gb82
Demiurge Part of psy tuning fork merge?
2025-04-13 03:43:48
yeah, we created Tune 4 in SVT-AV1-PSY for still image performance & it did well, but it had some inherent limitations (like 4:2:0-only) so its being ported to libaom
Demiurge Really hope those folks patch libjxl next 😂
2025-04-13 03:44:10
actually a lot of our inspiration came from libjxl, and some from x264
Demiurge
2025-04-13 03:57:25
Damn, it's too bad libaom is benefitting from libjxl innovations instead of the other way around 😂
2025-04-13 03:58:33
I'm pretty mad at the tech lead of libaom for his childish removal of libjxl from chromium
2025-04-13 04:00:01
I honestly want libaom to fail after that, since the entire planet is being set back on image compression for the sake of his petty ego
2025-04-13 04:00:21
So equally petty I want libaom to utterly fail
2025-04-13 04:00:42
And libjxl to succeed ♥️
2025-04-13 04:30:58
I know libjxl is an utterly nightmarish pile of old coagulated spaghetti code but I really hope someone shows it some love, dikes out some of the old cruft and complexity, and gives it some tuning love. If I have time I might even do it one of these days since no one else seems to -_-
2025-04-13 04:33:10
The devs seem afraid to make major overhauls/changes/refactors because alleged, unfounded fear of messing things up
2025-04-13 04:33:19
libjxl-tiny is the only other encoder afaik
gb82 actually a lot of our inspiration came from libjxl, and some from x264
2025-04-13 04:34:44
Is there anything x264 does that libjxl could copy?
gb82
2025-04-13 05:26:50
im not really sure, I don't think there's as much overlap compared to SVT-AV1 or libaom because they're video encoders first and foremost
Demiurge
2025-04-13 06:29:14
Well x264 does have tune=stillimage or something and an intra-only mode without any motion vectors.
jonnyawsom3
Demiurge libjxl-tiny is the only other encoder afaik
2025-04-13 08:05:29
hydrium does ultra-low memory lossy encoding
2025-04-13 08:07:07
libjxl is an unwieldy beast, but exposing so many paramters has come in useful. Everything in <#1358733203619319858> has just been changes to if statements and variables, enabling and disabling existing features under different conditions
Demiurge
2025-04-13 08:07:11
I forgot about that one. That's pretty cool... and it's pretty simple to tune the parameters for these extra-simplified lossy encoders too, so they can benefit a lot from visual testing and tuning
jonnyawsom3
2025-04-13 08:10:40
I also cooked up a new group size heuristic. Currently it's 256 x 256 unless the image is <= 400 tall and wide, or it's effort 11. Mine will try and use the largest group size that maximizes thread utilization. Roughly speaking, an 8 core 16 thread CPU will use g1 (256 x 256) for 1080p, g2 (512 x 512) for 4K and g3 (1024 x 1024) for 8K. Need to do a bit more testing on it's impact though, may limit g3 to effort 9+ due to the memory increase
Demiurge
2025-04-13 08:14:40
I think it's better if the criteria is based on the image rather than the particular environment it's being run on
2025-04-13 08:17:31
I think there's too many effort levels too... certain features would be better as their own separate experimental option rather than adding yet another gradation to the effort knob
2025-04-13 08:18:47
Unless/until those features become solid enough to enable by default in a certain effort setting. The current state of the effort setting are pretty poor tradeoffs.
jonnyawsom3
2025-04-13 08:19:02
If you mean using the block size that gives the best density, the only option is brute forcing all of them currently, which is what effort 11 does. It would check that the image is at least as big on both axis as the chosen block size, to avoid cases like a 1 pixel long strip using 99% empty 1024 x 1024 groups, instead using 128x128
Demiurge
If you mean using the block size that gives the best density, the only option is brute forcing all of them currently, which is what effort 11 does. It would check that the image is at least as big on both axis as the chosen block size, to avoid cases like a 1 pixel long strip using 99% empty 1024 x 1024 groups, instead using 128x128
2025-04-13 08:19:58
No, it can be a heuristic like the same as your proposed algorithm except not dependent on the host environment (always assume X hypothetical threads for example)
jonnyawsom3
2025-04-13 08:20:55
Heuristic... How? See if it has lots of HF data and use smaller blocks for more locality, with big blocks for smooth images?
2025-04-13 08:22:26
Wait, this is the website channel...
Demiurge
2025-04-13 08:22:33
Like I said, it could be the same as what you are proposing, but instead of being dependent on the host environment, it can use static values
2025-04-13 08:23:12
I just personally would prefer the compression parameters weren't affected by the host system
2025-04-13 08:23:24
Unless explicitly asked
jonnyawsom3
2025-04-13 08:23:28
Continuing in https://discord.com/channels/794206087879852103/804324493420920833/1360893182203789332
2025-04-20 10:21:30
Maybe we shouldn't have *all* our email addresses publicly listed... <@594623456415449088> <https://jpegxl.info/about/contributors.html>
monad
2025-04-20 06:59:31
an ironic criticism given they were published publicly by each individual to an enduring and widely disseminated git repo
jonnyawsom3
2025-04-20 07:01:29
The git repo is less likely to be found by random members of the public, including mischievous kids, than the front facing page for the format
KKT
2025-04-21 03:29:46
Yeah, we had a debate about it back in the day and decided to go ahead since they were already public… Maybe they should be links to their github pages or LinkedIn?
jonnyawsom3
2025-04-21 08:28:50
Could link to their contributions to libjxl (or eventually jxl-rs)
Jyrki Alakuijala
Demiurge One of the best examples of supreme libjxl domination over competitors is the "Sunset" image.
2025-05-13 12:38:12
Clouds are not easy for usual compressors, I paid quite a bit of attention to get natural looking clouds in JPEG XL. I like how the sky looks, and I like clouds particularly 😄
Demiurge
2025-05-13 12:39:08
Not just the clouds but also the foliage
Fab
2025-05-13 01:45:04
How is the yt encoder of today at encoding the clouds at 1080p resolution and av1?
Tirr
2025-06-02 05:51:54
Duplicate Image Finders section of <https://jpegxl.info/resources/supported-software.html>: I think [czkawka](https://github.com/qarmin/czkawka) also supports jxl, via jxl-oxide
Quackdoc
Tirr Duplicate Image Finders section of <https://jpegxl.info/resources/supported-software.html>: I think [czkawka](https://github.com/qarmin/czkawka) also supports jxl, via jxl-oxide
2025-06-02 08:33:52
correct. I use krokiet, the slint frontend for czkawka a lot :D
jonnyawsom3
2025-06-11 12:52:26
It'd be nice to do some minor Cleanup of the site that never got done months ago. Fixing the bad compression of the background image, making the effort vs quality sliders more coarse to reduce the amount of files needed
KKT
2025-06-11 03:58:23
At this point I'm probably just going to rebuild it in Webstudio and use Decap as the CMS. Just need to find a bit more time. For the background image, I used the largest size available on the download. It's the full width, so the JPEG artifacts are baked in. I guess I could try an AI upscale it or something. As well, I thought it was only really noticeable when we had that bug that scaled it to like 2000% on some Linux browsers. I don't think it's worth it on the effort vs quality side. It was suggested we use jxl-oxide to do the compression and decompression. Not sure how performant that will be, but I guess we can try.
jonnyawsom3
2025-06-11 05:13:32
Well jxl-oxide is a decoder only, you'd need to lobotomize Squoosh for a WASM encoder. I think effort vs quality still has a place, but significantly cut it down. Generally the people moving at distance 0.1 increments are the kind to do testing locally, we just need a general showcase of Distance 0-5, maybe 0.25 increments and use the oxide WASM decoder so we don't need to store hundreds of extra images for fallback
KKT
2025-06-11 07:07:58
As a photographer I find it interesting to look at those kind of increments. We can certainly cut down the high distances. Does it hurt to have more? Performance seems fine
jonnyawsom3
2025-06-11 07:23:45
....
2025-06-11 07:26:24
It makes it an absolute nightmare to edit and maintain, when 90% of visitors don't even use the page, yet alone test all 100 distance notches at all 10 effort levels per image
2025-06-11 07:27:50
Personally I go for distance 0.3 when using lossy, so I too would like fine grained control, but when the images are only a few hundred pixels wide anyway, you can't see the difference between distance 0 and distance 0.5 yet alone distance 0 and 0.1
2025-06-11 07:31:41
Maybe a dynamic distance slider? 0.1 increments up to distance 1, 0.25 up to distance 2, 0.5 up to distance 5, and 1 up to distance 15
2025-06-11 07:35:02
That cuts it down to 300 images from 1,500. Then add the WASM decoder and the repo is 20x smaller, far smaller in filesize too since we don't need lossless fallbacks
KKT
2025-06-12 12:44:18
Background image has been updated and recompressed. Best I could do with that image. Scaled up using AI, scaled down, then converted to greyscale PNG, the convert to JXL & webp. Maybe looks slghtly better? Otherwise we'll have to find a replacement.
jonnyawsom3
Maybe a dynamic distance slider? 0.1 increments up to distance 1, 0.25 up to distance 2, 0.5 up to distance 5, and 1 up to distance 15
2025-06-12 01:10:16
Since it's meant to be a showcase of the format... v0.8 up to distance 9.9, then main for distance 10-15 should give the best visual results... Effort 9 and 10 are identical for images under 2048*2048 too
2025-06-12 08:27:20
Actually ignore that, v0.8 is still better all round, you'll just want to manually enable resampling at distance 10+ to match the behaviour of main
monad
2025-06-12 09:31:58
No, old versions shouldn't be used in general and impressions shouldn't be artificially manipulated. It's bad enough people still propagate the generation loss resistance claim based solely on Jon's old videos without any practical substantiation in years.
A homosapien
2025-06-12 10:00:50
I agree with monad, using the latest version is what most people would normally use anyways. Also, there is generation loss resistance but only for distances ≤0.5.
jonnyawsom3
2025-06-12 12:10:50
I also agree with monad, we shouldn't need to use old versions, but here we are
2025-06-12 12:11:24
You could say the same about JXL art, the tiny sizes aren't representative of normal encoding, but we still show them off and boast
HCrikki
2025-06-12 12:28:36
decode speed is super important too. for some one given image, itd be helpful to demonstrate that it has no direct relation to *filesize* and depending on the encoding parameters, efforts, flags (decoding not so much since i assume images are almost always decoded at the highest precision possible), an image can be made to load instantly even on old weak hardware
2025-06-12 12:30:44
could help influence the scripters and integrators away from insanely ressource-hungry settings, efforts and implementations that damage jxl's reputation
2025-06-12 12:33:08
like, ok you inconstently save 10 kilobytes for the average 10 megapixel image but was it worth making images take 10x more cycles and time to decode now that the cost of energy for server and cloud compute has drastically increased ? consider comics and danbooru-like galleries, some scripts cause ludicrously huge increases in computing cost, encode durations and decode speeds, to the point site ops prefer nopeing off to avif or stick to jpg for another decade anything above effort 8 shouldve been locked down as developper-only not meant to be used except for intentionally specific purposes or allowed only for images smaller than 2 megapixels if system isnt known to benchmark very high for jxl encoding and decoding (flawed as it is, see phoronix test suite results for an idea)
jonnyawsom3
2025-06-12 12:40:26
When the next version releases, we can definitely rerun the numbers and get some solid results for decode speed, progressive loading, ect
monad
You could say the same about JXL art, the tiny sizes aren't representative of normal encoding, but we still show them off and boast
2025-06-12 05:19:26
Latest releases incorporate improvements regardless of coding efficiency observations. They are most accessible as integrations update. JXL art as a process could be misunderstood, but that's separate to my argument.
diskorduser
2025-07-19 07:07:38
this look weird. hits counter
_wb_
2025-07-19 07:54:13
Does that happen at a specific viewport width? On my phone it looks normal
diskorduser
_wb_ Does that happen at a specific viewport width? On my phone it looks normal
2025-07-19 08:05:41
I used waterfox on desktop. 1920x1080 on windows 11.
2025-07-19 08:07:27
may be the problem with firefox based browsers? it looks like that in android waterfox but on chrome it looks ok.
2025-07-19 08:08:57
KKT
2025-07-19 07:24:52
I'll fix
2025-07-19 07:29:08
Done
jonnyawsom3
2025-10-18 07:29:19
A very minor nit pick, but in light of [this](<https://redd.it/1oa4ip9>) Reddit post, maybe we should use underscores instead of dashes for spaces, to avoid `JPEG-XL` confusion xD <https://jpegxl.info/resources/jpeg-xl-test-page.html>
KKT
2025-10-18 11:36:04
Hmm, I usually use hyphens for SEO best practices, but it probably doesn't matter much. I wonder if we should just create a JPEG XL branding guidelines page?
monad
2025-10-19 02:50:38
Actually, the dash is correct on Reddit.
KKT
2025-11-11 04:07:46
I added Shutter Encoder and updated the Affinity logo/link on the software page.
2025-11-23 06:00:20
I've updated the website with a bunch of the new articles (JPEG XL in hardware, PDF support, Chrome support). Let me know if there are other good ones…
2025-11-23 07:12:24
Hey, I'm trying to update the HDR image on the website (remove the video for Safari now that HDR images are supported). I couldn't find my original source file, so I recreated it (in Affinity, like before). I'm exporting as an EXR and it looks exactly like the source. I export as PNG and it's much more saturated but significantly less bright. I'm converting to AVIF and JXL. Both are coming out dark. I guess I could use them this way, but I thought they looked better brighter. Any idease?
2025-11-23 07:17:29
AVIF: `avifenc -q 90 -s 0 -r f -d 10 -y 444 --nclx 9/16/9` JXL: `cjxl -d 1.5 -e 7`
2025-11-23 07:18:48
2025-11-23 07:19:34
I created the JXL from both the EXR & PNG and they both end up looking exactly the same.
2025-11-23 07:28:27
I guess now that Affinity is free, you can take a run at the original too:
2025-11-23 07:28:35
Had to split in two to upload.
spider-mario
KKT Hey, I'm trying to update the HDR image on the website (remove the video for Safari now that HDR images are supported). I couldn't find my original source file, so I recreated it (in Affinity, like before). I'm exporting as an EXR and it looks exactly like the source. I export as PNG and it's much more saturated but significantly less bright. I'm converting to AVIF and JXL. Both are coming out dark. I guess I could use them this way, but I thought they looked better brighter. Any idease?
2025-11-23 07:31:22
maybe using `exr_to_pq` from libjxl?
2025-11-23 07:45:40
ah, it seems it doesn’t behave well with alpha, I should fix that
2025-11-23 07:57:13
is this how it’s supposed to look?
2025-11-23 07:57:58
ah, one second, forgot the `--intensity_target=829`
2025-11-23 07:58:10
there
jonnyawsom3
2025-11-23 08:28:54
I thought we were trying to avoid using AI generated content on the site?
AccessViolation_
2025-11-23 08:35:15
there are so many nice freely usable images out there https://commons.wikimedia.org/wiki/Commons:Picture_of_the_Year
KKT
2025-11-23 09:04:25
I chose that one so I could crank the HDR-ness without messing with the actual intent of the image.
2025-11-23 09:05:43
And those are great images, but I don't see any HDR ones in there.
spider-mario there
2025-11-23 09:15:53
Thanks! That looks good. Can we get it closer to the 180KB from the 1.8MB for the web? Anything I can do to make the AVIF look closer?
spider-mario
2025-11-23 09:23:55
that was lossless, so we could in principle recompress this lossily for JXL, and decompress to PNG / recompress with `avifenc --ignore-icc --cicp 9/16/9` for AVIF
KKT
2025-11-23 09:30:10
I was using the PNG to create the AVIF but it was dark too. What were the flags for the JXL?
spider-mario
2025-11-23 10:00:35
mainly, I used `tools/exr_to_pq --luminance white=203 original.exr pq.ppm`, which said “The resulting image should be compressed with `--intensity_target=828.486`.”, so then I ran `tools/cjxl -d 0 -x color_space=RGB_D65_202_Rel_PeQ --intensity_target=829 pq.ppm image.jxl`
2025-11-23 10:00:58
because that image is now in PQ, decompressing that jxl to png and then encoding that png to avif should not be dark anymore
2025-11-23 10:01:30
(I really mainly used JXL as an alternative to PNG here, to convey the result of the PQ conversion)
KKT
2025-11-24 01:12:23
Mmm. `avifenc -q 90 -s 0 -r f -d 10 -y 444 --nclx 9/16/9` from the PNG is giving me this:
2025-11-24 01:12:30
Looks non-HDR
2025-11-24 01:12:49
In case Discord is messing around with it
juliobbv
2025-11-24 02:33:34
discord tonemaps preview images down to SDR
2025-11-24 02:33:50
but if I open the original AVIF I can see it's HDR
KKT
2025-11-24 02:43:59
It's not nearly the same as the JXL though.
2025-11-24 03:43:41
OK, I updated the site. Looks good on the Mac in Safari and Chrome. Not so much on Firefox. Can some others test it out on Windows & Linux?
2025-11-24 03:44:55
I have an non-HDR windows machine and you can tell the difference between the HDR & SDR but it doesn't look great.
monad
2025-11-24 04:00:29
my linux sys
KKT
2025-11-24 04:02:05
Would an HDR JPEG work better as a fallback?
spider-mario
KKT Mmm. `avifenc -q 90 -s 0 -r f -d 10 -y 444 --nclx 9/16/9` from the PNG is giving me this:
2025-11-24 07:58:05
maybe it needs the `--ignore-icc`?
2025-11-24 07:58:31
otherwise libjxl's tone-mapping ICC might be taking precedence over the CICP
2025-11-24 07:59:43
ah, never mind, didn't read the rest quite right
2025-11-24 07:59:55
(just woke up 😅)
AccessViolation_
2025-11-24 06:42:38
I'm pretty sure Firefox's color management isn't available on Linux, and changing about:config flags doesn't help
2025-11-24 06:45:09
I went down that rabbit hole like a week or two ago
2025-11-24 06:47:01
likewise it doesn't work on Firefox for Android
RaveSteel
2025-11-24 07:32:24
It used to work in firefox 135 IIRC, but has stopped working since
2025-11-24 07:32:35
heck, at this time I cannot even get Youtube with HDR to work anymore