InstaxBLE icon indicating copy to clipboard operation
InstaxBLE copied to clipboard

max_size_kb is present in IMAGE_SUPPORT_INFO and is much higher (+ maybe bug in pil_image_to_bytes)

Open aleksejspopovs opened this issue 1 year ago • 16 comments

The last four bytes of the IMAGE_SUPPORT_INFO struct seem to contain the maximum image size that the printer will support. On my Link Wide, it's 0x52800 = 337920 = 330 * 1024:

->  b'Ab\x00\x08\x00\x02\x00R'
<-  b'aB\x00\x13\x00\x02\x00\x00\x04\xec\x03H\x02{\x00\x05(\x00b'
    EventType.SUPPORT_FUNCTION_INFO 000004ec0348027b00052800

I can confirm that this is in fact the max supported image size by experimenting with PRINT_IMAGE_DOWNLOAD_START. If you give it a valid image size, it responds with the printer's desired chunk size, but if you give it a size that's too big, it seems to respond with 0x81:

337919
->  b"Ab\x00\x0f\x10\x00\x02\x00\x00\x00\x00\x05'\xff\x10"
<-  b'aB\x00\x0c\x10\x00\x00\x00\x00\x03\x84\xb9'
    EventType.PRINT_IMAGE_DOWNLOAD_START 0000000384
337920
->  b'Ab\x00\x0f\x10\x00\x02\x00\x00\x00\x00\x05(\x00\x0e'
<-  b'aB\x00\x0c\x10\x00\x00\x00\x00\x03\x84\xb9'
    EventType.PRINT_IMAGE_DOWNLOAD_START 0000000384
337921
->  b'Ab\x00\x0f\x10\x00\x02\x00\x00\x00\x00\x05(\x01\r'
<-  b'aB\x00\x08\x10\x00\x81\xc3'
    EventType.PRINT_IMAGE_DOWNLOAD_START 81

This is 3x higher than the currently hardcoded value of 105kb and can allow for significantly higher quality.

Also, I think there's a bug in pil_image_to_bytes: img_buffer is never cleared between calls to save_img_with_quality, so it never actually shrinks in size. If you call save_img_with_quality(80), then save_img_with_quality(50), you will get a buffer that has the same length as the quality-80 JPEG but contains the quality-50 JPEG followed by leftover trailing bytes from the quality-80 one. Because print_image then does len(imgData), it will get an invalid value, and printing might fail if the buffer was too long on any iteration of the binary search.

aleksejspopovs avatar Jun 12 '24 01:06 aleksejspopovs

This is extremely useful info. How did you figure this out? I need to find some time to work on it, but I'll surely try to implement this! Thank you!

javl avatar Jun 13 '24 06:06 javl

Oh and about the second part: I'm sure this is because I've mostly used the script as a single shot program: call the script, print one photo, exit. So I never realised that variable wouldn't reset for the next photo. Seems like an easy fix, thanks.

javl avatar Jun 13 '24 06:06 javl

I'm glad this can be of use!

How did you figure this out?

It's a bit of a long story :sweat_smile: I couldn't get InstaxBLE.py to work for me—I get a segfault inside simplepyble right after a connection—so I ended up rewriting it to work over a Bluetooth Classic socket. While debugging that, I noticed that in #15 you sounded uncertain about the actual size limit, so I experimented with it by trying to print a really large image, which failed, and since I was logging all sent/received messages I noticed the weird response to PRINT_IMAGE_DOWNLOAD_START. So then I figured out exactly what the limit was by sending PRINT_IMAGE_DOWNLOAD_START messages with different lengths in them and seeing which succeed. Once I had the answer, 0x52800, I guessed that the printer might expose a more civilized way of finding this out, so I went back and looked at other messages I'd seen to check if that number appears anywhere, and it was right there in IMAGE_SUPPORT_INFO.

Oh and about the second part: I'm sure this is because I've mostly used the script as a single shot program: call the script, print one photo, exit. So I never realised that variable wouldn't reset for the next photo. Seems like an easy fix, thanks.

The bug can actually trigger in a single-shot use too, e.g. if you have an image that doesn't compress well like this one, check this out:

>>> from InstaxBLE import InstaxBLE
>>> from PIL import Image
>>> instax = InstaxBLE()
>>> instax.imageSize = (1260, 840)
>>> ba = instax.pil_image_to_bytes(Image.open('prints/scale_636_002.png'), max_size_kb=105) # ask for <=105kb
>>> len(ba) / 1024 # but get 241kb
241.205078125

