JPEG XL

Info

rules 58
github 38692
reddit 688

JPEG XL

jxl-rs 0
tools 4270
website 1813
adoption 22069
image-compression-forum 0
glitch-art 1071

General chat

welcome 3957
introduce-yourself 294
color 1687
photography 3532
other-codecs 25116
on-topic 26652
off-topic 23987

Voice Channels

General 2578

Archived

bot-spam 4577

jxl-art

JXL Art Bot
2025-07-06 04:07:38
**\_wb\_** _“A selection of Occam's razors”_ 2025 image/jxl 31 bytes [source tree](https://jxl-art.lucaversari.it/?zcode=c8osSUktKMlQsOAKcg5RMDTm4uLKTFMI1%2FbT9QtXsFMw4FJQQOYbmZoCRRQUdBX8XBV0Lc2hnODUnNTkEgVDLhDHsSwdqD5cwZwLAA%3D%3D)
CrushedAsian255
**\_wb\_** _“A selection of Occam's razors”_ 2025 image/jxl 31 bytes [source tree](https://jxl-art.lucaversari.it/?zcode=c8osSUktKMlQsOAKcg5RMDTm4uLKTFMI1%2FbT9QtXsFMw4FJQQOYbmZoCRRQUdBX8XBV0Lc2hnODUnNTkEgVDLhDHsSwdqD5cwZwLAA%3D%3D)
2025-07-06 04:54:45
Nice title
JXL Art Bot
2025-07-07 09:44:35
**\_wb\_** _“Alien Muscle Tissue Sample”_ 2025 image/jxl 37 bytes [source tree](https://jxl-art.lucaversari.it/?zcode=c8osSUktKMlQsOAKcg5RMDLn4spMUwgoSi1TsFMwNDHgUlDQVXAsSw%2FX9gtX0DUEcoHSQI4ukGunAJJGFTEyNQWLQbU55uQAdQFNhYkFp%2BakJpcAbYMrAZtsaMkFAA%3D%3D)
2025-07-07 08:27:37
**\_wb\_** _“Entropie Émergente (Étude nº 241)”_ 2025 image/jxl 28 bytes [source tree](https://jxl-art.lucaversari.it/?zcode=c8osSUktKMlQMDTgcknNKUkMSMxJLSlJ5eLKTFMI1%2FbT9QtXsFMw4NJV8HNV0DUyMQSyHMvSgTIKhlwKCgpcAA%3D%3D)
2025-07-28 10:26:06
**dogelition** _“ITU-R BT.2111-3 (2K, 10 bit, full range PQ)”_ 2025 image/jxl 234 bytes [source tree](https://jxl-art.lucaversari.it/?zcode=rVaxctswDN3xFfwB3wEgaIlLhgy9TLm0HTL3EiXxkGsu8ZD8fW2XlCUBsGRfNvGBJAi8B0D3m8ftS6DcCtx0m%2BeXbSDOAj%2Fe%2F7x2d38%2FwmotYcUkcL3ZPnZv%2B70Iv7oHJsRw9xNg8xSew1VgghDqN%2B%2B%2Bj6t4WB3Wn7u1xKYAPdQw9lAPtjgEj3A7hg%2BGh51hCvcGUoYQVuF3tw2pZdfGqM8VS15%2F2wuYk2uLMTkvSJJggX%2FXe41eHEuUFswTaZiv%2F9jRadmTZcw3SZzyzRw13xGjxXdqGh3W3rCWxsr3QU9kZbUaW8uow9E28XlEJ5OUYX77ZfTF5MpDRVje32SY8er4rNSyjbfjgijeMsEJX6anElmDYHmPoD3n2mq%2B9r1BBr1mD%2BSotIejS%2B5HDyicoTpEo2ZQVYxiCTaiI1gh9ASbKJ4QrBKRXW%2Bm%2FpCjK9rMnrZashtAQxbTaxLNDDG4URSBYB7m%2BUv1gB6UidPbgApZCWfNEU26%2BBxHFhGzTfxkkt2hgHBOD3I9XT57zny2c%2Biy5rX4%2BuGBSZWrGi8cDmU9rvCxb2Pu1NFCDLNDpf6PqFIxnuELf9L5lC7rz0gCM1mLx7EK1qg4s96m1aZqrVYO5kU5c8TiZWxWxXievhfIbOE0RFhwswKPCvgH)
dogelition
2025-07-28 10:26:30
they updated the standard to change the position of the gradient, and the colors are quantized differently
2025-07-28 10:26:44
+ i found an optimization to save 1 byte
dogelition
2025-07-28 04:35:17
don't know if it was an android or chrome update, but this is actually fixed now on my device (poco f7 pro)
JXL Art Bot
2025-07-28 09:09:30
**\_wb\_** _“Stairs mutating”_ 2025 image/jxl 29 bytes [source tree](https://jxl-art.lucaversari.it/?zcode=c8osSUktKMlQsOAKcg5RMDTm4spMUwjX9tP1C1ewUzAyNeVSUNBVCFfQNTK1BDMdy9KB0uEKhlwA)
2025-08-03 02:07:42
**\_wb\_** _“Entropie Émergente (Étude nº -225)”_ 2025 image/jxl 31 bytes [source tree](https://jxl-art.lucaversari.it/?zcode=c8osSUktKMlQsOBySc0pSQxIzEktKUnl4spMUwjXDQ%2FX9QvX9gsPV7BTMOBSUAAJavsBxaB8BQVdheDUnNTkEgVdIyNTqIh7UWJKZmpeCVgJEteQCwA%3D)
2025-08-11 02:17:33
**eis** _“broken prism”_ 2025 image/jxl 33 bytes [source tree](https://jxl-art.lucaversari.it/?zcode=c0nNKUkMSMxJLSlJ5eLKTFPwC9f1U7BT0DXkUlAAcsPdPYA8AyBHQUFXIVzB0MgCyvZT0DUyNeUCMR3L0sO1%2FUByAA%3D%3D)
2025-08-11 02:17:54
**eis** _“broken prism”_ 2025 image/jxl 33 bytes [source tree](https://jxl-art.lucaversari.it/?zcode=c0nNKUkMSMxJLSlJ5eLKTFPwC9f1U7BT0DXkUlAAcsPdPYA8AyBHQUFXIVzB0MgCyvZT0DUyNeUCMR3L0sO1%2FUByAA%3D%3D)
2025-08-11 03:33:32
**eis** _“the smiling face”_ 2025 image/jxl 116 bytes [source tree](https://jxl-art.lucaversari.it/?zcode=zZFNC8IwDIbv%2BRW5yyDp%2BrWLICp4ElFhZ8G6DcbwUPz9dvELL166gy0lKWlfkuddhT6edqc%2BxBhgvzyihbo7xxaZlIZN6Jo2PnI4XPtuCIBpKSLM2qLiJlEpJ1HhPBEmKL3G1zGsANbD%2BYlsenTlHxmQj85qEmxj%2FIHuMzRTTsNjlmXDW4Xzm8mnx5aEnFKJoEvRe7SVwdIodIpQs0WX6toTOiOEUzRgtJa7JS916x7vnbLy31Uket6IM1%2BudBesZ9tiW%2BNc5ijwEOIzW9yaVMOC7w%3D%3D)
monad
2025-08-14 07:53:53
that'll teach me not to check this channel before sleep
Sirox 𒅌
2025-08-29 11:21:06
_wb_
2025-08-29 12:34:20
ok then
JXL Art Bot
2025-08-29 12:34:27
**\_wb\_** _“The Snake”_ 2025 image/jxl 110 bytes [source tree](https://jxl-art.lucaversari.it/?zcode=rZJNC8IwDIbv%2BRW5j0r3Ud3Jgyh6GsIOPQ8bXaGUIfn%2FmM4N6nm2hCd5C2%2FTjzMFHu5DIGYC6x2PWGqt4Ub%2BNfI3P3l2NM0rANBPwUcClKE3TSV2yaX6i8u2XhaTdlMzqtwZqLS4GQ2tUPKZErO%2BshYeMkpAnbER7jNKQJPRCE1O2a8xGev0UJfolrcC%2F0SrrFWdLTpr8YjpuEksOtGWGlFhT4EenC51Va7vwXmK8hXgpzQf)
2025-09-07 02:13:06
**\_wb\_** _“More Delta Palette Abstract Stuff”_ 2025 image/jxl 32 bytes [source tree](https://jxl-art.lucaversari.it/?zcode=c0nNKUkMSMxJLSlJ5XLKLElJLSjJULDg4spMUwjXDQ%2FX9QvX9gsPV7BTMOBSUAAJavsBxaB8BQVdBfeixJTM1LwSBV1DIEAXBAkgcY0A)
jonnyawsom3
2025-09-07 02:14:48
Delta palette my beloved
lonjil
2025-09-07 04:55:17
what the heck
Haley from hai!touch Studios
2025-09-12 10:21:13
The page is erroring out on Firefox *and* Chromium Android
A homosapien
2025-09-12 10:32:04
Which one?
Haley from hai!touch Studios
A homosapien Which one?
2025-09-12 10:37:18
https://jxl-art.lucaversari.it
JXL Art Bot
2025-09-12 10:38:20
**Haley Halcyon** _“Baby’s First Sierpiński Triangle”_ 2025 image/jxl 28 bytes [source tree](https://jxl-art.lucaversari.it/?zcode=C89MKclQMDQwMuHySM1MzyiBsJ0yS1JSC0AyXFyZaQoVCnYKBlwKCkBmJZQJ5viF6%2FrB%2BQoKugrBqUADoDyEvC5MCKbEAI0PtIWLC1UaKgEA)
2025-09-12 11:03:30
**Haley Halcyon** _“Randomized: Laser Slopes”_ 2025 image/jxl 136 bytes [source tree](https://jxl-art.lucaversari.it/?zcode=bVOxasMwEN31FdqNwDpJjrQUDA3NZAIdNKeJmgQ8pSa0kI%2Fv6ezYkuLNvJPv3bv37j30w2F%2F6MMwBOavp%2BHCwTRsF67ny0Cf7PrN97dwb79%2Btrcbf%2BOy0YzziEZ4wmCDGKFeeI%2BIkM4SNIJVJ7oRbtQEj4WPHaHWzCjngn8GJM%2BQ9n7uKmxRSbVhC0yIMwvTwz%2BwISiTsiD5Nk5ZQ8HSh%2BPABTQlVdv3OJSs0yZHGlTq5O3CB2nnqQmKjspkVqEN0SqkyQqkBsW8wOP8XWSpm6IWf%2FLkVTjxClaqs8ba5YMn7gHY1elxt6DK6fdTGKIC%2BaLAR4c3K8JwEXaOCHE%2BdY5uC%2BtYsbtKajUmrcOV4T8Onh1oG3o1YKB06lqSUW1WEyWkgXw1v%2Fi6sG0aUkpXwNTAGZatYI7okgOYfE1nhToJbkdnJFnOKE2WwT98pBQrMuNKa7NzVe4lgHR02q6551bM26IVpgw4nSLLYxHp0ut8XhJoKD2J8m0hRDS5Qz7uFnP7Dw%3D%3D)
2025-09-12 12:52:21
**Haley Halcyon** _“Waterfall Brushes”_ 2025 image/jxl 38 bytes [source tree](https://jxl-art.lucaversari.it/?zcode=c0nNKUkMSMxJLSlJ5QrPTCnJUDA0MDLh8kjNTM8ogbCdMktSUguAMhZcXJlpChUKdgoGXAoKQGYllAnm%2BAE5piZgnoKCrkJwaglUDiIbrgtSAJMHqXAvSkzJTM0rUdA2hosiVOoilIIUh4MdlJqioGuMXRxqCMJiCMvI1JQLAA%3D%3D)
ignaloidas
2025-10-19 02:00:53
Is there a reference somewhere on how Squeeze makes extra channels (and groups? idk how else to explain what I'm seeing)? Just guessing doesn't seem to work for me
CrushedAsian255
ignaloidas Is there a reference somewhere on how Squeeze makes extra channels (and groups? idk how else to explain what I'm seeing)? Just guessing doesn't seem to work for me
2025-10-19 08:05:55
Well there is the official specification but it’s a bit hard to read if you’re not already familiar with image compression systems
2025-10-19 08:06:10
Free versions of it are floating around this Discord
jonnyawsom3
ignaloidas Is there a reference somewhere on how Squeeze makes extra channels (and groups? idk how else to explain what I'm seeing)? Just guessing doesn't seem to work for me
2025-10-19 08:33:34
If you want a technical breakdown, there's a paper explaining all the features of JXL https://arxiv.org/abs/2506.05987v2 Specifically for JXL art, I'm not entirely sure how it works...
ignaloidas
2025-10-19 08:36:36
yeah, I was asking more on how it works for jxl art, seems like there's little control for squeeze in the current tool even if the standard allows for more flexibility (e.g. squeeze levels always go down to 8x8, even if I don't need/want them to do that)
2025-10-19 08:37:39
I guess time to read the specs and see how hard it is to make a tool myself to construct the MA trees and header
Inner Hollow
2025-10-19 08:42:47
i am dumb i can grasp the logic behind the logic tree but i still need a video tutorial
2025-10-19 08:42:51
is there a video tutorial
JXL Art Bot
2025-10-19 09:55:32
**PetrKDN** _“View from Space”_ 2025 image/jxl 35 bytes [source tree](https://jxl-art.lucaversari.it/?zcode=c8osSUktKMlQsOBySc0pSQxIzEktKUnl4spMUwjX9tP1C1ewUzDg0lXwc1XQtYQAIM%2BxLB0oqwDmKSgocAEA)
𝖇𝖔𝖇𝖔𝖇𝖔
2025-10-20 04:50:45
Where is this bot getting its art from
2025-10-20 04:51:01
Can anyone showcase their art here too
2025-10-20 04:51:04
?
jonnyawsom3
2025-10-20 05:10:17
When people submit their art on the website, the bot posts it here
2025-10-20 05:11:47
If it's regular art instead of made with MA trees, probably fine to post in <#803950138795622455> or <#806898911091753051>
monad
𝖇𝖔𝖇𝖔𝖇𝖔 Where is this bot getting its art from
2025-10-20 09:35:18
click the "source tree" link
𝖇𝖔𝖇𝖔𝖇𝖔
2025-10-20 10:58:40
Ah alr thx for the info
Inner Hollow
𝖇𝖔𝖇𝖔𝖇𝖔 Where is this bot getting its art from
2025-10-20 07:57:35
i learned that if you press publish on the art site a bot publishes it here
2025-10-20 08:02:51
whats the easiest way to make seemingly random noise image?
2025-10-20 08:05:06
wait what
2025-10-20 08:05:16
every time i press run without changing anything it changes the image
2025-10-20 08:05:21
im stupid
2025-10-20 08:05:25
what am i doing wrong
jonnyawsom3
Inner Hollow whats the easiest way to make seemingly random noise image?
2025-10-20 08:05:56
https://discord.com/channels/794206087879852103/824000991891554375/1365778611570741372
Inner Hollow every time i press run without changing anything it changes the image
2025-10-20 08:06:26
Can you press the share button and paste the link here?
Inner Hollow
Can you press the share button and paste the link here?
2025-10-20 08:06:47
https://jxl-art.lucaversari.it/?zcode=dVDLCsIwELznK_ZeAkmfngQV0VMEFXKWGttcqkgQ_Xt32_QRqrfZYWdmZ9fWXc3D1bBgh6c1jbs4e2-gYMfNGXLG7A0-sAQZMwDEJWKBEICD8gjpN9KZ6MaW0Ls9UZ6g7dWrUpHSEEE8Y7eI4lFMbmkhwjVNYj5qh5BxL4iRP2jKkV2RtlSS9wXKiZEf5TQqLNh5nozDg-ZcKubK8Brt7wh1MhPsbyC9Owoeqsgk6wto3OeDAUYYW9XOXIFLNg1J2oO_
2025-10-20 08:06:54
im still learning tho
2025-10-20 08:07:06
so i could totally be missing something
jonnyawsom3
2025-10-20 08:08:41
It fails to decode for me ```JPEG XL decoder v0.12.0 6efa0f5a [_AVX2_] {Clang 20.1.8} Failed to decode image DecompressJxlToPackedPixelFile failed```
Inner Hollow
2025-10-20 08:08:50
huh
It fails to decode for me ```JPEG XL decoder v0.12.0 6efa0f5a [_AVX2_] {Clang 20.1.8} Failed to decode image DecompressJxlToPackedPixelFile failed```
2025-10-20 08:11:20
jonnyawsom3
2025-10-20 08:13:03
Oh, it's a noise texture? It's just black for me with a few random pixels every time I press run
Inner Hollow
2025-10-20 08:13:58
hm thats odd
2025-10-20 08:14:17
shouldnt... the.. thing work the same on every device..?
TheBigBadBoy - 𝙸𝚛
2025-10-20 08:47:35
I have the same as jonnyasom2
2025-10-20 08:47:45
maybe try to delete cache?
JXL Art Bot
2025-10-21 01:57:59
**Jonnyawsom3** _“All RCTs (No-Channel-Permutation)”_ 2025 image/jxl 894 bytes [source tree](https://jxl-art.lucaversari.it/?zcode=7ZS%2FTsMwEMb3ewq%2FAJLtuE66ILUwMKCoAqTMFQ2tB1pUDIK3xwmBxME34fGbcved7%2FO%2F%2BLc6uuetd6cjXb%2Bd%2B0AoKSWtnd%2B1L%2F4gKmrcLny1NBXdtG5%2F8N%2Fx3dWDkFSf%2FO321RO5J%2FEoLoMixBCqEPbJx6AP6WZzbt8nkhAXopllahz%2BGQ3t%2BuftXUv9J1d22rQPHbqaDBm0Qk%2B0UTWROuqLmd5Ndd%2F2J8JWJONVMB1qadlKerXcDIrzMZKrFDbtpZdsh%2BYqqfPWJrUDzc1aMt4ld0SlZpy4m7MVV0ivlPNnb5M7noox4i6N%2B8EkJR5KSOt%2B14ZSo3%2FfCM1r0XMNSRO5xB7jQ%2F3RafUvnCjgBDgBToCTPDjRwAlwApwAJ3lwUgAnwAlwApzkwYkBToAT4AQ4yYOTBXACnAAnwEkenFjgBDgBToCTPDgpgRFgBBgBRr4A)
jonnyawsom3
2025-10-21 01:59:52
embed
2025-10-21 01:59:56
https://embed.moe/auto.gif?q=https%3A%2F%2Fcdn.discordapp.com%2Fattachments%2F824000991891554375%2F1430012686086967346%2FRCTs.jxl%3Fex%3D68f83a98%26is%3D68f6e918%26hm%3D7d64339e7b96916e02936b946e6be5e2ee9b9571d57d2fc7fd2dae1f7d3297b5%26
jonnyawsom3
2025-10-21 02:01:10
The JXL plays at 1 fps, so sorry about the epilepsy from the bot
2025-10-21 02:05:25
embed
2025-10-21 02:05:29
https://embed.moe/auto.gif?q=https%3A%2F%2Fcdn.discordapp.com%2Fattachments%2F824000991891554375%2F1430014080449511495%2FPhoton_Noise_Frame_Seed_Demo.jxl%3Fex%3D68f83be5%26is%3D68f6ea65%26hm%3Db1d691ca47dc463287c1e49f4f8f133a15edd3fa64bec48568652749073a5e2a%26
jonnyawsom3
2025-10-21 02:05:49
Discord previews strike again
_wb_
Inner Hollow https://jxl-art.lucaversari.it/?zcode=dVDLCsIwELznK_ZeAkmfngQV0VMEFXKWGttcqkgQ_Xt32_QRqrfZYWdmZ9fWXc3D1bBgh6c1jbs4e2-gYMfNGXLG7A0-sAQZMwDEJWKBEICD8gjpN9KZ6MaW0Ls9UZ6g7dWrUpHSEEE8Y7eI4lFMbmkhwjVNYj5qh5BxL4iRP2jKkV2RtlSS9wXKiZEf5TQqLNh5nozDg-ZcKubK8Brt7wh1MhPsbyC9Owoeqsgk6wto3OeDAUYYW9XOXIFLNg1J2oO_
2025-10-21 08:09:50
it's a malformed tree, it misbehaves when you do that. you have ``` if y > 12 [then something] [else] if y > 136 ```
2025-10-21 08:10:52
the `y > 136` is not an allowed test in the branch that has y <= 12, since it will always be false. Only tests are allowed that can still split the remaining range.
2025-10-21 08:11:19
I'm not sure what exactly happens in this case but I think it just writes a bad jxl that the decoder will refuse to decode
Magnap
2025-11-10 09:01:57
I'm not entirely sure which channel this would fit in, but I think the best fit here: is there a tool to extract the MA tree from a Modular JXL? Or just setting all the residuals to 0? Essentially converting an arbitrary JXL into its underlying JXL art I know that the prediction models that the MA trees describe are autoregressive, so the resulting images probably wouldn't be all that interesting-looking without the residuals to guide the prediction process in the right direction I tried looking at the various crates, but I didn't spot a way to manipulate the bitstream in this way
AccessViolation_
Magnap I'm not entirely sure which channel this would fit in, but I think the best fit here: is there a tool to extract the MA tree from a Modular JXL? Or just setting all the residuals to 0? Essentially converting an arbitrary JXL into its underlying JXL art I know that the prediction models that the MA trees describe are autoregressive, so the resulting images probably wouldn't be all that interesting-looking without the residuals to guide the prediction process in the right direction I tried looking at the various crates, but I didn't spot a way to manipulate the bitstream in this way
2025-11-10 09:33:34
I don't know if we have a tool for that, but we do have the code for generating these: [The JPEG XL Image Coding System](https://arxiv.org/pdf/2506.05987#subsubsection.5.2.3)
2025-11-10 09:34:34
so this does give you the MA tree as well
Magnap
2025-11-10 09:41:53
Ah that's cool 😄 figure 26 is (cooler than) the sort of thing I had mind, but for arbitrary trees
veluca
2025-11-10 09:42:17
that's in the encoder IIRC though
2025-11-10 09:42:48
(not that it'd be too hard to do that in the decoder too, with some code change)
AccessViolation_
2025-11-10 09:42:53
you could potentially try altering the code to replace all would be residuals with 0 at encode time, though prediction error is a property which itself can be used as a decision node in MA trees, so there might be side effects that mess everything up depending on how you do this
2025-11-10 09:43:37
iirc the images in figure 26 are entirely created using the jxl art tool
Magnap Ah that's cool 😄 figure 26 is (cooler than) the sort of thing I had mind, but for arbitrary trees
2025-11-10 09:49:50
I was messing around with the code used for generating Figure 27 some more here https://discord.com/channels/794206087879852103/1346574799396147220
2025-11-10 10:06:46
I thought there were more examples there, I think I posted a handful in some channel instead
Magnap
AccessViolation_ you could potentially try altering the code to replace all would be residuals with 0 at encode time, though prediction error is a property which itself can be used as a decision node in MA trees, so there might be side effects that mess everything up depending on how you do this
2025-11-10 10:40:15
Oh yeah, that's a second level of autoregression kinda
jonnyawsom3
AccessViolation_ so this does give you the MA tree as well
2025-11-10 03:13:47
Kinda. It gives you the tree in a formatted graph file, so you can't edit it or use it for another en/decode
AccessViolation_
2025-11-10 03:14:50
yeah that's what I meant ^^
jonnyawsom3
2025-11-10 03:17:56
MA tree saving/loading has been brought up a few times as something for the API. It'd be nice if it was formatted to match jxl_from_tree, then we could do such editing with existing tools
pshufb
2025-11-20 09:48:45
my algorithm for creating this sucks but it's supposed to resemble the mona lisa 🤷‍♂️ https://jxl-art.surma.technology/?zcode=lVixkt02DOzfV7zekxkCBEmwcRE3rp3M5APii32diyt8f5_TkwVQwg7N6ziSKIDAYrHgP89fX77fqfHt89Pzt-8vdy719ufzy9enH2_P9fbl09_3dLs9_3d_vX-8U27b8ufbUtUelnwsOZEtmbflv9sHtz_ufz293D9wOR6l41HOtrJfk3_nW2vcWo6VuFWSuLWHrVKPVc3h-xxNVXvZybws1SKg6Z1nrdFqC9-X0X74v8T_X46wexnTIDmaaseqFdua35lBiV7maErUTsUOFjGrnksQJY5RevMyIEj4WBWQ3xR9sn-UuhKuamfWNR_FfgaQEv1hOQd8B1m34-Vj1Zq97upV2OIhIlxaP1ZEMUo1noLYwkQ11hnFOmODFQ_eiac9WZ56zBPPKkLD9yVik5IlirJa-KItLzDfS5aEX0W0ew82J2DYUE6SV44mFqoqnlPDsVhFN1nzvrr30YEOXC7FMwmqQMMO9TOSYRMAg2MB5Tac-zhiRC2lCNsNelY5kXEksncfEGzstkNvT6mhMAMU9kk3UF7i5TypftRtPMJ5JZisZ1w9oFOtUZW2ROM8a05TGvfwWUxJZIl385l3HwCKzb-kGfYY1Fc8X6EzdTw0TLQUC7N5ISFepQlJFavkavVByRVE9kpn_wDUAQC1V4GWpRbUzj_brDaHS_JGwtnFQ1npC11H1lmJkPk-xAUQh0Rb1ZpWi2lviIidTKitMGczGgSqritgWudNclG8M-IumtM7NYjMlDCqxTaRs6h45JKw3ZZXL-DVrBOzCCeRN5UGB8zUoPxoSbuPJb2i1ax-u6w04mxolnLmpKFQtoegSbZYp-RjCml2eBBodgBcagzJbLzVaAmYtXijjI2tRF-1XhTh5qq2s_LYnvV-yd_pzwqEWHaxqemsXn8Hmy1WplFAKclMJhq_gFYqQGDm887HYdOKmp7ycetTMQ3ELwD-AEzHIC2dSs4M-eD-NfocRXDMdAfCs_BFRj4ybSLPGZIvCmXnSkBgMus4uax5Vb0W8gq5uRr2iRjM0mBsl34ecH83KzQ-w2QvK51oUikTd2tbKfVm3N2XilDNSV2SJx7v4i2ehhuTY-XCb5jQqKBZABSRS2sC2pqAuKbanIlohbt6H8XEMTQYZEvyA_jdSYnactAf7o34azT_gExTc_B3BmFCw6CfmSuwkmZT1mYwbAFjzuksXuYgLQRcZO893JfaW_JDJQORGsSy5aVfJcb2WsoSjPt5Kr_AC2SneHaaGfP7OFBt4C9SJhqn0IRCuov3BDINpkcSnt0UyOwWphhh-RVsXSoqkkEWORmUlRmg5QgLb2II_jwrMjDhDzKgXQa3vXWByDJgJ53Z7XWOaWMYMASgrLRB8doYDvgBmOXhmgykT9c4kS55fChnGzHBaNIBo9fhXhTcdMk0ZsO9rywNouU8Tf40wno138_oAtOvAzn5dR1qRjQ7LYF7vY7uYGnGk6DTe79zSeuNyhdg2Mm61oWdfhjcJCuoDO6Xm-TX07U2iLyCzPvFF9W6pHr6ufgetmKqKrhDzKMkjrlF49cQIGcR0OQzKgMFUyOYfjqgVtJptwejBTnhoXsYjcjtFaC-OmXJZMabXwSWlQGg-bTV1yQQD0t3E4WH5i0SSS6ejnduD4ghNKwMjAZ2aAxfHy72_wc if you run it through libjxl w/effort 9 it does better 🫢 (edit: as in, libjxl does better. again, the algorithm kind of sucks 😔 )
_wb_
2025-11-21 07:38:27
we should add a way to jxl-art to specify the residuals per node (say, as a list of numbers followed by another list of numbers that gets repeated as long as needed), instead of only allowing infinitely repeating zeroes in all nodes (which would be `[], [0]`). That would make it a lot more expressive, since you'd no longer have to rely purely on the predictor offset like it is now.
pshufb
_wb_ we should add a way to jxl-art to specify the residuals per node (say, as a list of numbers followed by another list of numbers that gets repeated as long as needed), instead of only allowing infinitely repeating zeroes in all nodes (which would be `[], [0]`). That would make it a lot more expressive, since you'd no longer have to rely purely on the predictor offset like it is now.
2025-11-21 05:30:34
that would be wonderful!
itszn
_wb_ we should add a way to jxl-art to specify the residuals per node (say, as a list of numbers followed by another list of numbers that gets repeated as long as needed), instead of only allowing infinitely repeating zeroes in all nodes (which would be `[], [0]`). That would make it a lot more expressive, since you'd no longer have to rely purely on the predictor offset like it is now.
2025-11-25 04:04:53
My current project is semi related to this (setting residuals)... more to come... 🤔
2025-11-25 05:45:13
My script finally finished.... May I present the first ever JXL hashquine! This JXL image displays its own MD5 hash! ```bash $ md5sum jxl-hashquine.jxl c0dec000ec179f9af04ef4d7ee0c6c59 jxl-hashquine.jxl ```
2025-11-25 05:49:50
I'll do a technical writeup of this at some point but whew it involved so many hacks to get working
AccessViolation_
2025-11-25 05:59:04
woah!
2025-11-25 05:59:05
impressive
veluca
2025-11-25 06:00:43
I imagine having the md5 start with 'c0dec000' was for extra flexing
itszn
veluca I imagine having the md5 start with 'c0dec000' was for extra flexing
2025-11-25 09:38:00
To be honest that was the easiest part. You can brute force 32bit prefixes of md5s in about 5 min on a laptop
veluca
2025-11-25 09:38:29
yep, that makes sense
2025-11-25 09:38:48
did you do patch copying + arbitrary bytes in the red part for changing md5?
itszn
veluca did you do patch copying + arbitrary bytes in the red part for changing md5?
2025-11-25 09:42:36
Yes I modified jxl_from_tree to allow arbitrary error bytes to be supplied, but I also had to do a bunch of messing with the encoder and compression settings, such as crafting a specific Huffman tree that allowed me to replace arbitrary bytes in the file after encoding
veluca
2025-11-25 09:43:03
ahhh nice trick
2025-11-25 09:43:50
I am guessing you could have gotten the same result possibly more easily by adding a 8-bit huffman code for a patch frame that never actually got used
lonjil
2025-11-25 09:44:00
now to nerdsnipe someone into improving jxl_from_tree by a lot by announcing a "smallest jxl hashquine challenge"
itszn
2025-11-25 09:46:13
You can certainly make it a lot smaller, most of the size comes from the lack of compression. I think if you change up the Huffman tree you probably can trivially reduce the size by at least a factor of 8. Could also do it in fewer frames, but the prediction tree complexity was growing so I decided to split it into 32 frames
lonjil
2025-11-29 02:54:05
is it just me or does the publish button not work?
2025-11-29 02:55:38
**Lonnie** "*Flag of Cornwall* 2025 image/jxl 42 bytes [source tree](<https://jxl-art.lucaversari.it/?zcode=C89MKclQMDQwMODySM1MzyhRMAMynTJLUlILQBJcXJlpChUKdgqmJpZcCgpATiWQYwzmKCjoKgSnligYgNlQKSOoFEzSEIVnADEDZKAJihmGyGYYo5lhAOVhWIFuCVwDAA>)
JXL Art Bot
2025-11-29 03:59:43
**\_wb\_** _“Cornwall flag”_ 2025 image/jxl 42 bytes [source tree](https://jxl-art.lucaversari.it/?zcode=c8osSUktKMlQMOQKz0wB0QYGBlweqZnpGSUKZkAmV2aaQoWCnYKJiQGXggKUY2oG4oC5lUCukQmECxcwNoMJKCjoKgSnliig8w25MGURMmjmYpiKaiayiTAZLgA%3D)
_wb_
2025-11-29 04:00:12
oh lol I didn't see this was already done
Meow
2025-11-29 04:11:47
For reference the SVG file size on Wikimedia Commons is 359 bytes https://commons.wikimedia.org/wiki/File:Saint_Piran%27s_Flag.svg
TheBigBadBoy - 𝙸𝚛
2025-11-29 04:16:23
or 277B once optimized <:KekDog:805390049033191445>
AccessViolation_
2025-11-29 04:31:31
compressed to 184 bytes with `brotli --best`
2025-11-29 04:32:28
zstd compresses it down to 200 with the best compression. I assume brotli's advantage here is that it has a spec-defined dictionary trained on SVGs among other things
TheBigBadBoy - 𝙸𝚛
2025-11-29 04:36:07
199B with gzip
AccessViolation_
2025-11-29 04:36:19
since zstd supports signaling custom dictionaries, I wonder if at some point the web standard will define zstd dictionaries per IANA media types. so one for `image/jxl` trained on a large corpus to compress a lof of the header away, certain ICC profiles which are duplicated a lot etc.
2025-11-29 04:37:12
same philosophy of brotli, except brotli to my knowledge has a single dictionary trained on a bunch of data
2025-11-29 04:37:41
hmm I wonder if I can download that training data and derive a zstd dictionary from it, and see how it compares
TheBigBadBoy - 𝙸𝚛
2025-11-29 04:37:51
but the post here https://discord.com/channels/794206087879852103/794206087879852106/1444335869778464958 claims the SVG is 186B, trying to find it online but can't
itszn
itszn My script finally finished.... May I present the first ever JXL hashquine! This JXL image displays its own MD5 hash! ```bash $ md5sum jxl-hashquine.jxl c0dec000ec179f9af04ef4d7ee0c6c59 jxl-hashquine.jxl ```
2025-11-30 07:46:43
Here is my final larger cleaned up version. I ended up reducing all the logic down to one frame with one massive prediction tree. I think I can reduce the file size further (maybe cut it in half) if I write some more optimizations on my naive tree algorithm (most of the tree size come from rendering the digits). Also unfortunately I did not manage to get the 8x size reduction from better huffman codes because the bit flips were causing mis-alignments... The final cover image was directly injected into the residual bitstream in jxl_from_tree. ``` $ md5sum shark_hashquine.jxl c0dec0007b5246f7428936d9bed2f446 shark_hashquine.jxl ```
2025-11-30 07:47:14
Here is what the tree logic "circuit" traces look like
ignaloidas
2025-11-30 08:20:28
that's one of the coolest hashquines I've seen, very nice
veluca
itszn Here is my final larger cleaned up version. I ended up reducing all the logic down to one frame with one massive prediction tree. I think I can reduce the file size further (maybe cut it in half) if I write some more optimizations on my naive tree algorithm (most of the tree size come from rendering the digits). Also unfortunately I did not manage to get the 8x size reduction from better huffman codes because the bit flips were causing mis-alignments... The final cover image was directly injected into the residual bitstream in jxl_from_tree. ``` $ md5sum shark_hashquine.jxl c0dec0007b5246f7428936d9bed2f446 shark_hashquine.jxl ```
2025-11-30 08:36:20
fwiw, you can render digits using patches and that might be easier 😄
itszn
veluca fwiw, you can render digits using patches and that might be easier 😄
2025-11-30 08:40:05
I have not tried to do anything with patches yet. Is there a way to conditionally select a patch based on existing pixels in the image? Each 15x15 region here can render any of the 15 digits based on the pixel value on the "wire" plugged into it
veluca
2025-11-30 08:45:34
I did that by having 16 extra alpha channels that are either 0 or 1 and using them for blending
2025-11-30 08:46:40
so you always have 16 patches (one per digit), but you can use channels as a bitmask to choose which character you actually use
itszn
2025-11-30 08:46:54
Gotcha, I considered a similar thing, but with the current compression setup I have, each additional channel adds considerable size to the final image file
veluca
2025-11-30 08:47:44
ah, you can get all that data from the color channels using prev-channel properties for the extra channels
2025-11-30 08:48:00
you just need 3 nodes per extra channel, I believe
itszn
2025-11-30 08:48:58
I think I need to see if its possible to mark a channel as not having any residual data associated with it? Right now each channel has WxH tokens of residual data (mostly all zeros) and with bad compression it gets large
veluca
2025-11-30 08:49:05
basically `if {PPrev-N} > N { if {PPrev-N} > N+1 { 0 } else { 1 } } else { 0 }`
ignaloidas
2025-11-30 08:49:21
all 0 residuals are basically free
veluca
2025-11-30 08:49:36
and you can use a histogram that says "residuals are 0" for those channels and you use ~0 bytes
ignaloidas
2025-11-30 08:50:08
histogram with 0 symbols = all 0 values from the entropy coding
itszn
veluca and you can use a histogram that says "residuals are 0" for those channels and you use ~0 bytes
2025-11-30 08:50:56
Is it possible to have a histogram that only applies to a single channel and a different one for the other channels in a single frame? Right now I can't have an unbalanced histogram due to how the bitflips work. I did try having something like that where zero tokens were 1 bit each but ya it failed to work with my bit flip setup
veluca
2025-11-30 08:52:31
yup, every leaf can have a different histogram
itszn
2025-11-30 08:53:21
Ok I'll have to look into that, I think that would save a lot of space, by only having this bad histogram on the one channel where it is needed
JXL Art Bot
2025-11-30 02:16:29
**\_wb\_** _“Heat”_ 2025 image/jxl 53 bytes [source tree](https://jxl-art.lucaversari.it/?zcode=TYuxCgIxEET7%2FYrpQ2Q3sRZU5Cxki0NILXdR03iiQfDvTfCIFjM83u5sUh7jPV8hTP32CPHUx8EJM%2FaHjnRKzwhesCslFVrV%2BJJlZSJKZwxYgQko%2BJ4RsFBYmTFAvvdg1GpoT9XYEIoyGn66TrrHaUzxlv%2FU%2BnVRoztYR03UIcR5%2BgA%3D)
lonjil
2025-11-30 05:10:52
How does specifying noise in jxl_from_tree work? A graphic designer made a really nice looking gradient background with noise for a nonprofit I'm a member of, but we had to change it to a pure gradient because the noise bloated the filesize way too much. With both Chrome and Firefox getting JXL support in the near future, it might be worth trying to make a small JXL art version of the original image.
jonnyawsom3
lonjil How does specifying noise in jxl_from_tree work? A graphic designer made a really nice looking gradient background with noise for a nonprofit I'm a member of, but we had to change it to a pure gradient because the noise bloated the filesize way too much. With both Chrome and Firefox getting JXL support in the near future, it might be worth trying to make a small JXL art version of the original image.
2025-11-30 05:34:34
Noise is entered as the 8 LUT values from dark to light Here's some numbers I grabbed from libjxl as an example `Noise 0.166 0.169 0.053 0.04 0.034 0.03 0.028 0.026` <https://jxl-art.lucaversari.it/?zcode=88vPLE5VMNAzNDMDk5ZA0sDUGESagAhjCAkijCzApBmXU2ZJSmpBSYaCBVdEpBMXV2aaQrKCnYIBl4IClGkIZCoo6CoEp5Yo6JoaGCBxITxdhXAFIy4uAA>
lonjil
2025-11-30 05:36:14
hmm
2025-11-30 05:36:54
also huh how does XYB work in jxl_from_tree? -500 and +500 being valid don't make a lot of sense for 8 bits.
jonnyawsom3
2025-11-30 05:41:27
Oh right, I just did -500 and +500 to get a gradient down the middle, I didn't think about it much
lonjil
2025-11-30 06:28:43
I guess the bit depth only matters after conversion from XYB to RGB
jonnyawsom3
2025-11-30 06:48:35
Bit depth was also a random number, probably don't need it
_wb_
2025-11-30 07:50:34
XYB in jxl_from_tree uses some default quantization, you can actually adjust those too. The default quantization for xyb in modular mode is just something I considered fine-grained enough to get sufficiently high quality lossy modular. It's something like 11 bit or so
2025-11-30 07:52:12
Modular mode has no problem representing negative numbers, in XYB it makes sense to do that (so grayscale has X=B=0). It is the same when you do the YCoCg RCT when using RGB.
lonjil
2025-11-30 07:52:51
right
2025-11-30 07:53:11
adjusting the XYB quantization, is that XYBFactors ?
_wb_
2025-11-30 09:08:15
I forgot the syntax but that could be it, yes.
Traneptora
2025-12-03 06:43:14
did the syntax of JXL Art change?
jonnyawsom3
2025-12-03 06:50:53
There have been additions and YCoCg changed to RCT 6, but nothing breaking AFAIK
username
2025-12-03 08:04:01
I remember I had to use an older version of the site to view some really old JXL art from a few years back because it looks different now
2025-12-03 08:04:23
soo uh I think something changed at some point but I have no clue what and when
lonjil
2025-12-03 08:06:32
the RCT numbering changed
Magnap
2025-12-03 08:21:20
btw, how does the jxl art encoder entropy-encode? borrowing the code from libjxl, or something custom?
A homosapien
2025-12-03 08:30:00
I think it's ANS.
monad
username soo uh I think something changed at some point but I have no clue what and when
2025-12-04 01:57:41
as for looking different, that can happen with decoder changes too. spline rendering and limits changed over time, some trees no longer decode, and it's always possible that arts producing out-of-spec files will render differently.
ignaloidas
Magnap btw, how does the jxl art encoder entropy-encode? borrowing the code from libjxl, or something custom?
2025-12-04 05:15:46
borrowing from libjxl, the website is essentially jxl_from_tree from libjxl just on a website
Magnap
ignaloidas borrowing from libjxl, the website is essentially jxl_from_tree from libjxl just on a website
2025-12-04 05:17:05
The latter part I had guessed, I just somehow didn't realize jxl_from_tree was from libjxl. Thanks!
Traneptora
lonjil the RCT numbering changed
2025-12-05 12:30:24
how so?
lonjil
2025-12-05 12:31:32
the way jxl_from_tree interpreted the RCT command changed, so older files will have different colors if run through a newer version of jxl_from_tree
Traneptora
2025-12-05 12:31:48
is there some kinda mapping?
2025-12-05 12:33:35
i.e. what used to be RCT 1, what is it now?
lonjil
2025-12-05 12:34:20
YCoCg used to be RCT 1, now it's 6. Not sure what the mapping actually is.
Traneptora
2025-12-05 12:35:44
that's what I actually cared about 😅
2025-12-05 12:36:03
`sunset.jxl` https://jxl-art.lucaversari.it/?zcode=jVPBTsMwDL3nK3zeFM3J2gEXJJiAHVBBG1LOFQ1thNqiLUPb3-O0KU27CnGLn_Psl2fn3thMf9kCBDJlMjpIjK7ZRpu8sATKiG3Xb7BiL3ujK5taU1dwxR73aalf6wPwJSJwiciY-YB3uAVkAIsZrIt9XaYwW1DoM4KOTZBTINsIgMNOW-Ax-pjyJ8pHXdwgiitFIBe_oCOqS6BntXVJ3mRX3yW8TtVAjugCcaRrFQ85c1iOOPwGvQfPx8CBs2vfcim1-zxDWmVQ1kdy1VSH9t4_hDo3njYELQdPv_vOk3ni9MQBTpcTxRNnXYwYJHrKA53iUaap01tLevXJ6kBup9ZnTWXs5VM6Aa77CgftqYVzewg15gWOO5t02lfzVggU8XBsAifsEdP2SDZpgewGs6Wp1GWlD39NxO3icA-a_6Izp2W8QjJcIdWOYpIajZhuYj8
_wb_
lonjil YCoCg used to be RCT 1, now it's 6. Not sure what the mapping actually is.
2025-12-05 02:40:37
recent jxl_from_tree just uses the mapping from the spec the older one used the mapping that was used a long time ago, where 0=RGB (noop), 1=YCoCg, and 2+X gets mapped to RCT X in the numbering from the spec
jonnyawsom3
2025-12-05 05:26:52
A while back I made a demo of all the RCTs (without channel permutations) https://jxl-art.lucaversari.it/?zcode=7ZS%2FTsMwEMb3ewq%2FAJLtuE66ILUwMKCoAqTMFQ2tB1pUDIK3xwmBxME34fGbcved7%2FO%2F%2BLc6uuetd6cjXb%2Bd%2B0AoKSWtnd%2B1L%2F4gKmrcLny1NBXdtG5%2F8N%2Fx3dWDkFSf%2FO321RO5J%2FEoLoMixBCqEPbJx6AP6WZzbt8nkhAXopllahz%2BGQ3t%2BuftXUv9J1d22rQPHbqaDBm0Qk%2B0UTWROuqLmd5Ndd%2F2J8JWJONVMB1qadlKerXcDIrzMZKrFDbtpZdsh%2BYqqfPWJrUDzc1aMt4ld0SlZpy4m7MVV0ivlPNnb5M7noox4i6N%2B8EkJR5KSOt%2B14ZSo3%2FfCM1r0XMNSRO5xB7jQ%2F3RafUvnCjgBDgBToCTPDjRwAlwApwAJ3lwUgAnwAlwApzkwYkBToAT4AQ4yYOTBXACnAAnwEkenFjgBDgBToCTPDgpgRFgBBgBRr4A
_wb_
2025-12-05 05:29:51
Oh cool I didn't know animations actually get rendered as animations in the online tool
jonnyawsom3
2025-12-05 05:35:24
Unfortunately the Discord embed bot doesn't maintain the timings, so it was quite the epilepsy risk last time I tried https://discord.com/channels/794206087879852103/824000991891554375/1430012701668675686
2025-12-05 05:44:08
It'd be nice if I could animate a real image with different RCTs to show the effects more clearly, but I'd probably have to do some trickery with partial loading to avoid the decoder running the reverse transform
2025-12-05 08:45:15
Thinking about it, that would be yet another use case of expanding djxl options. Disabling features like RCT, Patches, Noise, ect to reveal the image as it's stored
JXL Art Bot
2026-01-06 12:26:15
**Anonymous** _“lol ”_ 2026 image/jxl 73 bytes https://jxl-art.surma.technology/?zcode=C89MKclQMDQwMuHySM1MzyiBsLmCC3Iy81K5DBUMKIEDrt%2BUQv3GBgYKxqZADKTNTA24XPNSoCEzGkJQ%2FYZGCibA0DG1AGIQDeSbAWkTExM4Hyg%2FGnIY%2Bs2NTMBpC0SjpS1dheDUEgVtAwA%3D
2026-01-25 10:00:23
**\_wb\_** _“Flares”_ 2026 image/jxl 52 bytes [source tree](https://jxl-art.lucaversari.it/?zcode=ZYvLCsIwFET39ytmXwJ5QLITqkhdRVuErKWNbaBUkSD4915LKQV3Z87M7FPu4jMPUJKa2GolJS41NYcrLJ1fKU75ltNjgiFKd7TYQRHA%2BGGUjICAh1ALhm2vtZ41x1CdWJg5%2Fnblu%2FeFDyj%2B3JHJrDc%2BWWu3k3IcIZxzqwsx9UOOHb%2B%2B)
monad
2026-01-25 12:07:17
missing the "alien" branding
hjanuschka
2026-02-03 03:36:50
https://www.januschka.com/jxl-art/
_wb_
2026-02-03 04:03:25
why are the + and - wiggly red underlined like a complaining spellchecker?
hjanuschka
2026-02-03 05:22:33
fix is underway, "16" in front killed my keyword marker 😄
2026-02-03 05:22:50
⁨``` Bitdepth 8 Width 256 Height 256 Gaborish 16BitBuffers XYB XYBFactors 4096 512 256 EPF 2 if c > 1 - Set 128 if c > 0 if x > 128 - Gradient +2 - N -1 - Set 200 if y > 128 - W +1 - Set 100 ```⁩
2026-02-03 05:23:02
2026-02-03 05:24:13
just need to figure out why chrome-native jxl fails to handle the 16bitbuffers
2026-02-03 05:24:22
(art thing, now uses png output in this case, eventhough it says "JXL Native" in the top area)
veluca
hjanuschka https://www.januschka.com/jxl-art/
2026-02-03 11:44:22
(if it's not clear: this is currently https://github.com/veluca93/jxl-art/pull/3, I will merge and upload to jxl-art.lucaversari.it once y'all tell me you like it :D)
AccessViolation_
2026-02-04 10:15:48
crabbified JXL art :3c ```rust fn main() { let art = jxl_art::Art::new() .bit_depth(8) .width(256) .height(256) .gaborish() .sixteen_bit_buffers() .xyb() .xyb_factors(4096, 512, 256) .epf(2) .tree( ma_tree!( if c > 1 - Set 128 if c > 0 if x > 128 - Gradient +2 - N -1 - Set 200 if y > 128 - W +1 - Set 100 ) ) .build(); } ```
veluca
2026-02-04 10:51:55
what's that 👀
2026-02-04 10:52:31
⁨`ma_tree!`⁩ is clearly a proc macro
AccessViolation_
2026-02-04 10:55:41
people were talking about the jxl art syntax so I was playing around with what it could look like when exposed as a Rust library
2026-02-04 10:55:59
not a real library, sorry to disappoint 😅
veluca
2026-02-04 10:56:08
ah that makes a bit more sense 😄
2026-02-04 10:56:31
tbh the syntax was chosen because it was easy to parse in C++, not because I thought it was the best syntax ever
AccessViolation_
2026-02-04 11:01:18
if you want type checking without the complicated proc macro, you could directly build an AST by using nested enums/structs for nodes
2026-02-04 11:01:45
though that probably won't ever be as ergonomic to write JXL art with, but a lot more ergonomic to implement
_wb_
2026-02-04 11:03:41
the tree syntax is reasonably human-readable when indented properly and it's pretty minimalistic (not much overhead) the keyword syntax in jxl_from_tree is not very nice, in particular for things like splines or noise it's not exactly nice and it's annoying that you cannot parse it without knowing how many arguments each keyword has
veluca
2026-02-04 11:03:52
Pretty sure you can make something like `split(N < 10, split(W < 5, Gradient + 3, Zero + 2), Weighted - 1)` work
2026-02-04 11:06:48
It's almost the same as the tree syntax too
_wb_
2026-02-04 11:20:46
in Prolog that's how you'd do it since you can just use the built-in term parsing then
JXL Art Bot
2026-02-16 11:45:42
**xman** _“Pixels Singularity”_ 2026 image/jxl 74 bytes https://jxl-art.surma.technology/?zcode=hZHLDoIwEEX3%2FYrZE5IOUHVlosboChMx6dpg1W7wkWrUr3daH7SAkRVzpnPvnXaszUYdzR6Qs8VZq8qsjT5U0GfLyQqwx4rTRamHYgzo01u4wxBQcFc6UBL4lAAx5F5F7Ru1Ba%2BRg3I2t9iDdnJ03eVRLiGCpLMzpb8kFLLq2YC3j0srFIc6X%2BPwfGiNP3rWHOut3TWkwt%2B0bCi%2FETYztG%2Fk5VMoQ4m7eca7VdpppZcz1MBEsL9B7PtF9PpNRqLoLytpNhb%2BLFkrvdsbtYEYWdM8dYs9AQ%3D%3D
_wb_
2026-02-22 08:25:50
The most recent jxl art on https://jpegxl.info/art/ is from 2022, from the Inercia demoparty (see https://discord.com/channels/794206087879852103/824000991891554375/1037784316337463357) . We could add some more recent stuff. Feel free to nominate jxl art created since then, or to make new jxl art right now, to add to the gallery!
veluca
_wb_ The most recent jxl art on https://jpegxl.info/art/ is from 2022, from the Inercia demoparty (see https://discord.com/channels/794206087879852103/824000991891554375/1037784316337463357) . We could add some more recent stuff. Feel free to nominate jxl art created since then, or to make new jxl art right now, to add to the gallery!
2026-02-22 08:27:35
this reminds me that I still need to look at https://github.com/veluca93/jxl-art/pull/3 -- did anybody check if https://www.januschka.com/jxl-art/ is OK?
_wb_
2026-02-22 08:36:45
https://www.januschka.com/jxl-art/?zcode=eJxtVE1zmzAQvfMr9pyUiSQMtnvoTJJJm0OGdpLOcFZsBTQBRECO439frT5AcXNCaJ_evn270o3UezHoBihJfo9S9JprqXpYJ5Xcm21GVpvkXsi60QbCVsnj7V8okut2aHjyc-Sd-KMmSIuCQUoJSa4uYDeqYQLdCJC91DCq4wT8yE_fgPd7GPioQb3Y-CQ4aAW10MCBfc-AT4PYmSOoAS6ukqRU-oFPGgztUcBRti2odzG2_AST6oRuZF-DkavV4EjlZM_JF9jBD2BJCk_CKs-QQw387SDguQbDIEYLNdu3zag6jn_-HAkLiosamainSnMb_DB7K7uq0qoyPykCqvAhHp0REjH4c8QhI3UGFYJF7sKXkIWMWwwbmQ-HWeQJCa3bT68n62unDqZ3sp884jwlKv11b5ZIe_1el5clJskxUFZpiSXkhMzBOyMwN38WRQHdEx9aRJmCe7bL5-ktX0EsYYm1BkdSVy0qF6EaVEgJzb2DJFJLY7UsVscSy_JoilddL6b_C8e2ODft_Io9cgfPmc_i6v4EWnkM2uGStKpWfmSWYTNVm4x4H1z3XGI7Zn17MrbYGUewnflluph1E4OW14ysx3K8VVGH82JuYEGpa0Y0KWQbgEW2CcsNDZO6IqFY24S75ROw5NN4uC4wNocZW88EfmtNviA_0-gTVVGiiGg5Ho5tGYvT4FY2s-dk0fY1C744qlVjeFSsp_FVXi6Ztf0wvh2UnARi5gpMoFfuNfG9eFZaq25uXUD-A02MUDI this one seems to have an issue
2026-02-22 08:37:33
while https://jxl-art.lucaversari.it/?zcode=bVRNc5swEL3zK_aclIkkDLZ76EySSZtDhnaSznBWbAU0AURAjuN_X60-QHFzQmif3r59u9KN1Hsx6AYoSX6PUvSaa6l6WCeV3JttRlab5F7IutEGwlbJ4-1fKJLrdmh48nPknfijJkiLgkFKCUmuLmA3qmEC3QiQvdQwquME_MhP34D3exj4qEG92PgkOGgFtdDAgX3PgE-D2JkjqAEurpKkVPqBTxoM7VHAUbYtqHcxtvwEk-qEbmRfg5Gr1eBI5WTPyRfYwQ9gSQpPwirPkEMN_O0g4LkGwyBGCzXbt82oOo5__hwJC4qLGpmop0pzG_wweyu7qtKqMj8pAqrwIR6dERIx-HPEISN1BhWCRe7Cl5CFjFsMG5kPh1nkCQmt20-vJ-trpw6md7KfPOI8JSr9dW-WSHv9XpeXJSbJMVBWaYkl5ITMwTsjMDd_FkUB3RMfWkSZgnu2y-fpLV9BLGGJtQZHUlctKhehGlRICc29gyRSS2O1LFbHEsvyaIpXXS-m_wvHtjg37fyKPXIHz5nP4ur-BFp5DNrhkrSqVn5klmEzVZuMeB9c91xiO2Z9ezK22BlHsJ35ZbqYdRODlteMrMdyvFVRh_NibmBBqWtGNClkG4BFtgnLDQ2TuiKhWNuEu-UTsOTTeLguMDaHGVvPBH5rTb4gP9PoE1VRoohoOR6ObRmL0-BWNrPnZNH2NQu-OKpVY3hUrKfxVV4umbX9ML4dlJwEYuYKTKBX7jXxvXhWWqtubl1A_gM does work
veluca
2026-02-22 08:44:08
interesting, it works on initial load but not on "Run |>" for me
2026-02-22 08:44:15
<@623776984987729940> 😄
hjanuschka
2026-02-22 08:45:57
i ll look
_wb_
**\_wb\_** _“Pink pieces”_ 2023 image/jxl 33 bytes https://jxl-art.surma.technology/?zcode=HYmxCoMwFEX39xV3Lw9MrMFJsF2cHKqSWfTVBCIEGvr9fXW655z7iGWXXAJa8nHXtY2jQeIRyoVL%2FqxnTqJ%2Fn3JY6fWcYSxRfGNDh%2BoP%2Fjby6NXY3Qlg9N9DG9i4SydJshWYytbE8Np%2F
2026-02-24 02:39:26
something stopped working with jxl_from_tree, also I noticed that Upsampling now comes at a substantial cost in filesize while in the past it was free. Maybe streaming encoding?
jonnyawsom3
_wb_ something stopped working with jxl_from_tree, also I noticed that Upsampling now comes at a substantial cost in filesize while in the past it was free. Maybe streaming encoding?
2026-02-24 05:54:49
We spent a few hours this morning trying to understand some weird behaviour. Eventually we traced it back to a fix we did for... Something... But we can't remember what was broken or how the fix worked. Sapien made a PR to remove the old code https://github.com/libjxl/libjxl/pull/4637, but personally I still don't think it's quite right, it seems to work though so eh. Might need help double checking the pipeline in <#804324493420920833>
_wb_
2026-02-24 05:57:12
what I'm concerned about is that `Upsample` doesn't work with jxl_from_tree as it did a few years ago — this is already an issue in jxl-art.surma so it's not a recent problem
**\_wb\_** _“The decay of gold”_ 2022 image/jxl 35 bytes https://jxl-art.surma.technology/?zcode=Tcy9CsJAEATgfp9iejnwNhymEtTCVCn84ergrcmCyqGLz%2B8qFumGb4bZqhWpNqGlc30N93oTj4fdCZEoa%2FEmRaZOdJzsF0mvuGDtfcBRDMsv5EUf%2BuwaIrcEzIlTcgECNu%2FRFYGZ%2F7J%2FDkXlYf42G3Czog8%3D
2026-02-24 05:58:12
this one for example is now 34 bytes if you make it Upsample 1, but as it is there, it is 87 bytes
jonnyawsom3
2026-02-24 06:00:16
Oh right, yeah I've noticed that pretty often, it would randomly break between files and I never knew why. I just assumed Surma was missing bugfixes from main
_wb_
2026-02-24 06:00:30
I think in the past we would produce a single-group image, but now this is getting encoded as a 16-group image
2026-02-24 06:01:09
same problem on Luca's version: https://jxl-art.lucaversari.it/?zcode=Tcy9CsJAEATgfp9iejnwNhymEtTCVCn84ergrcmCyqGLz-8qFumGb4bZqhWpNqGlc30N93oTj4fdCZEoa_EmRaZOdJzsF0mvuGDtfcBRDMsv5EUf-uwaIrcEzIlTcgECNu_RFYGZ_7J_DkXlYf42G3Czog8
2026-02-24 06:01:36
it also takes very long to produce the jxl file when doing Upsample 8
jonnyawsom3
2026-02-24 06:03:00
IIRC it's reproducable with the CLI too, so testing is a bit faster
_wb_
2026-02-24 06:03:52
it's somehow not correctly computing the number of groups; in this case the frame is 512x512 which fits into a single group at our group_dim_shift. But it's treating it as a 4096x4096 frame, which is the upsampled dimension
jonnyawsom3
2026-02-24 06:04:38
I'm surprised it still decodes fine if its putting so much extra in
2026-02-24 06:07:33
It should affect normal images with`--already_downsampled --resampling 8` too
_wb_ same problem on Luca's version: https://jxl-art.lucaversari.it/?zcode=Tcy9CsJAEATgfp9iejnwNhymEtTCVCn84ergrcmCyqGLz-8qFumGb4bZqhWpNqGlc30N93oTj4fdCZEoa_EmRaZOdJzsF0mvuGDtfcBRDMsv5EUf-uwaIrcEzIlTcgECNu_RFYGZ_7J_DkXlYf42G3Czog8
2026-02-24 06:19:28
Well it's definitely doing something bad, my phone just crashed trying to encode it on the page 😅
veluca
2026-02-24 06:20:28
so how hard would it be to make a jxl-art-only encoder? (in Rust maybe :P)
2026-02-24 06:21:05
intuitively it shouldn't need *too* much code...
jonnyawsom3
2026-02-24 06:31:59
xsize and ysize get divided by the resampling <https://github.com/libjxl/libjxl/blob/b3510d19c616db3de03e8e15af92f16a1f0655c4/lib/jxl/encode.cc#L2097> But frame size is multiplied by resampling <https://github.com/libjxl/libjxl/blob/b3510d19c616db3de03e8e15af92f16a1f0655c4/lib/jxl/enc_frame.cc#L439> Maybe they're running in the wrong order or something? There isn't much to the already_downsampled code
_wb_
veluca intuitively it shouldn't need *too* much code...
2026-02-24 06:35:54
Basically only need a header writer and an MA tree encoder, though that does require implementing most of the entropy encode I guess
veluca
2026-02-24 07:01:08
Not *really*, right? Most of the optimizations we don't actually need (it's always 5 contexts and relatively small amounts of data, always ans, no lz needed, ...)
_wb_
2026-02-24 07:08:29
Right. Not sure if it's always ans, iirc for small jxl art, prefix is more compact
xsize and ysize get divided by the resampling <https://github.com/libjxl/libjxl/blob/b3510d19c616db3de03e8e15af92f16a1f0655c4/lib/jxl/encode.cc#L2097> But frame size is multiplied by resampling <https://github.com/libjxl/libjxl/blob/b3510d19c616db3de03e8e15af92f16a1f0655c4/lib/jxl/enc_frame.cc#L439> Maybe they're running in the wrong order or something? There isn't much to the already_downsampled code
2026-02-24 07:58:24
Ah I think I see what's going on. We end up encoding a frame that is 8x too large in both dimensions, and cropping it to its top left corner so it still looks the same as before... But it's actually a huge frame
2026-02-24 08:00:19
That 512x512 image with upscale 8 becomes a 4096x4096 image, but we then encode a 32768x32768 frame (of which we only see a small corner)
jonnyawsom3
2026-02-24 08:00:48
<:monkaMega:809252622900789269>
2026-02-24 08:01:06
No wonder my phone was 'unhappy'
_wb_
2026-02-24 08:01:22
Will make a fix, but first have to put kids to bed
2026-02-25 09:56:05
I added this: https://jpegxl.info/art/big_gallery.html
2026-02-25 09:57:54
it loads smoothly on my chrome, except for "Lovebirds" which has huge splines, maybe a good test image to try to speed up spline rendering?
TheBigBadBoy - 𝙸𝚛
2026-02-25 10:18:52
crazy how flags are heavier than other beautiful arts, like Rift which is only 36B
AccessViolation_
_wb_ it loads smoothly on my chrome, except for "Lovebirds" which has huge splines, maybe a good test image to try to speed up spline rendering?
2026-02-25 10:27:12
I wonder if there's anything we can apply or learn from the years of optimizations browsers have done to speed up SVG rendering
veluca
_wb_ it loads smoothly on my chrome, except for "Lovebirds" which has huge splines, maybe a good test image to try to speed up spline rendering?
2026-02-25 10:42:16
I don't think that's even simdfied at the moment
2026-02-25 10:42:27
definitely there's plenty of work still tbd for those 😄
2026-02-25 10:45:18
> Color Leakage in the Synthetic Beehive that one doesn't load for me (and also the source seems broken)
_wb_
2026-02-25 01:56:47
fixed it, there was a copy/paste error
2026-02-25 01:58:22
also if there are nice images in the history of this channel that I missed, just point to them and I'll add them
veluca
_wb_ it loads smoothly on my chrome, except for "Lovebirds" which has huge splines, maybe a good test image to try to speed up spline rendering?
2026-02-25 03:29:22
easy speedup
Tirr
2026-02-25 03:31:59
10x <:Stonks:806137886726553651>
veluca
2026-02-25 03:41:39
kinda easy when you go from scalar to avx512
monad
2026-02-26 12:07:28
Okay, it is funny and ironic that [this](https://discord.com/channels/794206087879852103/824000991891554375/967519325818880001) was curated. It was actually produced the day of the jxl_from_tree release and the creation of this channel in the process of learning the tool.
2026-02-26 12:21:45
The more artsy-looking result was [this](https://jxl-art.lucaversari.it/?zcode=y0xTqFCwUzA0MOBSAILMNIVKJC5UKBkohBCACoK0GZkZoQgjGYFNCsk4Q6ySSEabGJngVIJkDSFlSCZaEqEUBHQVHMvSHXNyFLTRPE3AKcSaT5YdEE3BqSUKRqamXMSpxG8yITXQUDPHEY8k-wQaSoTMIzl08IcKLl9iE4f62MwAm3I8LoL6DJs-onyD6QNk10HZAA). This particular tree was also more technically interesting for me because the rearrangement to reduce AvgAll nodes yielded a smaller JXL than the straightforward modification by several bytes. Still less than art, but at least more beautiful.
JXL Art Bot
2026-03-15 12:23:03
**SB112** _“Small and not accurate colors russia”_ 2026 image/jxl 27 bytes https://jxl-art.surma.technology/?zcode=c8osSUktKMlQMOQKz0wB0pZcHqmZ6RklCmZcXJlpCpUKdkApBQUo0xjIBHOSgRwDMEdBQVchOLUEjWeIrNAQixSyNoQ4FwA%3D
SB112
2026-03-15 12:24:06
well thats not how it looks in the website
2026-03-15 12:24:41
image attachment fail thats not how the image looks
_wb_
2026-03-15 01:17:46
Interesting how the preview fails, maybe because it is so small?
JXL Art Bot
2026-03-15 01:19:02
**\_wb\_** _“is this better?”_ 2026 image/jxl 31 bytes https://jxl-art.surma.technology/?zcode=c8osSUktKMlQMOQKz0wB0pYGBlweqZnpGSUKZkAmV2aaQqWCnYKhpSWXggKUYwzmgLnJQK4BmKOgoKsQnFqCxjNEVmiIRQpZG0KcCwA%3D
2026-03-15 04:46:08
**dogelition** _“test”_ 2026 image/jxl 27 bytes [source tree](https://jxl-art.lucaversari.it/?zcode=c8osSUktKMlQMOQKz0wB0pZcHqmZ6RklCmZcXJlpCpUKdkApBQUo0xjIBHOSgRwDMEdBQVchOLUEjWeIrNAQixSyNoQ4FwA%3D)
dogelition
**SB112** _“Small and not accurate colors russia”_ 2026 image/jxl 27 bytes https://jxl-art.surma.technology/?zcode=c8osSUktKMlQMOQKz0wB0pZcHqmZ6RklCmZcXJlpCpUKdkApBQUo0xjIBHOSgRwDMEdBQVchOLUEjWeIrNAQixSyNoQ4FwA%3D
2026-03-15 04:49:24
somehow that's the result of the browser encoding the canvas pixels as jpeg
spider-mario
2026-03-15 08:34:24
that sounds very cursed
AccessViolation_
2026-03-15 10:19:02
ah, that seems like the antifingerprinting thing firefox sometimes does
Cy
2026-03-18 01:22:30
Is there any other tool to make jxl art except for the web app?
dogelition
Cy Is there any other tool to make jxl art except for the web app?
2026-03-18 01:26:36
alternative site: https://www.januschka.com/jxl-art/ or just the `jxl_from_tree` binary from libjxl
monad
2026-03-18 06:59:03
https://qon.github.io/jxl-art/ is still the most featureful editor
Froozi
2026-03-26 01:52:28
It would be so nice to have such encoding possibilities in a vector graphics program as an export option.
monad
2026-03-26 02:22:27
What specifically?
Froozi
monad What specifically?
2026-03-26 02:31:54
The whole mathematical equasion thingy that this encoder is known from here. Most if not all of the art presented here is not really raster in it's nature, and being able to extract vector graphics into a more supported typical output for convinience sake would yield much more savings than having to manually re–encode from a \*.png extract.
monad
2026-03-26 02:46:40
I don't understand how jxl tools would preserve vector representations, or make translation more convenient with some tight coupling, except in the seemingly narrow case where splines could preserve some accuracy. SVG is way more general with real vector support for delivery.
2026-03-26 02:49:25
I do still think an editor with WYSIWYG JXL spline painting would be cool.
2026-03-26 03:14:00
Semantics for writing MA trees to preserve some information seems impractical in general, but technically plausible in specific situations.