TI.Image
The TI.image format is used by TI-Nspire Lua to display images. It uses a bitmap based format with no compression at all. The image data consists out of a header section and a data section.
The header
The header consists out of 20 bytes of data arranged as presented in the following table. All fields are little endian integers.
Offset | Width (bytes) | Contents |
---|---|---|
0 | 4 | Pixel width of image |
4 | 4 | Pixel height of image |
8 | 1 | Image alignment (0) |
9 | 1 | Flags (0) |
10 | 2 | Padding (0) |
12 | 4 | The number of bytes between successive raster lines (generally 2*width) |
16 | 2 | The number of bits per pixel (16) |
18 | 2 | Planes per bit (1) |
Image data
The image data immediately follows the header. Pixels are arranged in rows. Each pixel is a little endian 16-bit integer with five bits for each color red, green and blue. The top bit determines if the pixel is drawn. If its zero (0), the pixel is not drawn (alpha). If it is one (1), the pixel is drawn in the RGB color of the remaining 15 bits.
Example, converting a RGB color:
R=255 → R = 31 (because each pixel can only have 5 bits per color)
G=012 → G = 1
B=123 → B = 15
A= 1 (alpha flag, make that the pixel is visible)
To make things easy, we will fist convert it to binary in this form: A RRRRR GGGGG BBBBB With the above data: 1 11111 00001 01111
But, since the data needs to be stored in little endian, it has to be in this form: GGGBBBBB ARRRRRGG Quite easy to fix, as we only need to swap both halves: 00101111 11111100
Ok, now we have our pixel data! This data can then be put inside a string using escape characters (8 bit per escape character), for example: 00101111 becomes “\047” and 11111100 becomes “\252”. If a escape character is ASCII UTF-8 representable, you can replace it with the equivalent char (“\122” can be replaced by “z”).
Example implementation in a program:
str = "\007\000\000\000\008\000\000\000\000\000\000\000\014\000\000\000\016\000\001\000alalalalalalalal\000\244\000\244al\000\244\000\244al\000\244\000\244\000\244\000\244\000\244\000\244\000\244\000\244\000\244\000\244\000\244\000\244\000\244\000\244al\000\244\000\244\000\244\000\244\000\244alalal\000\244\000\244\000\244alalalalal\000\244alalalalalalalalalal5"
img = image.new(str)
function on.paint(gc)
gc:drawImage(img,10,10)
end