It's because img_buffer isn't cleared between calls to save_img_with_quality, and pil_image_to_bytes calls save_img_with_quality many times.

aleksejspopovs avatar Jun 13 '24 19:06 aleksejspopovs

@aleksejspopovs

I'm glad this can be of use!

Absolutely. The original script was made by reverse engineering the Android app, which seems to use all hardcoded values, so it is extremely interesting to find out you can improve the quality.

Did you see there is a (simplified) socket version in the repo? https://github.com/javl/InstaxBLE/blob/main/Instax-Bluetooth-socket.py

I started out with this socket version, but moved to a GATT version to make it cross platform (I don't think the socket version works on MacOS for example)

javl avatar Jun 14 '24 09:06 javl

Do you know if the app prints with the lower 105kb size, and have you noticed an improvement in the quality of your prints using this script?

I'm also curious if this hard limit applies when you bypass the app through other means, for example: Instax share printer sp-3 : printing directly from mirror less Fujifilm camera through WiFi Instax link wide: printing from MAC/PC using the new official driver Hybrid digital cameras such as sq10 and Evo mini: printing directly from sdcard

dtristany avatar Dec 02 '24 11:12 dtristany

I haven't really done any comparative testing. I wrote this module for a project, and while I'd love to expand the capabilities (and have so for some users) I just don't always have time and money to spend on this. Still looking for ways to make a living from these kind of open source tools ;)

I didn't know they released their own Mac/Windows app (and wow does that app look like it has been designed by programmers). I guess they felt the pressure of users making their own tools ;) I really dislike how they've limited the use to the Wide model though. We know already know all printers work the same way, with slight changes in their parameters. I assume the Wide model is the most expensive and they want to make it more exclusive.

javl avatar Dec 02 '24 12:12 javl

It's a bit of a long story 😅 I couldn't get InstaxBLE.py to work for me—I get a segfault inside simplepyble right after a connection—so I ended up rewriting it to work over a Bluetooth Classic socket.

@aleksejspopovs Could you please share the code to get it to work as a Bluetooth classic socket? I'm trying to confirm the limits you found for the square and mini printers. I'm on WSL2 running on windows 10.

it was right there in IMAGE_SUPPORT_INFO.

Also, how did you log communication from the printer? I'm thinking I can do it by modifying this line to: self.log(f"Received packet for IMAGE_SUPPORT_INFO: {self.prettify_bytearray(packet)}")

dtristany avatar Dec 10 '24 20:12 dtristany

@aleksejspopovs Could you please share the code to get it to work as a Bluetooth classic socket? I'm trying to confirm the limits you found for the square and mini printers. I'm on WSL2 running on windows 10.

Happy to share my code, though I'm not sure how useful it will be. I'm running Linux, where Bluetooth Classic "Serial port" profile devices are exposed as regular files on the filesystem, like /dev/rfcomm0, that you can interact with through (e.g.) pyserial.

As you will see, I ended up rewriting/refactoring most of the communication code from the async paradigm used in the repo to a more sync flow, and along the way I dumped a few debugging statements like print('<- ', result) in there.

aleksejspopovs avatar Dec 10 '24 23:12 aleksejspopovs

@aleksejspopovs I finally had some time to experiment this weekend. The results I got on my square link don't really match with what you found:

`(venv) ~\Projects\instaxBLE $ python .\InstaxBLE.py
[INFO] SimpleBLE: D:\a\SimpleBLE\SimpleBLE\simpleble\src\backends\windows\Utils.cpp:33 in initialize_winrt: CoGetApartmentType: cotype=1, qualifier=1, result=0
[INFO] SimpleBLE: D:\a\SimpleBLE\SimpleBLE\simpleble\src\backends\windows\Utils.cpp:41 in initialize_winrt: RoInitialize: result=0
Getting function info... InfoType.IMAGE_SUPPORT_INFO: {packet}
event: EventType.SUPPORT_FUNCTION_INFO ; packet: b'aB\x00\x13\x00\x02\x00\x00\x03 \x03 \x02\x00\x00\x06@\x00\xb9'
Received packet for IMAGE_SUPPORT_INFO: 61 42 00 13 00 02 00 00 03 20 03 20 02 00 00 06 40 00 b9
03 20 03 20
image size: 800x800
event: EventType.SUPPORT_FUNCTION_INFO ; packet: b'aB\x00\r\x00\x02\x00\x01\x01#\x00\x00('
event: EventType.SUPPORT_FUNCTION_INFO ; packet: b'aB\x00\x11\x00\x02\x00\x02\x10\x00\x00\x0c\x00\x00\x00\x00+'

Printer details:
Model:               Instax Square Link
Photos left:         0/10
Battery level:       35%
Charging:            False
Required image size: 800x800px
MTU:                 244

event: EventType.LED_PATTERN_SETTINGS ; packet: b'aB\x00\x080\x01\x00#'
Waiting for one minute...
event: EventType.LED_PATTERN_SETTINGS ; packet: b'aB\x00\x080\x01\x00#'
finally, disconnect`

The only number that would make sense is 409600, obtained by discarding the last byte of the IMAGE_SUPPORT_INFO structure and using the previous 2. That gives 400kb for the square, which is higher than the wide. I'll see if it works, but it doesn't make sense.

dtristany avatar Dec 15 '24 19:12 dtristany

Hm, comparing the messages it sure looks like that must be the number, though:

                                     xxxxxx
 mine: 614200130002000004ec0348027b0005280062
yours: 614200130002000003200320020000064000b9

Maybe there's a funny thing going on where the two devices have the same amount of RAM, but the WIDE needs more RAM to store the decompressed bitmap, so they had to allocate less to the buffer that stores the JPEG? :sweat_smile:

Definitely do try using it and report back! Like I've said, my WIDE happily prints 337920-byte JPEGs and won't accept a single byte more.

aleksejspopovs avatar Dec 15 '24 19:12 aleksejspopovs

@aleksejspopovs I could't get your code for experimenting with PRINT_IMAGE_DOWNLOAD_START to work with simplepyble, so I had to send real images of different sizes.

I got up 10mb and it was still accepting the image to print without throwing an error. The weird part is that the script is only sending 298 image data packets, which with a chunk size of 1808 would imply a size of less than 600kb:

long log `(venv)~\Projects\instaxBLE $ python .\InstaxBLE.py -v -i '..\imagetest10mb.jpg' [INFO] SimpleBLE: D:\a\SimpleBLE\SimpleBLE\simpleble\src\backends\windows\Utils.cpp: 33 in initialize_winrt: CoGetApartmentType: cotype= 1, qualifier = 1, result = 0 [INFO] SimpleBLE: D:\a\SimpleBLE\SimpleBLE\simpleble\src\backends\windows\Utils.cpp: 41 in initialize_winrt: RoInitialize: result= 0 Searching for instax printer... Connecting to INSTAX-50180513(IOS)[xxxxxx] Connected Getting function info... InfoType.IMAGE_SUPPORT_INFO: { packet } event: EventType.SUPPORT_FUNCTION_INFO; packet: b'aB\x00\x13\x00\x02\x00\x00\x03 \x03 \x02\x00\x00\x06@\x00\xb9' Received packet for IMAGE_SUPPORT_INFO: 61 42 00 13 00 02 00 00 03 20 03 20 02 00 00 06 40 00 b9 03 20 03 20 image size: 800x800 event: EventType.SUPPORT_FUNCTION_INFO; packet: b'aB\x00\r\x00\x02\x00\x01\x01#\x00\x00(' event: EventType.SUPPORT_FUNCTION_INFO; packet: b'aB\x00\x11\x00\x02\x00\x02\x1a\x00\x00\x0c\x00\x00\x00\x00!' Printer details: Model: Instax Square Link Photos left: 10/10 Battery level: 35% Charging: False Required image size: 800x800px MTU: 244 event: EventType.LED_PATTERN_SETTINGS; packet: b'aB\x00\x080\x01\x00#' printing image "..\imagetest10mb.jpg" event: EventType.LED_PATTERN_SETTINGS; packet: b'aB\x00\x080\x01\x00#' Saved img with quality of 100 Printing is disabled, sending all packets except the actual print command Waiting for one minute... event: EventType.PRINT_IMAGE_DOWNLOAD_START; packet: b'aB\x00\x0c\x10\x00\x00\x00\x00\x07\x10)' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x00?' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x01>' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x02=' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x03\x01' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00?\x00' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00@\xff' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00A\xfe' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00B\xfd' Img packets left to send: 230 event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00C\xfc' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00D\xfb' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00E\xfa' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00F\xf9' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00G\xf8' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00H\xf7' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00I\xf6' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00J\xf5' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00K\xf4' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00L\xf3' Img packets left to send: 220 event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00M\xf2' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00N\xf1' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00O\xf0' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00P\xef' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00Q\xee' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00R\xed' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00S\xec' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00T\xeb' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00U\xea' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00V\xe9' Img packets left to send: 210 event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00W\xe8' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00X\xe7' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00Y\xe6' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00Z\xe5' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00[\xe4' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\\\xe3' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00]\xe2' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00^\xe1' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00_\xe0' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00`\xdf' Img packets left to send: 200 event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00a\xde' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00b\xdd' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00c\xdc' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00d\xdb' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00e\xda' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00f\xd9' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00g\xd8' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00h\xd7' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00i\xd6' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00j\xd5' Img packets left to send: 190 event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00k\xd4' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00l\xd3' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00m\xd2' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00n\xd1' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00o\xd0' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00p\xcf' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00q\xce' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00r\xcd' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00s\xcc' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00t\xcb' Img packets left to send: 180 event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00u\xca' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00v\xc9' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00w\xc8' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00x\xc7' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00y\xc6' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00z\xc5' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00{\xc4' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00|\xc3' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00}\xc2' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00~\xc1' Img packets left to send: 170 event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x7f\xc0' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x80\xbf' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x81\xbe' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x82\xbd' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x83\xbc' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x84\xbb' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x85\xba' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x86\xb9' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x87\xb8' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x88\xb7' Img packets left to send: 160 event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x89\xb6' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x8a\xb5' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x8b\xb4' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x8c\xb3' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x8d\xb2' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x8e\xb1' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x8f\xb0' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x90\xaf' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x91\xae' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x92\xad' Img packets left to send: 150 event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x93\xac' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x94\xab' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x95\xaa' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x96\xa9' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x97\xa8' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x98\xa7' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x99\xa6' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x9a\xa5' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x9b\xa4' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x9c\xa3' Img packets left to send: 140 event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x9d\xa2' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x9e\xa1' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\x9f\xa0' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xa0\x9f' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xa1\x9e' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xa2\x9d' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xa3\x9c' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xa4\x9b' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xa5\x9a' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xa6\x99' Img packets left to send: 130 event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xa7\x98' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xa8\x97' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xa9\x96' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xaa\x95' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xab\x94' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xac\x93' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xad\x92' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xae\x91' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xaf\x90' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xb0\x8f' Img packets left to send: 120 event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xb1\x8e' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xb2\x8d' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xb3\x8c' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xb4\x8b' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xb5\x8a' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xb6\x89' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xb7\x88' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xb8\x87' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xb9\x86' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xba\x85' Img packets left to send: 110 event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xbb\x84' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xbc\x83' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xbd\x82' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xbe\x81' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xbf\x80' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xc0\x7f' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xc1~' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xc2}' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xc3|' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xc4{' Img packets left to send: 100 event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xc5z' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xc6y' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xc7x' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xc8w' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xc9v' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xcau' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xcbt' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xccs' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xcdr' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xceq' Img packets left to send: 90 event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xcfp' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xd0o' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xd1n' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xd2m' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xd3l' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xd4k' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xd5j' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xd6i' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xd7h' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xd8g' Img packets left to send: 80 event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xd9f' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xdae' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xdbd' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xdcc' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xddb' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xdea' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xdf`' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xe0_' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xe1^' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xe2]' Img packets left to send: 70 event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xe3\\' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xe4[' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xe5Z' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xe6Y' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xe7X' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xe8W' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xe9V' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xeaU' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xebT' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xecS' Img packets left to send: 60 event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xedR' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xeeQ' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xefP' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xf0O' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xf1N' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xf2M' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xf3L' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xf4K' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xf5J' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xf6I' Img packets left to send: 50 event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xf7H' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xf8G' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xf9F' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xfaE' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xfbD' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xfcC' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xfdB' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xfeA' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x00\xff@' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x01\x00>' Img packets left to send: 40 event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x01\x01=' event: EventType.PRINT_IMAGE_DOWNLOAD_DATA; packet: b'aB\x00\x0c\x10\x01\x00\x00\x00\x01\x02 I have firmware 100, while the latest one is 101

dtristany avatar Dec 16 '24 05:12 dtristany

I was a bit nervous at first because I didn't want to waste a print, but I just went for it. It printed perfectly a 622kb image with dimensions 800x800 It seems it only starts giving problems when it has to send more than 540 packets, then it can randomly disconnect even though it hasn't finished uploading the image.

In the end I got cheeky, disabled the script's scaling to 800x800 and tried to print a 900kb image with dimentions 1200x1200. It worked to a point, the image was accepted by the printer, but the printed photo was cropped, I think probably to 800x800. So it seems the square printer will accept different dimensions and then crop it printer side. I tried increasing the chunk size as suggested here but no luck, the packets change to always sending the same package and then it disconnects: event: EventType.PRINT_IMAGE_DOWNLOAD_DATA ; packet: b'aB\x00\x08\x10\x01\x81\xc2' I've thought about upgrading to firmware 101, but I'm afraid I'll lose the ability to print large photos.

dtristany avatar Dec 16 '24 09:12 dtristany

Sorry, haven't had time to read this issue in detail so forgive me for missing any information, but yes, when I printed larger images, they were also cropped. I went into the app data location via ADB and found the images that were sent directly to the printer. They were always scaled down to 800x800 by the app.

I confirmed that these were the actual images being sent to the printer by decoding the Bluetooth capture image packets. This was back in March so it might be different now.

Side note, when looking at those images, they were very over saturated. Printing in 'vivid' mode seems to apply some kind of curves adjustment/LUT or ICC profile before sending it to the printer. I tried to reverse engineer the LUT, and create my own to get more 'accurate' colours out of the printer and had moderate levels of success.

bezmi avatar Dec 16 '24 22:12 bezmi

@bezmi That's really interesting. I'm only using this script and there's only 2 firmware, 100 and 101, so things couldn't have been that different in March. It's helpful to clarify if we're talking about dimensions or size. For dimensions, the printer itself must also be able to crop. I sent a 1200x1200 jpeg from the script and it cropped 800x800 anchored on the right upper corner. For size, it seems to be variable on the square link, between 550 and 600 packets of 1808 bytes, so roughly 970kb to 1060kb. If you send a picture that's too large, eventually the printer disconnects and nothing gets printed, I presume it's because it runs out of memory. They still haven't put any hard limits on latest firmware 101. Not helpful that they don't release any changelog.

Regarding the colours, there's natural mode and "rich" mode. I like the natural mode, and I just reduce brightness and add a little yellow shift on Krita. Dom Varney was working on an ICC profile for the older printers https://domvarney.com/2016/11/07/instax-sp2-part-1/ I'd like to try your ICC profile and compare if you still have it?

dtristany avatar Dec 17 '24 11:12 dtristany

Two quick questions:

  • The printer might be able to take larger files, but do you actually see any difference in quality when sending larger images?
  • I don't know anything about ICC profiles, but I do notice the Android app talks about 3DLUT settings. Maybe the original app contains the Lut settings as a file we can inspect? What am I looking for? It contains a file called 20210212_3DLUT.bin but not sure how to read it (plus it's like 63 Mb which seems excessive for just the LUT settings?)

javl avatar Dec 17 '24 13:12 javl

Two quick questions:

* do you actually see any difference in quality when sending larger images?

The photos look crisper now and I've not had any more issues with colour banding compared to using the 160kb limit (see image attached, there's no banding in the ocean or sky). My square link photos also look higher quality than my instax wide printer with 330kb limit. So much so that I'll be selling my instax wide.

* I don't know anything about ICC profiles, but I do notice the Android app talks about 3DLUT settings. Maybe the original app contains the Lut settings as a file we can inspect? What am I looking for? It contains a file called `20210212_3DLUT.bin` but not sure how to read it (plus it's like 63 Mb which seems excessive for just the LUT settings?)

@bezmi is the person to answer this one. I've never used LUTs before, only ICC profiles and i've never seen one larger than 1mb. A quick search shows LUT files have extension .cube and the free to download ones are also around 500kb in size. Unless you know what compression they used for the BIN file, it will not be easy to reverse engineer. Possibly not a great use of time either, since you can apply a similar effect by playing around with photo editors.

Image printed on instax square link firmware 0100

IMG_20241217_133111095

dtristany avatar Dec 17 '24 13:12 dtristany