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-art

_wb_
2021-03-23 07:26:57
This channel is for artistic small jxl files. Please provide the .jxl and a png/jpg for convenience of viewing (since discord does not support jxl... yet).
2021-03-23 07:28:44
If it is a MA-tree-only image created with `jxl_from_tree`, please also share the tree.
2021-03-23 07:45:13
Has anyone tried the jxl_from_tree toy already?
Pieter
2021-03-23 07:49:10
If you write a https://github.com/sipa/gramtropy grammar for it, we could try randomly generating some of limited size.
2021-03-23 07:49:53
I'll try to find some time.
_wb_
2021-03-23 08:01:15
Not sure if the typical random tree does anything interesting
2021-03-23 08:01:32
But could generate a bunch of images and sort by png size
2021-03-23 08:02:09
Boring images are small pngs or very large ones (too noise-like to look nice)
Petr
2021-03-23 08:06:00
OK, I'll start with my first image in the allrgb.com fashion, but never published there. Created in 2014, converted today. I hope it meets the expectation. πŸ™‚
2021-03-23 08:06:04
_wb_
2021-03-23 08:11:04
Not bad
2021-03-23 08:12:53
But what about a tree-only version of an all-rgb image (or something close to it, the current jxl_from_tree produces only 1024x1024 images)
Petr
2021-03-23 08:26:00
If I wanted to study the MA-trees, where should I start? πŸ˜‡
_wb_
2021-03-23 08:26:47
in `tools/example_tree.txt`
2021-03-23 08:26:59
2021-03-23 08:28:49
``` if y > 0 if x > 0 if c > 1 if N > 253 - Set 0 - N + 2 if c > 0 if W+N-NW > 253 - Set 0 - AvgW+N + 1 if W > 253 - Set 0 - W + 2 - Set 0 - Set 0 ```
2021-03-23 08:28:57
2021-03-23 08:31:13
2021-03-23 08:31:18
```if c > 1 if N > 125 - Set 0 if W > 125 - Set 0 - AvgW+NW + 1 if y > 400 if N > 0 if WGH > 0 if N-NE > 0 - Set 0 - Set 128 if N-NE > 0 - Set 64 - Set 0 if NW-N > 0 if N-NE > -1 - Set 255 - Set 0 if N-NE > -1 - Set 0 - Set 255 if c > 0 if x > 0 if W > 253 - Set 0 if y > 100 if y > 270 - W + 1 if N > 252 - Set 0 - N + 3 - W + 1 - Set 0 if x > 511 - Set 200 - Set 0 ```
2021-03-23 08:31:49
2021-03-23 08:47:31
2021-03-23 08:47:35
```if c > 1 if W > 10 - W - 1 - Set 200 if N > 224 - Set 32 if N > 16 if W > 224 - Set 32 if W > 16 - AvgAll + 1 if c > 0 - Set 192 - Set 180 - Set 192 ```
2021-03-23 08:47:44
2021-03-23 09:37:11
2021-03-23 09:37:15
```if N > 224 - Set 32 if N > 16 if W > 224 - AvgW+N - 1 if W > 16 - AvgAll + 1 if c > 1 - Set 192 if c > 0 - AvgW+N + 0 - Set 230 - AvgW+N + 1 ```
2021-03-23 09:37:25
Master Of Zen
2021-03-24 01:09:24
It reminds me of 64K demos
Scope
2021-03-24 02:00:18
64k is a very big for this, I think closer would be 32-256 bytes demos <https://youtu.be/O-WjF_dxdHM?t=1233> <https://youtu.be/Imquk_3oFf4> And for example 64k demos: <https://youtu.be/QhqT0DhV9yE> <https://youtu.be/UnjIMd3kVf4> <https://youtu.be/JZ6ZzJeWgpY> <https://youtu.be/MAnhcUNHRW0>
_wb_
2021-03-24 06:15:14
The main difference is that for a jxl 'demo', you don't get a compact Turing complete language (machine code) plus whatever platform-specific things that can be just used, but only a restricted, non-Turing complete language (a jxl bitstream).
Scope
2021-03-24 01:44:39
Yep, that's what I mean, for a demo in 64k this is not a challenge, where people make mini movies and possibilities are not so limited, usually kinds of effects and procedural generation are in competitions with a much smaller size
_wb_
2021-03-24 02:07:55
```#!/bin/bash for i in $(seq -3 3); do for j in $(seq -3 3); do for k in $(seq -3 3); do cat > jxlart-$i-$j-$k-tree.txt <<EOF if W > 200 - Set 10 if W > 20 if WGH > -4 if WGH > 1 - AvgW+N $i - AvgN+NW $j - Select $k if c > 1 - W + 100 if c > 0 - W + 110 - W + 120 EOF ./jxl_from_tree jxlart-$i-$j-$k-tree.txt jxlart-$i-$j-$k.jxl djxl jxlart-$i-$j-$k.jxl jxlart-$i-$j-$k.png done done done ```
2021-03-24 02:11:36
2021-03-24 02:11:48
2021-03-24 02:12:02
2021-03-24 02:12:25
2021-03-24 02:12:52
2021-03-24 02:13:49
2021-03-24 02:15:21
2021-03-24 02:17:28
2021-03-24 02:17:53
2021-03-24 02:18:41
2021-03-24 02:19:06
2021-03-24 02:20:34
2021-03-24 02:21:08
2021-03-24 02:21:54
2021-03-24 02:24:03
these are all 47-50 byte .jxl files made by the above script (same tree structure, just changing the offsets a bit)
Petr
2021-03-24 02:34:30
https://tenor.com/view/wow-phenomenal-amazing-great-gif-5981661
_wb_
2021-03-24 03:52:18
``` if W+N-NW > 130 - Set 0 if N-NE > 20 - Set 254 - W + 1 ```
2021-03-24 03:53:02
"Infinite Aquaducts"
2021-03-24 03:53:10
2021-03-24 03:53:14
only 34 bytes
2021-03-24 03:53:22
fab
2021-03-24 03:54:25
impressive
_wb_
2021-03-24 04:26:02
```if y > 50 if N > 240 - Set 240 if N > 10 if N-NN > 0 - N + 1 if c > 1 - N - 2 - N - 1 - N + 1 if W > 240 - Set 240 if W > 10 if W-WW > 0 if c > 0 - W + 5 - W + 4 - W - 2 - W + 1 ```
2021-03-24 04:26:13
2021-03-24 04:26:24
"Rainbow Plasma"
2021-03-24 04:26:33
Lastrosade
2021-03-24 04:31:40
This is like a cheap shader coding comp
2021-03-24 04:31:47
I love this
_wb_
2021-03-24 05:23:34
Anyone else been playing with the jxl_from_tree toy?
Petr
2021-03-24 06:19:06
This one is similar to some allrgb images. Beautiful!
_wb_
2021-03-24 08:54:25
```if y > 100 if N > 20 if x > 511 - AvgN+NW - 1 - AvgN+NE - 1 - Set 200 if W > 240 - Set 240 if W > 10 if W-WW > 0 if c > 0 if c > 1 - W + 3 - W + 5 - W + 4 - W - 2 - W + 1 ```
2021-03-24 08:54:35
2021-03-24 08:54:44
Jim
2021-03-24 11:17:01
JXL live on stage
_wb_
2021-03-25 01:44:55
2021-03-25 01:45:17
```if N-NN > -1 if W > 250 - Set 250 if W > 2 if W-WW > -1 - AvgN+NE + 1 - W - 3 - Set 3 if N > 6 - AvgN+NW - 1 - Set 0 ```
2021-03-25 01:45:26
2021-03-25 01:45:50
there's something satisfying about this one
2021-03-25 01:46:56
I can't put my finger on it but it feels like some kind of weird cave full of stalactites
Deleted User
2021-03-25 03:27:00
This one actually looks pretty natural-like
_wb_
2021-03-25 04:17:23
2021-03-25 04:17:34
```if c > 1 if N > 20 - N - 20 - Set 140 if N-NN > -1 if W > 220 - Set 220 if W > 2 if W-WW > -1 - AvgN+NE + 1 - W - 3 - Set 3 if N > 6 - AvgN+NW - 1 - Set 0 ```
2021-03-25 04:17:39
A variation on the above
2021-03-25 04:17:48
2021-03-25 08:49:33
2021-03-25 08:49:37
```if y > 400 if N-NN > 0 - AvgAll + 0 if N > 20 - AvgN+NE - 1 - N + 150 if y > 0 if y > 200 if W > 50 - W - 2 if c > 0 if c > 1 - Set 232 - Set 214 - Set 250 if c > 0 - N - 1 - N + 1 if c > 0 if c > 1 - Set 250 - Set 200 - Set 0 ```
2021-03-25 08:50:22
"Sunset over the strawberry fields, forever"
2021-03-25 08:50:31
Scope
2021-03-25 08:56:20
If this utility had been a little more user friendly, I think Fabian would have reached good results with it by changing a lot of random numbers
_wb_
2021-03-25 09:16:35
2021-03-25 09:16:46
```if y > 200 if WGH > -240 if WGH > 240 - AvgAll + 0 - Gradient + 0 if W > 120 - W - 110 - W + 110 if y > 20 if N-NN > 0 - AvgAll + 0 if N > 20 - AvgN+NE - 1 - N + 150 if W > 50 - W - 2 if c > 0 if c > 1 - Set 235 - Set 220 - Set 250 ```
2021-03-25 09:16:59
veluca
_wb_
2021-03-25 10:07:50
weighted predictor shows its colors, huh? πŸ˜„
Scope If this utility had been a little more user friendly, I think Fabian would have reached good results with it by changing a lot of random numbers
2021-03-25 10:08:11
what's not very user-friendly about it?
Scope
2021-03-25 10:14:42
For the casual user it is not very clear how to use this utility, what combinations and what are the limits of values, etc.
veluca
2021-03-25 11:01:07
what would make it clearer?
2021-03-25 11:01:57
about the combination, I'd say that finding out is kinda the point πŸ˜› about the limits - usually 0-255 but depending on the tree you make it might require less than that, I don't think anybody knows πŸ˜„
bobadingo
2021-03-26 06:28:44
I wonder would it be possible to crossbreed these images Puppy Farmer style? (http://www.pouet.net/prod.php?which=59302)
monad
2021-03-26 08:07:38
IDK what Puppy Farmer style implies, but you could technically swap nodes between trees. Doing it randomly wouldn't be very efficient because you're likely to produce unsupported structures.
_wb_
2021-03-26 10:08:18
2021-03-26 10:08:25
not really art, but maybe a useful test image
2021-03-26 10:08:29
```if c > 1 if y > 0 if y > 255 if y > 256 if y > 511 if y > 512 if y > 767 if y > 768 - N + 0 - N + 64 - N + 0 - N + 64 - N + 0 - N + 64 - N + 0 if x > 255 if x > 511 if x > 767 - Set 48 - Set 32 - Set 16 - Set 0 if c > 0 if y > 0 if N > 254 - Set 0 - N + 1 - Set 0 if x > 0 if W > 254 - Set 0 - W + 1 - Set 0 - Set 0 ```
2021-03-26 10:08:39
spider-mario
2021-03-26 11:21:30
this looks like 3D LUT templates
bobadingo
2021-03-26 11:22:25
2021-03-26 11:22:29
``` if y > 915 if x > 940 if c > 1 - Set 0 - Set 255 if x > 900 - Set 0 if x > 250 - Set 255 if x > 220 - Set 0 if c > 1 - Set 255 - Set 0 if y > 865 if x > 900 - Set 0 if x > 250 - Set 255 if x > 220 - Set 0 if c > 1 - Set 255 - Set 0 if y > 765 if x > 940 - Set 255 if x > 900 - Set 0 if x > 250 - Set 255 if x > 220 - Set 0 if c > 1 - Set 255 - Set 0 if y > 730 - Set 0 if y > 365 if x > 250 if c > 0 - Set 0 - Set 255 if x > 220 - Set 0 - Set 255 if y > 305 if x > 250 if c > 0 - Set 0 - Set 255 - Set 0 if x > 250 if c > 0 - Set 0 - Set 255 if x > 220 - Set 0 - Set 255 ```
2021-03-26 11:22:36
_wb_
2021-03-26 12:07:33
adding ``` if W > 100 - W - 5 ``` at the top of the above
2021-03-26 12:07:44
2021-03-26 12:07:51
2021-03-26 10:52:19
2021-03-26 10:52:26
``` if y > 0 if N > 0 if NW-N > -1 if N-NE > 0 - Set 0 - Set 255 if N-NE > 0 if c > 0 - Set 255 - Set 0 - Set 0 if NW-N > 0 if N-NE > -1 - Set 255 - Set 0 if N-NE > -1 - Set 0 - Set 255 if c > 1 if x > 800 - Set 255 - Set 0 if x > 510 if x > 512 - Set 0 - Set 255 - Set 0 ```
2021-03-26 10:52:39
2021-03-27 10:29:30
Ok this one is my favorite so far
2021-03-27 10:29:40
```if y > 0 if N > 0 if y > 600 if c > 1 if N > 30 - N - 10 - N - 1 if x > 511 - AvgN+NW + 0 - AvgN+NE + 0 if NW-N > -1 if N-NE > 0 - Set 0 - N + 0 if N-NE > 0 - N + 0 - Set 0 if NW-N > 0 if N-NE > -1 - NW + 0 - Set 0 if N-NE > -1 - Set 0 if c > 0 if c > 1 - Set 200 - Set 150 - Set 255 if x > 200 if x > 511 if x > 800 - Set 1 if c > 0 - Set 0 - Set 2 - Set 1 - Set 0 ```
2021-03-27 10:30:37
Deleted User
2021-03-27 10:31:28
This gives some proper synthwave vibes, especially the lower half
_wb_
2021-03-27 10:33:11
This piece is called "EEG at the base of Mount Sierpinski"
Lastrosade
2021-03-27 10:56:47
Is there a cheat sheet for this tool ?
_wb_
2021-03-27 10:59:26
tools/example_tree.txt is the cheat sheet
Deleted User
2021-03-27 11:00:23
How can I compile this thing? ```ziemekz@ZiemekLaptop:~/jpeg-xl$ gcc tools/jxl_from_tree.cc -o build/tools/jxl_from_tree tools/jxl_from_tree.cc:21:10: fatal error: lib/jxl/base/file_io.h: No such file or directory 21 | #include "lib/jxl/base/file_io.h" | ^~~~~~~~~~~~~~~~~~~~~~~~ compilation terminated.```
_wb_
2021-03-27 11:00:50
It should be compiled together with cjxl and djxl and all the rest
Deleted User
2021-03-27 11:01:07
```ziemekz@ZiemekLaptop:~/jpeg-xl/build/tools$ ls CMakeFiles box djxl CTestTestfile.cmake cjxl libcjxltool.a Makefile cjxl_auto.sh libdjxltool.a benchmark_xl cmake_install.cmake libjxl_tool.a```
Lastrosade
2021-03-27 11:01:20
yeah I already found this but idk what all of this means ``` List of properties: c, g, y, x, |N|, |W|, N, W, W-WW-NW+NWW, W+N-NW, W-NW, NW-N, N-NE, N-NN, W-WW, WGH List of predictors: Set, W, N, AvgW+N, Select, Gradient, Weighted, NE, NW, WW, AvgW+NW, AvgN+NW, AvgN+NE, AvgAll ```
_wb_
2021-03-27 11:01:49
Just do the usual build process and you should find it in build/tools
2021-03-27 11:02:21
Ah yes what it means is not really documented anywhere except in the code and in the spec
2021-03-27 11:02:50
c is channel (0=R, 1=B, 2=B)
2021-03-27 11:03:02
g is not useful with this tool atm
Deleted User
_wb_ Just do the usual build process and you should find it in build/tools
2021-03-27 11:03:08
I did the same process as usual (the one from GitLab): ```git clone https://gitlab.com/wg1/jpeg-xl.git --recursive cd jpeg-xl mkdir build cd build cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF .. cmake --build . -- -j$(nproc)```
_wb_
2021-03-27 11:03:12
x and y are pixel coords
Lastrosade
I did the same process as usual (the one from GitLab): ```git clone https://gitlab.com/wg1/jpeg-xl.git --recursive cd jpeg-xl mkdir build cd build cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF .. cmake --build . -- -j$(nproc)```
2021-03-27 11:04:00
``` git clone https://gitlab.com/wg1/jpeg-xl.git --recursive cd jpeg-xl ./deps.sh ./ci.sh release ```
_wb_
2021-03-27 11:04:41
N and W are the values of the pixel above (north) and to the left (west)
2021-03-27 11:05:21
You can only do tests of the form [property] > some_value
Deleted User
Lastrosade ``` git clone https://gitlab.com/wg1/jpeg-xl.git --recursive cd jpeg-xl ./deps.sh ./ci.sh release ```
2021-03-27 11:05:53
Do I really need to do `./deps.sh` if I `git clone`'d that thing with `--recursive`?
Lastrosade
Do I really need to do `./deps.sh` if I `git clone`'d that thing with `--recursive`?
2021-03-27 11:06:07
idk I just do it
monad
2021-03-27 11:06:19
no
Deleted User
Lastrosade idk I just do it
2021-03-27 11:06:41
> Important: If you downloaded a zip file or tarball from the web interface you > won't get the needed submodules and the code will not compile. You can download these external dependencies from source running `./deps.sh`.
Lastrosade
2021-03-27 11:07:11
I think I just cloned it without `--recursive`
monad
2021-03-27 11:07:22
also, you need to enable dev tools for jxl_from_tree
_wb_
2021-03-27 11:07:32
Decision nodes are of the form ``` if [property] > value (THEN BRANCH) (ELSE BRANCH) ```
2021-03-27 11:08:32
Leaf nodes are of the form ``` - [predictor] +-offset ```
Lastrosade
2021-03-27 11:09:48
What is the difference between `|N|` and `N` ?
fab
_wb_
2021-03-27 11:10:07
does it work with 0,3,6
Lastrosade
2021-03-27 11:11:27
also `WGH` ?
_wb_
2021-03-27 11:15:30
|N| is abs val of N, which in this case is not useful (it is useful for non-RGB / after RCT / squeeze residuals though)
Lastrosade
2021-03-27 11:15:37
and this monster `W-WW-NW+NWW`
2021-03-27 11:16:07
West-WestWest-NorthWest+NorthWestWest
_wb_
2021-03-27 11:16:44
WGH is the signed max-absval-error of the weighted predictor
Lastrosade West-WestWest-NorthWest+NorthWestWest
2021-03-27 11:17:32
That's basically the error of the gradient predictor for the previous pixel
Lastrosade
2021-03-27 11:18:23
ok so to resume List of properties: `c, g, y, x, |N|, |W|, N, W, W-WW-NW+NWW, W+N-NW, W-NW, NW-N, N-NE, N-NN, W-WW, WGH` List of predictors: `Set, Select, Gradient, Weighted, W, N, NE, NW, WW, AvgW+N, AvgW+NW, AvgN+NW, AvgN+NE, AvgAll` c is channel (0=R, 1=G, 2=B) g is not useful with this tool atm x and y are pixel coords N and W are the values of the pixel above (north) and to the left (west) |N| is abs val of N, which in this case is not useful (it is useful for non-RGB / after RCT / squeeze residuals though) WGH is the signed max-absval-error of the weighted predictor W-WW-NW+NWW is basically the error of the gradient predictor for the previous pixel You can only do tests of the form `[property] > some_value` Decision nodes are of the form ``` if [property] > value (THEN BRANCH) (ELSE BRANCH) ``` Leaf nodes are of the form ``` - [predictor] +-offset ```
2021-03-27 11:18:25
Thanks!
monad
2021-03-27 11:26:59
Wouldn't hurt to pin that for curious others.
_wb_
2021-03-27 11:29:09
Deleted User
monad also, you need to enable dev tools for jxl_from_tree
2021-03-27 11:31:15
How do I do that?
monad
2021-03-27 11:31:51
add `-DJPEGXL_ENABLE_DEVTOOLS=ON`
2021-03-27 11:33:07
At least, that's what got it to build in 0.3.5.
_wb_
2021-03-27 11:41:49
I usually build with `./ci.sh opt`
2021-03-27 11:42:15
I think that enables devtools by default, at least I don't think I had to do anything to enable it
monad
bobadingo
2021-03-27 12:09:43
```if x > 940 if y > 915 if c > 1 - Set 0 - Set 255 if y > 865 - Set 0 if y > 765 - Set 255 if y > 730 - Set 0 if c > 0 - Set 0 - Set 255 if x > 900 if y > 730 - Set 0 if c > 0 - Set 0 - Set 255 if x > 250 if y > 765 - Set 255 if y > 730 - Set 0 if c > 0 - Set 0 - Set 255 if x > 220 - Set 0 if y > 765 if c > 1 - Set 255 - Set 0 if y > 730 - Set 0 if y > 365 - Set 255 if y > 305 - Set 0 - Set 255```
2021-03-27 12:09:52
88 byte version
Deleted User
monad add `-DJPEGXL_ENABLE_DEVTOOLS=ON`
2021-03-27 01:21:39
Thanks, it worked perfectly! πŸ˜ƒ
bobadingo
monad ```if x > 940 if y > 915 if c > 1 - Set 0 - Set 255 if y > 865 - Set 0 if y > 765 - Set 255 if y > 730 - Set 0 if c > 0 - Set 0 - Set 255 if x > 900 if y > 730 - Set 0 if c > 0 - Set 0 - Set 255 if x > 250 if y > 765 - Set 255 if y > 730 - Set 0 if c > 0 - Set 0 - Set 255 if x > 220 - Set 0 if y > 765 if c > 1 - Set 255 - Set 0 if y > 730 - Set 0 if y > 365 - Set 255 if y > 305 - Set 0 - Set 255```
2021-03-27 01:33:55
Changing the main traversal direction from vertical to horizontal, good catch.
_wb_
2021-03-27 01:50:19
``` if y > 0 if N > 0 if y > 600 - AvgN+NE + 0 if NW-N > -1 if N-NE > 0 - Set 0 - N + 0 if N-NE > 0 - N + 0 - Set 0 if NW-N > 0 if N-NE > -1 - NW + 0 - Set 0 if N-NE > -1 - Set 0 if c > 0 if c > 1 - Set 255 - Set 180 - Set 255 if x > 600 - Set 0 if c > 1 - Set 220 - Set 255 ```
Lastrosade
2021-03-27 01:50:30
ok I'm trying to get a hang of this but I feel so dumb, how would I make a gradient
2021-03-27 01:50:40
just a vertical one
_wb_
2021-03-27 01:50:56
"The Lighthouse of Mt. Sierpinski"
Lastrosade
_wb_ ``` if y > 0 if N > 0 if y > 600 - AvgN+NE + 0 if NW-N > -1 if N-NE > 0 - Set 0 - N + 0 if N-NE > 0 - N + 0 - Set 0 if NW-N > 0 if N-NE > -1 - NW + 0 - Set 0 if N-NE > -1 - Set 0 if c > 0 if c > 1 - Set 255 - Set 180 - Set 255 if x > 600 - Set 0 if c > 1 - Set 220 - Set 255 ```
2021-03-27 01:51:43
oh this is nice
Deleted User
_wb_ ``` if y > 0 if N > 0 if y > 600 - AvgN+NE + 0 if NW-N > -1 if N-NE > 0 - Set 0 - N + 0 if N-NE > 0 - N + 0 - Set 0 if NW-N > 0 if N-NE > -1 - NW + 0 - Set 0 if N-NE > -1 - Set 0 if c > 0 if c > 1 - Set 255 - Set 180 - Set 255 if x > 600 - Set 0 if c > 1 - Set 220 - Set 255 ```
2021-03-27 01:54:18
The bottom part inspired by my LSD dice, eh? πŸ˜‰
_wb_
2021-03-27 01:54:39
Lastrosade
2021-03-27 01:58:08
``` if c > 0 - Set y + 1 - Set 0 ``` ``` terminate called after throwing an instance of 'std::invalid_argument' what(): stoi Aborted (core dumped) ```
improver
2021-03-27 01:59:06
set only eats integers i guess
_wb_
2021-03-27 01:59:21
Yes
Lastrosade
2021-03-27 01:59:24
in the example there is this ``` if W > 200 - Set 0 - AvgW+NW + 1 ```
2021-03-27 01:59:30
omg
2021-03-27 01:59:33
nvm
_wb_
2021-03-27 01:59:53
It's a bit finicky and tricky
2021-03-27 02:00:06
Have to avoid out-of-range values and stuff
2021-03-27 02:01:10
`Set` is just a fun name for the zero predictor, and the + for positive offsets is optional
Lastrosade
2021-03-27 02:02:00
ok this compiles but I guess does nothing ``` if c > 1 if N > 255 - N + 1 - Set 0 - Set 0 ```
_wb_
2021-03-27 02:02:19
That gives an instant out of range
Lastrosade
2021-03-27 02:02:20
oh wait yes it does
2021-03-27 02:02:26
2021-03-27 02:02:31
its a start
2021-03-27 02:03:15
with the last set as 200
_wb_
2021-03-27 02:03:25
It's a start, now turn it into art
veluca
2021-03-27 02:04:00
we should make some website where people can upload those πŸ˜„ and maybe vote too
improver
2021-03-27 02:04:25
compile to webasm
_wb_
2021-03-27 02:05:42
Yes. At some point I will also want more features for jxl_from_tree, like multiple groups / adjustable group size / prevchannel properties / doing stuff in XYB / throwing a default squeeze or palette transform into the mix
Scope
2021-03-27 02:06:13
Something like this https://codepen.io/skal65535/project/full/ZwnQWM (but even better with an online encoder)
veluca
2021-03-27 02:09:01
or an RCT for that matter
2021-03-27 02:09:42
unfortunately my web devving is extremely out of date, I last did something web-based like 7 years ago xD
monad
bobadingo Changing the main traversal direction from vertical to horizontal, good catch.
2021-03-27 02:22:11
Well, you can do 88 bytes "vertically" as well. And you can go smaller, I was just being lazy after trying the first one. (edit: got it down just 77 bytes just now)
_wb_
2021-03-27 02:22:29
Oh and choosing the bit depth would also be nice. 10-bit allows slower gradients, and less than 8-bit allows smaller files because the constants in the tree get shorter
2021-03-27 02:25:27
Anyway even just what is there currently is far from well-explored. It is a big space, and nobody really knows what gems are hidden in it.
Lastrosade
2021-03-27 02:29:12
I can't decode this one
monad
2021-03-27 02:29:31
What was the input?
2021-03-27 02:29:42
There are plenty of ways to make invalid input.
Lastrosade
2021-03-27 02:29:44
``` if c > 0 - Set 0 if c > 1 if x > 200 if y > 200 - Set 200 - Set 0 - Set 0 - Set 200 ```
2021-03-27 02:29:56
I feel like I am mentally regressing when using this tool
monad
2021-03-27 02:30:06
third line
Lastrosade
2021-03-27 02:30:25
`if c > 1` ?
2021-03-27 02:30:28
if green ?
monad
2021-03-27 02:30:59
that's the 'else' after checking if c > 0
Lastrosade
2021-03-27 02:31:22
so uhhh, if red set 0 then if green do stuff
monad
2021-03-27 02:32:35
looks like you're trying to do stuff on the blue channel rather
Lastrosade
2021-03-27 02:33:09
I am so confused
monad
2021-03-27 02:33:42
well, just move line two to the end for now
2021-03-27 02:33:48
then you'll at least have output
Lastrosade
2021-03-27 02:34:48
oohhhh
2021-03-27 02:34:51
i'm dumb
2021-03-27 02:34:56
omg
2021-03-27 02:34:57
thanks
2021-03-27 02:35:08
for real
2021-03-27 02:35:54
I can do assembly, I was paid to work on old computers to reverse engineer old programs, but this is my limit
2021-03-27 02:36:02
a 2d shader esolang toy
Deleted User
2021-03-27 02:42:09
This is a true masterpiece. Decode it yourself, it's a surprise. ```if y > 825 if x > 525 - Set 255 if x > 500 - Set 0 - Set 255 if y > 800 if x > 845 - Set 255 if x > 655 - Set 0 if x > 525 - Set 255 if x > 500 - Set 0 if x > 345 - Set 255 if x > 320 - Set 0 if x > 180 - Set 255 if x > 155 - Set 0 - Set 255 if y > 525 if x > 680 - Set 255 if x > 655 - Set 0 if x > 525 - Set 255 if x > 500 - Set 0 if x > 345 - Set 255 if x > 320 - Set 0 if x > 180 - Set 255 if x > 155 - Set 0 - Set 255 if y > 500 - Set 0 if y > 185 if x > 845 - Set 255 if x > 820 - Set 0 if x > 680 - Set 255 if x > 655 - Set 0 if x > 525 - Set 255 if x > 500 - Set 0 if x > 180 - Set 255 if x > 155 - Set 0 - Set 255 if x > 525 - Set 255 if x > 500 - Set 0 - Set 255```
Lastrosade
2021-03-27 02:44:21
I knew it
monad
2021-03-27 02:44:51
good meme
_wb_
2021-03-27 03:08:01
I don't know that meme
monad
2021-03-27 03:08:15
your loss
_wb_
2021-03-27 03:08:30
2021-03-27 08:22:37
``` if y > 0 if N > 1 if y > 511 - AvgN+NE - 1 if NW-N > -1 if N-NE > 0 - Set 0 - N + 0 if N-NE > 0 - Set 0 - N + 0 if NW-N > 0 if N-NE > -1 if NW-N > 2 - NW - 3 - NW - 1 - Set 0 if N-NE > -1 - Set 0 if c > 0 if c > 1 - Set 250 - Set 240 - Set 255 if x > 511 if x > 512 - Set 0 - Set 255 - Set 0 ```
2021-03-27 08:23:09
67 bytes
2021-03-27 08:23:46
"The Sierpinski Instability"
2021-03-27 08:25:38
veluca
2021-03-27 08:27:17
now do that without the `y > 511` πŸ˜›
2021-03-27 08:27:28
(I don't think you can)
_wb_
2021-03-27 08:37:33
2021-03-27 08:37:47
Then you get something like that
Deleted User
veluca now do that without the `y > 511` πŸ˜›
2021-03-27 09:09:48
Does JXL support layers that are larger than the image canvas?
_wb_
2021-03-27 09:10:05
Yes
Deleted User
2021-03-27 09:10:39
So you could just crop the image without affecting the file size?
_wb_
2021-03-27 09:11:18
Yes, well it would add maybe 4 bytes to signal that there's a crop
veluca
_wb_ Then you get something like that
2021-03-27 09:23:40
I mean get the same image but without "cheating" and changing trees midway πŸ˜›
_wb_
2021-03-27 09:27:20
Oh
2021-03-27 09:30:33
It might be possible, for now I am basically just doing an effectively binary cellular automaton and then switch at row 512, but there must be automata with more values that do cooler stuff (without having to use x/y)
2021-03-28 10:20:42
'Ever Given' 2021, Jon Sneyers, image/jxl, 85 bytes
2021-03-28 10:21:20
``` if c > 1 if y > 0 if N > 50 if N > 180 - Set 180 if N-NN > 0 - N + 6 - N - 6 - Set 51 if W > 50 if W > 180 - Set 180 if W-WW > 0 - W + 3 - W - 3 - Set 51 if x > 300 if x > 700 - Set 220 if y > 200 if y > 800 - N + 0 if x > 301 - NW + 0 if y > 400 - Set 50 if c > 0 - Set 180 - Set 30 - Set 50 - Set 220 ```
2021-03-28 10:21:27
Master Of Zen
_wb_ 'Ever Given' 2021, Jon Sneyers, image/jxl, 85 bytes
2021-03-28 10:32:38
Can we also have this channel blocked until evergreen is removed? <:whatisthis:672847617796997165>
Jim
2021-03-28 11:41:18
Ever Given
lithium
2021-03-28 01:32:06
what organization need take on responsible for evergreen stuck?
Pieter
2021-03-28 07:03:38
<@794205442175402004> Is there documentation for the jxl-from-tree file format somewhere?
_wb_
2021-03-28 07:04:22
The pinned message here is the best documentation for now :)
veluca
2021-03-28 07:05:12
(if someone feels like writing something in more detail, I'm not going to stop them... :P)
Pieter
2021-03-28 07:07:52
How do the image dimensions get decided?
2021-03-28 07:11:31
Ah, fixed 1024x1024 ?
veluca
2021-03-28 07:11:58
yep, at least for now
Pieter
2021-03-28 07:12:56
What are Set and Select?
2021-03-28 07:13:09
Set is setting it to a constant, I assume?
veluca
2021-03-28 07:13:15
yes
2021-03-28 07:13:37
Select is I think Top or Left depending on some condition I don't fully recall
_wb_
2021-03-28 07:33:07
Decision nodes are of the form: if [property] > [value:int] (THEN BRANCH) (ELSE BRANCH) Leaf nodes are of the form; - [predictor] +-[offset:int] List of properties: - c: the channel number (0=R, 1=G, 2=B) - g: group id, not useful (jxl_from_tree makes a single-group image) - x, y: coordinates - |N|, |W| : not useful (only useful after transforms) - N: pixel above (north) - W: pixel to the left (west) - W-WW-NW+NWW: basically the error of the gradient predictor for the pixel on the left - W+N-NW: value of gradient predictor (before clamping) - W-NW: left minus topleft, i.e. error of the N predictor for the pixel on the left - NW-N: topleft minus top, i.e. error of W predictor for the pixel above - N-NE: top minus topright, i.e. error of W predictor for pixel on top right - N-NN: top minus toptop, i.e. error of N predictor for pixel above - W-WW: left minus leftleft, i.e. error of W predictor for the pixel on the left - WGH: signed max-absval-error of the weighted predictor List of predictors: - Set: always predicts zero, so effectively sets the pixel value to [offset] - W: value of pixel on the left - N: value of pixel above - NW: value of topleft pixel - NE: value of topright pixel - WW: value of pixel to the left of the pixel on the left - Select: predictor from lossless WebP - Gradient: W+N-NW, clamped to min(W,N)..max(W,N) - Weighted: weighted sum of 4 self-correcting subpredictors based on their past performance (warning: not clamped so can get out of range) - AvgW+N, AvgW+NW, AvgN+NW, AvgN+NE: average of two pixel values - AvgAll: weighted sum of various pixels: `(6 * top - 2 * toptop + 7 * left + 1 * leftleft + 1 * toprightright + 3 * topright + 8) / 16` Edge cases: If x=y=0, W is set to 0. Otherwise, if x=0, W is set to N. If y=0, N is set to W. If x=0 or y=0, NW is set to W. Similarly, NE and NN fall back to N and WW falls back to W.
2021-03-28 07:33:18
Pieter Ah, fixed 1024x1024 ?
2021-03-28 07:38:20
1024x1024 is the largest group size for modular, so it is a natural choice. Groups share the tree (but the tree can take group id into account), but they do not look at each other (so can be decoded in parallel), so predictors and properties get their edge cases on the group edges, not only on the image edges.
surma
2021-03-28 11:08:59
``` if N > 0 - Set 0 - Set 255 ```
2021-03-28 11:09:05
Why does this generate a checkerboard?
2021-03-28 11:09:13
I’d have expected alternating lines
2021-03-28 11:14:01
nvm, just saw the edge case
2021-03-28 11:14:07
> If y=0, N is set to W.
2021-03-28 11:29:57
Okay fine I’ll admit this is _really_ fun
_wb_
surma nvm, just saw the edge case
2021-03-29 05:49:45
Yes, the edge cases can really influence the whole image. Easiest way to get rid of them is start with `if x > 0 if y > 0`
Jyrki Alakuijala
2021-03-29 08:45:46
we can make this twice as much fun by adding the LZ77 -- that would allow 'surgical' insertions of pixels into or creating patterns through a combo of LZ77 and contexts
2021-03-29 08:46:04
and triple as much fun by building this with the palette coding
2021-03-29 08:46:50
We can predict (delta) palette codes through context trees by basing the decisions of the palette index by surrounding palette indices
2021-03-29 08:47:44
this means that it gives a cross-color-channel context and prediction, and we can even have the same color on different indices contributing to different contexts
2021-03-29 08:49:08
I believe it allows things like creating arbitrary sprite graphics, fonts, etc. -- only limited by the maximum palette size (IIRC, 32k colors)
2021-03-29 08:49:49
and from there we can make it four times as much fun by using patches on top of all of this, where the patches file is also synthesized by all these methods
2021-03-29 08:50:56
and finally five times as much fun by composing the image of multiple layers each alpha blended with a (low-frequency coded) mask
2021-03-29 08:52:26
...
2021-03-29 08:53:39
I think the actually useful way to build practical low-bpp images would include color quantization and then building state machines with contexts and replicated pixels in the palette
veluca
Jyrki Alakuijala I believe it allows things like creating arbitrary sprite graphics, fonts, etc. -- only limited by the maximum palette size (IIRC, 32k colors)
2021-03-29 09:15:05
there is no real limit on palette size πŸ™‚
2021-03-29 09:16:50
but adding a palette might be a lot more complex than it is worth - likely better use of our time to add color transforms, squeeze, and especially previous-channel-properties (which also allow doing fun things with colours)
2021-03-29 09:17:00
LZ77 is also probably a bit more complex...
Jyrki Alakuijala
2021-03-29 09:24:02
the palette is also coded as an jxl image and can have contexts πŸ™‚ ?
superogue
Scope 64k is a very big for this, I think closer would be 32-256 bytes demos <https://youtu.be/O-WjF_dxdHM?t=1233> <https://youtu.be/Imquk_3oFf4> And for example 64k demos: <https://youtu.be/QhqT0DhV9yE> <https://youtu.be/UnjIMd3kVf4> <https://youtu.be/JZ6ZzJeWgpY> <https://youtu.be/MAnhcUNHRW0>
2021-03-29 09:24:04
i recently made a 32 byte intro -> https://www.pouet.net/prod.php?which=88205
2021-03-29 09:24:23
so a person from the sizecoding community i'm interested to learn more
2021-03-29 09:25:32
For those interested, here are more 128/256 byte intros by myself and my girlfriend (DOS mostly and a few TIC80)
2021-03-29 09:25:33
https://www.pouet.net/groups.php?which=14389
2021-03-29 09:25:59
i'm interested to know if i can do a calculation for a SET command
veluca
Jyrki Alakuijala the palette is also coded as an jxl image and can have contexts πŸ™‚ ?
2021-03-29 09:26:11
yep - but it might be nontrivial to specify how to define it πŸ™‚
superogue i'm interested to know if i can do a calculation for a SET command
2021-03-29 09:26:36
not for SET, you can just do constants with that. but you can do 'W+1' or things like that
superogue
2021-03-29 09:27:21
i cannot set a variable correct?
veluca
2021-03-29 09:27:36
nope, no variables
Jyrki Alakuijala
veluca yep - but it might be nontrivial to specify how to define it πŸ™‚
2021-03-29 09:28:26
does the palette have to be a one dimensional image (like I did in WebP lossless) -- or is it allowed to be two dimensional?
veluca
2021-03-29 09:29:32
pretty sure it's one-dimensional
superogue
2021-03-29 09:31:40
``` Set y + 1``` -> is there anywhere i can read up on how much this logic can be stretched? say set x^y for example or x*y
monad
2021-03-29 09:32:25
you can only add or subtract
2021-03-29 09:32:31
read the pin
superogue
2021-03-29 09:32:46
sh*t, its going to be hard to do non-sirpinksi like stuff πŸ˜„
monad
2021-03-29 09:32:46
and y is not a predictor
_wb_
Jyrki Alakuijala does the palette have to be a one dimensional image (like I did in WebP lossless) -- or is it allowed to be two dimensional?
2021-03-29 09:50:07
the palette is a nb_colors x nb_channels image, e.g. 100x3 for an RGB palette - but you can also do RGBA palettes, or a CMYKOGV+alpha+depth+temperature palette for that matter, which would be 10 rows high πŸ™‚
2021-03-29 09:55:06
the math you can do is quite limited, but I think there might be ways to get further by using prev-channel properties and/or multi-layer images, which would allow you to use layers as "scratch space" for calculations, and then with blending you can do multiplications and other kinds of less trivial things
superogue
2021-03-29 10:13:17
really shame no calculations for SET are possible, but i wss thinking along these lines as wel;l by possible storing sinustables with different phases in layers and doing an animated plasma effect
2021-03-29 10:13:40
(it was the only thing i could think of with my limited knowledge of JXL)
_wb_
2021-03-29 10:15:00
Animation could also be nice, yes. Sadly trees cannot be shared between frames, but if the tree is small enough, it may be ok to re-encode it per frame
2021-03-29 10:15:34
or could also do a hidden huge layer that contains all the frames, and then use Patches to blit parts of it to each frame
superogue
2021-03-29 10:16:20
I see <@!436097739391107072> jumped onto the server as well, lets see if he can think of a way of doing interesting stuff
_wb_
2021-03-29 10:16:51
`jxl_from_tree` only gives a small sandbox playground of a single-group 1024x1024 image without any transforms
2021-03-29 10:17:14
a lot more would be possible in a 256-byte jxl bitstream
HellMood
2021-03-29 11:02:24
Yep, i was curious when i saw some sierpinski in just a few bytes. For Msdos, sierpinski would be 10 bytes, and the dragon fractal 16 bytes (see for example here : https://www.pouet.net/prod.php?which=68474 ) I'm just wondering if the "instruction set" is not too limited for demoish effects πŸ˜‰
2021-03-29 11:04:28
Whoops sorry, the sierpinski isn't in there -> https://codegolf.stackexchange.com/questions/6281/draw-a-sierpinski-triangle/95479#95479
_wb_
2021-03-29 11:05:15
it's certainly a very different "instruction set" compared to the more usual ones
2021-03-29 11:07:15
math is restricted, and there's no looping, just the implicit looping over the image
2021-03-29 11:08:08
but when also using transforms like Squeeze, interesting things can likely be done
2021-03-29 11:10:12
(Squeeze is a modified Haar transform that turns an image into a pyramid, encoding a 'zoomed out' image first, and residuals later - doing cellular automata on that would likely allow interesting fractals)
HellMood
2021-03-29 11:22:22
How would i go on and create code for this? Is there an online playground to test out things?
Lastrosade
2021-03-29 11:24:43
``` if x > 1 if W > 254 - Set 200 - W + 1 - Set 0 ``` Aha! I did it! a gradient, I have no idea of what going on on the right tho
_wb_
HellMood How would i go on and create code for this? Is there an online playground to test out things?
2021-03-29 11:26:35
Online playground: no, unless someone with more frontend skills than me can make an emscripten build of jxl_from_tree and put it online somewhere
HellMood
_wb_ Online playground: no, unless someone with more frontend skills than me can make an emscripten build of jxl_from_tree and put it online somewhere
2021-03-29 11:27:08
But how do people do it right now?
_wb_
2021-03-29 11:27:32
Compile and run jxl_from_tree
2021-03-29 11:32:06
``` git clone https://gitlab.com/wg1/jpeg-xl.git --recursive cd jpeg-xl ./ci.sh opt cd build/tools ./jxl_from_tree ../../tools/example_tree.txt example.jxl ./djxl example.jxl example.png ```
2021-03-29 11:32:38
Something like that should work (going by memory so there might be a typo here or there)
Scope
2021-03-29 11:35:41
Compiled version for Windows
_wb_
Lastrosade ``` if x > 1 if W > 254 - Set 200 - W + 1 - Set 0 ``` Aha! I did it! a gradient, I have no idea of what going on on the right tho
2021-03-29 11:37:42
After doing the 0 to 255 gradient, it keeps going from 200 to 255
Lastrosade
2021-03-29 11:37:55
Ohh
_wb_
2021-03-29 11:40:42
``` if x > 1 if W > 0 if W > 254 - Set 255 if W-WW > 0 - W + 1 - W - 1 - Set 1 - Set 0 ```
2021-03-29 11:40:48
Try something like that
Lastrosade
2021-03-29 11:41:23
neat
2021-03-29 11:42:21
`if W-WW > 0` that's if W > WW ?
_wb_
2021-03-29 11:42:29
Yes
Lastrosade
2021-03-29 11:42:48
ok cause you describe it as `left minus leftleft, i.e. error of W predictor for the pixel on the left`
2021-03-29 11:43:08
on the left, simple easy explanation, on the right confusing
_wb_
2021-03-29 11:43:49
Yes, the "i.e." part is probably more confusing than helpful
Lastrosade
2021-03-29 11:45:22
Just to check, is this right ? ``` if c > 1 bluestuff if c > 0 greenstuff redstuff ```
_wb_
_wb_ 'Ever Given' 2021, Jon Sneyers, image/jxl, 85 bytes
2021-03-29 11:47:02
The 'waves' in the B channel are just a vertical oscillating gradient, initialized with a horizontal oscillating gradient.
Lastrosade Just to check, is this right ? ``` if c > 1 bluestuff if c > 0 greenstuff redstuff ```
2021-03-29 11:47:30
Yes
2021-03-29 11:48:52
I sometimes write it as ``` if c > 0 if c > 1 bluestuff greenstuff redstuff ```
Lastrosade
2021-03-29 11:49:10
oh nice
2021-03-29 11:49:15
ok
_wb_
2021-03-29 11:49:46
The tool doesn't care about indentation or whitespace in general
Lastrosade
2021-03-29 11:52:40
<:hypers:714771549374251039>
_wb_
2021-03-29 12:00:03
If you vary the gradient range or speed per channel, it also gives a fun effect since they don't stay in sync then
bobadingo
_wb_ ``` git clone https://gitlab.com/wg1/jpeg-xl.git --recursive cd jpeg-xl ./ci.sh opt cd build/tools ./jxl_from_tree ../../tools/example_tree.txt example.jxl ./djxl example.jxl example.png ```
2021-03-29 12:23:47
I run it through this Makefile: ``` watch: while inotifywait -e close_write source.txt; do make build; done build: source.txt clear jxl_from_tree source.txt source.jxl djxl source.jxl output.png ``` Then I open VSCode, `source.txt` to the left pane, `output.png` to right pane and I have live preview
_wb_
2021-03-29 12:30:39
Nice!
2021-03-29 12:30:59
Do not forget to share examples if you find a nice tree!
2021-03-29 12:31:09
https://c.tenor.com/I_-KjeRZFggAAAAM/flowers-tree.gif
spider-mario
bobadingo I run it through this Makefile: ``` watch: while inotifywait -e close_write source.txt; do make build; done build: source.txt clear jxl_from_tree source.txt source.jxl djxl source.jxl output.png ``` Then I open VSCode, `source.txt` to the left pane, `output.png` to right pane and I have live preview
2021-03-29 01:35:01
you could likely also use https://github.com/gittup/tup with a Tupfile like this: ``` : source.txt |> jxl_from_tree %f %o |> source.jxl : source.jxl |> djxl %f %o |> output.png ``` and then `tup monitor -a -f`
2021-03-29 02:02:05
can also make it work for all .txt in the directory with: ``` : foreach *.txt |> jxl_from_tree %f %o |> %B.jxl {jxls} : foreach {jxls} |> djxl %f %o |> %B.png ```
HellMood
2021-03-29 02:15:28
```if y > 768 if c > 1 - N - 1 if c > 0 - Set 0 - N + 1 if y > 513 if c > 1 - N + 1 if c > 0 - N - 1 - Set 0 if y > 258 if c > 1 - Set 0 if c > 0 - Set 255 - N - 1 if y > 3 if c > 1 - Set 0 if c > 0 - N + 1 - Set 255 if c > 0 - Set 0 - Set 255``` Hard to get something going in this language, but here is at least a rainbow in under 64 bytes πŸ™‚ I guess the bands are somewhat wrong so i need a small fifth to start with red...
Lastrosade
2021-03-29 02:15:49
omfg I've been trying to do this for hours
HellMood
2021-03-29 02:18:09
<@!794205442175402004> thanks for the guide, i built from source (the win7 binary was reported as a virus πŸ˜› ) It doesn't finish to 100% but the build is complete enough to use the tools πŸ™‚
_wb_
2021-03-29 03:35:15
``` if W > 0 if W > 250 - W - 200 if W-WW > 0 if c > 0 if c > 1 - W + 5 - W + 2 - W + 3 - W - 1 - W + 10 ```
2021-03-29 03:35:26
2021-03-29 03:35:57
"African Textile"
2021-03-29 03:36:05
2021-03-29 04:08:20
Here is a variant that makes kind of interesting wavy patterns as you go towards the right
2021-03-29 04:08:23
``` if W > 2 if W > 250 - Set 1 if W-WW > 0 if c > 0 if c > 1 - W + 5 - W + 2 - W + 3 - W - 3 - AvgW+NW + 40 ```
2021-03-29 04:08:33
surma
2021-03-29 04:12:57
Okay, I did a small hack
2021-03-29 04:12:58
https://jxl-art.surma.technology/
2021-03-29 04:13:21
Definitely planning on improving the UX. I’ll probably be able to OSS this in the next week or so and then contributions would be very welcome
2021-03-29 04:13:32
but I thought it might be nicer to not have to rely on the CLI and stuff
2021-03-29 04:13:44
works offline and 100% in the browser πŸ™‚
_wb_
2021-03-29 04:16:51
Good news everybody! <@!179701849576833024> made an encoder improvement that will trim ~5 bytes off of all of the above πŸ™‚
surma https://jxl-art.surma.technology/
2021-03-29 04:17:35
Nice!
2021-03-29 04:17:55
We are making good progress in improving the productivity of our procrastination!
surma
2021-03-29 04:22:02
(Also added a link with β€œdocumentation”. Will improve all of that later, but it’s good enough for now :3)
Scope
2021-03-29 04:22:42
```if W > 0 if W > 250 - W - 170 if W-WW > 0 if c > 0 if c > 1 - W + 2 - W + 2 - W + 7 - W - 1 - W + 40```
monad
2021-03-29 04:28:35
that last band though
veluca
surma https://jxl-art.surma.technology/
2021-03-29 04:41:10
think you could make a version of that that has a "gallery" of submissions? πŸ˜„ and maybe also an upvote button...
surma
2021-03-29 04:43:25
<@!179701849576833024> That’d require a server side
2021-03-29 04:43:52
also, then we have to think about abuse and stuff. Like, what if people spam-submit JXL art that is just a swastika or genitals or other offensive stuff
veluca
2021-03-29 04:49:41
the server side is less of a problem... the abuse, ugh
_wb_
2021-03-29 05:00:54
Abuse is annoying. Guess could require google account?
2021-03-29 05:04:58
A static gallery where you can click to copy the tree to make it a starting point for experimentation would already be cool
surma
2021-03-29 05:05:40
I could at least make it that you can create a sharable link with a specific piece of code preset
2021-03-29 05:05:57
(Currently fleshing out the docs a bit :3)
Scope
2021-03-29 05:13:29
```if y > 2 if N > 240 - Set 240 if N > 10 if N-NN > 0 - N + 3 if c > 1 - N - 5 - N - 2 - N + 1 if W > 240 - Set 240 if W > 10 if W-WW > 0 if c > 0 - W + 2 - W + 4 - W - 2 - W + 1```
_wb_
2021-03-29 05:27:47
I wonder to what extent this is just a toy, and to what extent it may actually have practical uses. E.g. for a game that ships a jxl decoder anyway for game graphics, maybe these could be a cheap source of extra textures...
2021-03-29 05:29:23
Or maybe it could be used as a kind of grain synthesis
HellMood
2021-03-29 05:32:39
i remember coding stuff like this as a kid, but with more options πŸ˜„ <@!794205442175402004> how exactly would i use the "squeeze" operator? ```if c > 0 if N > 5 if W > 5 - AvgAll - 1 - W + 200 - N + 200 - Set 0```
_wb_
2021-03-29 05:34:42
Squeeze is currently not supported by jxl_from_tree, it would need to be implemented in a different way to make that work
2021-03-29 05:38:53
<@179701849576833024> to make global transforms work, it would have to write a Modular image, then undo transforms to get the original image, but also remember the transforms and pass them to enc_modular (or skip the original image completely and somehow directly feed a modular image to the encoder)
veluca
2021-03-29 05:40:00
yup, and then you'd get different channels...
surma
2021-03-29 05:40:38
Okay, I added a share button https://jxl-art.surma.technology/
2021-03-29 05:41:06
But also, I wrote a bit more on the β€œhelp” page. <@!179701849576833024> <@!794205442175402004> I’d appreciate a fact-check if you ever get a sec https://jxl-art.surma.technology/wtf.html
Scope
2021-03-29 05:42:05
It would also be nice to be able to save the resulting jxl file
HellMood
surma Okay, I added a share button https://jxl-art.surma.technology/
2021-03-29 05:42:36
Very nice, it's very convenient already πŸ™‚ . Maybe the image is a *tad* to big.
_wb_
veluca yup, and then you'd get different channels...
2021-03-29 05:42:42
Yes, squeeze residuals are many channels to play with. Also RGBA would be easier that way, could also be fun...
surma
2021-03-29 05:42:43
<@!111445179587624960> omg I planned to add that and completely forgot about it. hang on
2021-03-29 05:42:53
<@!436097739391107072> It’s 1:1 πŸ˜„ original size
2021-03-29 05:43:11
I do wanna add a pinch-zoom, but haven’t really found an easy way
2021-03-29 05:43:14
will do all that a bit later
HellMood
surma <@!436097739391107072> It’s 1:1 πŸ˜„ original size
2021-03-29 05:43:50
Fair enough πŸ™‚ Still feels huge even in 1440p resolution πŸ˜„
surma
2021-03-29 05:45:20
You are definitely right ;)
2021-03-29 05:46:04
But I spent a total of ... 40 minutes on this? And most of it went to debugging the C++ tokenizer until I realized I was overthinking it πŸ˜­πŸ˜‚
veluca
2021-03-29 05:46:36
can we add printing the error message from the parser if parsing fails? πŸ˜„
surma
2021-03-29 05:46:55
<@179701849576833024> yeah wanna do that. It should be visible in the DevTools console
2021-03-29 05:47:12
Just need to rewrite your parser to put those errors somewhere i can grab ^^
veluca
2021-03-29 05:48:19
ah, right, 'cause that's stderr
2021-03-29 05:48:30
you can probably just redefine JXL_FAILURE πŸ˜›
2021-03-29 05:48:58
also, some errors cause bigger failures, i.e. ``` if N > 200 - Set 0 - N + a ``` - result is always-grayed-out "Run"
HellMood
2021-03-29 05:53:19
I have a few of these "grayed-out runs", too 😦
surma
2021-03-29 06:05:13
I'll take a look at that later!
2021-03-29 06:05:31
(i guess it's really prudent I get this OSS'd lol)
HellMood
2021-03-29 06:06:10
```if N > 20 if W > 20 if NW-N > 0 - AvgAll - 1 - N - 3 - W + 180 - N + 180``` πŸ€”
_wb_
2021-03-29 06:07:30
https://jxl-art.surma.technology/?code=CmlmIGMgPiAwCmlmIE4gPiAyNQppZiBXID4gMjUKLSBXZWlnaHRlZCAtIDEKLSBXICsgMTgwCi0gTiArIDE4Ci0gU2V0IDA%3D
2021-03-29 06:09:01
That N + 18 was an accidental backspace that made it a lot better, lol
Scope
2021-03-29 06:09:34
Also, no one has yet made a JXL logo in an interesting art way <:Thonk:805904896879493180>
HellMood
2021-03-29 06:13:32
I figured that any picture can be transformed into that tree, but that wouldn't be fun, would it πŸ˜‰
lvandeve
2021-03-29 06:24:10
``` if c > 1 if N > 20 if W > 10 - AvgW+NW - 1 - W + 100 - N + 150 if c > 0 if N > 30 if W > 17 - AvgN+NW - 1 - W + 200 - N + 200 if N > 10 if W > 8 - AvgN+NE - 1 - W + 100 - N + 200 ```
2021-03-29 06:24:21
HellMood
2021-03-29 06:53:07
using <@!111445179587624960> trick to invert direction to generate some other colors, but hmm ... i feel a bit too much restricted here πŸ˜› ``` if W > 254 - Set 254 if W > 2 if W-WW > 0 if c > 0 if c > 1 - W + 2 - W + 1 - W + 1 if c > 0 if c > 1 - W - 1 - W - 1 - W - 2 - W + 1```
_wb_
2021-03-29 06:53:48
https://jxl-art.surma.technology/?code=CmlmIE4gPiAyNQppZiBXID4gNTAKLSBXZWlnaHRlZCAtIDIKaWYgYyA%2BIDAKaWYgYyA%2BIDEKLSBXICsgMTU1Ci0gVyArIDEwMAotIFcgKyAxNjAKLSBXZWlnaHRlZCArIDE%3D
lvandeve
2021-03-29 06:53:48
``` if c > 1 if N > 10 if W+N-NW > 10 - AvgW+NW - 1 - Gradient + 100 - N + 100 if c > 0 if W+N-NW > 10 if W > 10 - AvgW+NW - 1 - W + 100 - Gradient + 100 if N > 10 if W > 10 - AvgN+NW - 1 - W + 100 - N + 100 ```
2021-03-29 06:53:57
_wb_
2021-03-29 06:54:19
``` if N > 25 if W > 50 - Weighted - 2 if c > 0 if c > 1 - W + 155 - W + 100 - W + 160 - Weighted + 1 ```
2021-03-29 06:55:26
Hm, a way to share the image easily would be nice
2021-03-29 06:56:19
Weighted predictor is by far the most chaotic one
lvandeve
2021-03-29 06:58:07
Looks like a robotic lizard's scales
Scope
_wb_ https://jxl-art.surma.technology/?code=CmlmIE4gPiAyNQppZiBXID4gNTAKLSBXZWlnaHRlZCAtIDIKaWYgYyA%2BIDAKaWYgYyA%2BIDEKLSBXICsgMTU1Ci0gVyArIDEwMAotIFcgKyAxNjAKLSBXZWlnaHRlZCArIDE%3D
2021-03-29 07:03:33
https://jxl-art.surma.technology/?code=aWYgTiA%2BIDEwCmlmIFcgPiA1MAotIFdlaWdodGVkIC0gMgppZiBjID4gMAppZiBjID4gMQotIFcgKyAxNTUKLSBXICsgMTQwCi0gVyArIDE2MAotIFdlaWdodGVkICsgNA%3D%3D
lvandeve
_wb_ Weighted predictor is by far the most chaotic one
2021-03-29 07:04:57
but can go out of range, is there a good way to avoid out of ranges, even with random-ish pixel inputs to it?
2021-03-29 07:05:59
the predictors that have a matching property seem to be N, W and Gradient in some form, so for those you can use protective ifs
_wb_
2021-03-29 07:06:34
Checking for neighbors to be between 50 and 200 or something generally helps to avoid Weighted going out of range
lvandeve
2021-03-29 07:07:44
is there any way out of ranges could be allowed rather than give error?
_wb_
2021-03-29 07:07:49
But with a different implementation of jxl_from_tree, you could just let it go out of range, modular can do out of range values and the decoder will clamp
2021-03-29 07:09:06
It can currently not be allowed because jxl_from_tree does not hook into the modular image directly, it goes through the normal encode path, only using the fixed tree hook
Scope https://jxl-art.surma.technology/?code=aWYgTiA%2BIDEwCmlmIFcgPiA1MAotIFdlaWdodGVkIC0gMgppZiBjID4gMAppZiBjID4gMQotIFcgKyAxNTUKLSBXICsgMTQwCi0gVyArIDE2MAotIFdlaWdodGVkICsgNA%3D%3D
2021-03-29 07:13:05
The discord preview does not do justice to the actual image...
Scope
2021-03-29 07:13:59
Yep, but a full image is fine
_wb_
2021-03-29 07:14:22
<@228116142185512960> feature request: show jxl filesize
Scope
Scope https://jxl-art.surma.technology/?code=aWYgTiA%2BIDEwCmlmIFcgPiA1MAotIFdlaWdodGVkIC0gMgppZiBjID4gMAppZiBjID4gMQotIFcgKyAxNTUKLSBXICsgMTQwCi0gVyArIDE2MAotIFdlaWdodGVkICsgNA%3D%3D
2021-03-29 07:24:29
https://jxl-art.surma.technology/?code=aWYgTiA%2BIDYKaWYgVyA%2BIDU1Ci0gV2VpZ2h0ZWQgLSAyCmlmIGMgPiAwCmlmIGMgPiAxCi0gVyArIDE2MAotIFcgKyAxNjAKLSBXICsgMTYwCi0gV2VpZ2h0ZWQgKyAx
_wb_
2021-03-29 07:36:49
That looks vaguely like a zoomed in fingerprint
2021-03-29 08:24:16
https://jxl-art.surma.technology/?code=CmlmIGMgPiAxCmlmIE4gPiAyNQppZiBXID4gMjUKLSBXZWlnaHRlZCAtIDEKLSBXICsgMTgwCi0gTiArIDE4CmlmIFcgPiA4CmlmIFcgPiAxMDAKaWYgVyA%2BIDIwMAotIFcgLSAxNQotIEF2Z04rTlcgLSAzCi0gQXZnTitOVyAtIDEKLSBTZXQgMjU1
2021-03-29 08:24:29
``` if c > 1 if N > 25 if W > 25 - Weighted - 1 - W + 180 - N + 18 if W > 8 if W > 100 if W > 200 - W - 15 - AvgN+NW - 3 - AvgN+NW - 1 - Set 255 ```
HellMood
2021-03-29 08:33:17
neat πŸ™‚ also cool that i can Check that out right from the sofa now πŸ₯³
_wb_
2021-03-29 09:18:45
2021-03-29 09:18:57
surma
2021-03-29 09:32:33
Got back to working on this. Pushed a few quick things because <@!794205442175402004> tweeted about it. So it now shows the file sizes, the perma-disabled β€œrun” button is fixed and you can download .jxl and .png πŸ™‚
lvandeve
2021-03-29 09:35:55
2021-03-29 09:36:06
https://jxl-art.surma.technology/?code=aWYgYyA%2BIDEKCmlmIE4gPiAxMAppZiBXID4gMTAKLSBBdmdOK05XIC0gMQotIFcgKyAxMDAKLSBOICsgMTAwCgppZiBjID4gMAoKaWYgTiA%2BIDEwCmlmIFcgPiAxMAotIEF2Z1crTlcgLSAxCi0gVyArIDEwMAotIE4gKyAxMDAKCmlmIE4gPiAxMAppZiBXID4gMTAKLSBBdmdOK05XIC0gMQotIFcgKyA5OQotIE4gKyAxMDA%3D
HellMood
2021-03-29 09:50:03
I crossposted the new web playground in our size coding communities. I hope it gains some momentum πŸ™‚
veluca
2021-03-29 09:54:29
link? πŸ˜„
HellMood
2021-03-29 09:55:59
https://www.pouet.net/topic.php?which=12091&page=1#c568691
2021-03-29 09:56:10
https://discord.com/channels/534447164043165696/534447164043165700/826211354510753813
2021-03-29 09:56:23
https://discord.com/channels/787349849808699433/787349849808699436/826211083928862742
veluca
2021-03-29 09:56:42
(those discord links don't work for me)
HellMood
2021-03-29 09:57:08
Sizecoding invite : https://discord.gg/aSa9xRGR
2021-03-29 09:58:18
Demoscene discord : https://discord.gg/cMv5YUHr
2021-03-29 09:59:22
Having an online interface is *much* more attractive than anything else πŸ™‚
_wb_
2021-03-30 05:15:39
I never really was in the demoscene, but I was at Wired'98 and I have very good memories of that.
2021-03-30 05:21:53
I was a sysop of a BBS and of course intros and demos were a big thing - and the tracking scene. MP3 didn't exist yet, video codecs were not yet practical, so demos and mods were the only way to share digital audiovisual art.
monad
2021-03-30 10:14:51
2021-03-30 10:14:56
2021-03-30 10:15:00
_wb_
2021-03-30 10:15:40
lol that filename
2021-03-30 10:16:03
it looks great
2021-03-30 10:16:11
it's a bit fat, at 214 bytes
monad
2021-03-30 10:16:17
yep
2021-03-30 10:16:24
lots of little details
2021-03-30 10:16:36
for no reason
2021-03-30 10:16:52
could probably be optimized too
_wb_
2021-03-30 10:17:18
2021-03-30 10:17:36
new version on dev repo reliably shaves off 4-5 bytes πŸ™‚
2021-03-30 10:18:26
it's a nice composition though
monad
2021-03-30 10:18:36
thanks
_wb_
2021-03-30 10:19:37
I particularly like the red in the top right quadrant
2021-03-30 10:21:23
looks like a regular pattern until it collides with the right border and then like a particle accelerator it scatters
2021-03-30 10:22:20
the triangles in different orientations are also nice
HellMood
2021-03-30 10:27:23
I like the bottom left, it looks 3D-ish with a bit of shading. Sierpinski again, yes, but a good one πŸ™‚
_wb_
2021-03-30 10:31:35
yes, that part is neat too
2021-03-30 10:32:13
oh lol I hadn't seen the .txt yet
2021-03-30 10:34:23
2021-03-30 10:34:34
that's meta-art
HellMood
2021-03-30 11:51:36
2021-03-30 11:51:51
175b, sorry if someone has done that before πŸ˜„
veluca
2021-03-30 11:53:39
so one thing that is possible in the bitstream but I didn't wire up in the tree program is to add an extra invisible first channel, and then reference it from other channels... I suspect that it can help creating interesting things πŸ˜„
surma
2021-03-30 12:04:50
New release! https://jxl-art.surma.technology/
2021-03-30 12:05:30
- Smaller image that can be zoomed using pinch-zoom gesture/mouse wheel - UI face lift - Smaller payload overall (combined everything into one wasm module)
2021-03-30 12:06:22
Also question for the JXL artists in here: If you zoom into an image, do you want:
2021-03-30 12:06:29
a.) Pixelated zooming
2021-03-30 12:06:43
b.) smoothed zooming (~bilinear filtering)
2021-03-30 12:06:50
Vote with thumbs up reaction!
monad
HellMood
2021-03-30 12:53:54
114 B, and made the squares even
HellMood
2021-03-30 12:55:01
Just as a proof of concept that *any* image can be done in JXL_Tree πŸ˜‰
_wb_
HellMood 175b, sorry if someone has done that before πŸ˜„
2021-03-30 12:55:04
this one could be made more compact if the tool would let you choose image dimensions and group dimensions. Now it sets group dimension to max (1024x1024) and image dimensions to 1 group, but you could do this one with default group size (256x256) and just have the same simple image in every group
HellMood
2021-03-30 12:56:11
It's not small either. Just a statement, that *technically* JXL_Tree is unlimited πŸ™‚
_wb_
2021-03-30 12:57:39
haha well it also is unlimited without any tree πŸ™‚
HellMood
2021-03-30 12:58:09
Right, i fixed that πŸ™‚
Scope
2021-03-30 01:00:08
HellMood
2021-03-30 01:01:21
Is that a real compressed Einstein? I wouldnt know before chrome/gimp supports that πŸ˜‰
Scope
2021-03-30 01:02:18
Yep, just checking what the size would be for normal encoding
2021-03-30 01:04:40
<https://squoosh.app/> can also be used for viewing only
HellMood
Scope <https://squoosh.app/> can also be used for viewing only
2021-03-30 01:06:29
Ha, neat πŸ™‚
2021-03-30 01:10:32
Well, the huge Einstein one just uses "if" and "Set", and it's a reminder (for myself at least) that there is no limit, i quickly did that in python : ```python from PIL import Image im = Image.open('onestone.png') pix = im.load() s = "" dim = 256 for x in range(0,dim-1): s = s + "if x > "+ str(x*4) + "\n" for x in range(0,dim): for y in range(0,dim-1): s = s + "if y > "+ str(y*4) + "\n" for y in range(0,dim): s = s + "- Set " +str(pix[x,255-y]*255) + "\n" text_file = open("onestone.txt", "w") text_file.write(s) text_file.close()```
2021-03-30 01:16:39
Secretly i hoped that the tree compressor will chop a lot of that away (also using just two different colors to help with that), but it didn't. Anyway i wonder how the classic CA and gradient stuff can be combined with explicitly setting image content for results with more freedom πŸ™‚
_wb_
surma New release! https://jxl-art.surma.technology/
2021-03-30 01:27:04
Neat! UI is starting to look fancy πŸ™‚ also the intro text in help/wtf is nice
HellMood Secretly i hoped that the tree compressor will chop a lot of that away (also using just two different colors to help with that), but it didn't. Anyway i wonder how the classic CA and gradient stuff can be combined with explicitly setting image content for results with more freedom πŸ™‚
2021-03-30 01:29:04
Currently no attempt is made to simplify trees β€” normally they wouldn't be hand-written, but they would get learned from the image data by an algorithm that wouldn't introduce redundant branches in the first place
Scope
2021-03-30 02:05:47
I wonder what can be done with splines (when they will be supported in the encoder) and how costly they are πŸ€”
_wb_
2021-03-30 02:23:44
2021-03-30 02:24:13
2021-03-30 02:25:20
2021-03-30 02:25:34
2021-03-30 02:25:44
that's all there is to know about splines πŸ™‚
lithium
2021-03-30 02:29:07
splines feature is implement in jpeg xl 0.3.7?
_wb_
2021-03-30 02:30:56
the decode side of this has been there since at least 0.1
2021-03-30 02:31:17
the encode side I don't expect anytime soon
2021-03-30 02:31:29
but you could do it manually
2021-03-30 02:32:15
it is not that cheap though
2021-03-30 02:33:18
that's `5*4*32` bits to describe the spline color and thickness
lithium
2021-03-30 02:41:57
look like splines feature is very suitable some non-photographic image, I still wait jpeg xl implement some vardct improvement πŸ™‚ (reverse the order of dct size selection to merge instead of split)
surma
2021-03-30 03:37:42
Another mini update for https://jxl-art.surma.technology/ - Nearest-Neighbor zooming instead of bilinear (thanks for voting!) - Prettier button to auto-format your code - Better error reporting (not just β€œparsing failed”) - Share button behaves and auto-copies the URL to clipboard
_wb_
2021-03-30 04:36:32
Ooh auto-format, that is convenient!
lvandeve
2021-03-30 04:38:14
2021-03-30 04:38:33
https://jxl-art.surma.technology/?code=aWYgYyA%2BIDEKCmlmIE4gPiAxMAppZiBXID4gMTAKLSBBdmdOK05XIC0gMTAKLSBXICsgMjI1Ci0gTiArIDIyNQoKaWYgYyA%2BIDAKCmlmIE4gPiAxMQppZiBXID4gMTEKLSBBdmdOK05XIC0gMTEKLSBXICsgMjI1Ci0gTiArIDIyNQoKaWYgTiA%2BIDEyCmlmIFcgPiAxMgotIEF2Z04rTlcgLSAxMgotIFcgKyAyMjUKLSBOICsgMjI1
Scope
surma Another mini update for https://jxl-art.surma.technology/ - Nearest-Neighbor zooming instead of bilinear (thanks for voting!) - Prettier button to auto-format your code - Better error reporting (not just β€œparsing failed”) - Share button behaves and auto-copies the URL to clipboard
2021-03-30 04:41:48
It would also be convenient to name the images automatically based on the hash (maybe even in human-readable words like Twitch does, for example: `SplendidRealCatThisIsSparta--9qJDd0tgrUQvvG7`)
Crixis
2021-03-30 04:50:27
https://jxl-art.surma.technology/?code=aWYgYyA%2BIC0xCiAgaWYgYyA%2BIDAKICAgIGlmIGMgPiAxCiAgICAgIC0gU2V0IDAKICAgICAgaWYgeSA%2BIDUwNAogICAgICAgIGlmIHkgPiA3NjIKICAgICAgICAgIGlmIHkgPiA4OTMKICAgICAgICAgICAgaWYgeSA%2BIDk1OAogICAgICAgICAgICAgIGlmIHkgPiA5OTEKICAgICAgICAgICAgICAgIC0gU2V0IDI1NQogICAgICAgICAgICAgICAgLSBTZXQgMAogICAgICAgICAgICAgIC0gU2V0IDI1NQogICAgICAgICAgICAtIFNldCAwCiAgICAgICAgICAtIFNldCAyNTUKICAgICAgICAtIFNldCAwCiAgICBpZiB4ID4gNTA0CiAgICAgIGlmIHggPiA3NjIKICAgICAgICBpZiB4ID4gODkzCiAgICAgICAgICBpZiB4ID4gOTU4CiAgICAgICAgICAgIGlmIHggPiA5OTEKICAgICAgICAgICAgICAtIFNldCAyNTUKICAgICAgICAgICAgICAtIFNldCAwCiAgICAgICAgICAgIC0gU2V0IDI1NQogICAgICAgICAgLSBTZXQgMAogICAgICAgIC0gU2V0IDI1NQogICAgICAtIFNldCAwCiAgaWYgeSA%2BIDUwNAogICAgaWYgeSA%2BIDc2MgogICAgICBpZiB5ID4gODkzCiAgICAgICAgaWYgeSA%2BIDk1OAogICAgICAgICAgaWYgeSA%2BIDk5MQogICAgICAgICAgICAtIFNldCAyNTUKICAgICAgICAgICAgLSBTZXQgMAogICAgICAgICAgLSBTZXQgMjU1CiAgICAgICAgLSBTZXQgMAogICAgICAtIFNldCAyNTUKICAgIC0gU2V0IDAKLSBTZXQgMjU1
2021-03-30 04:50:55
surma
2021-03-30 04:58:53
<@!111445179587624960> The noise at the end is the actual code. You’d need to represent the user code with that human-readable format