TI.Image

From Inspired-Lua Wiki
Revision as of 15:46, 17 December 2013 by Adriweb (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

The TI.image format was (before apilevel 2.3 / OS 3.6) 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


External Links

Adriweb made a video showing some direct manipulations of the TI-Image, in order to understand better the format in general.

Jim Bauwens made a image previewer, a sprite creator and a basic python image converter (you need PythonMagick to run this)

These tools are not official and we'll update this as soon as we can / are allowed to.

In the official Nspire Lua toolkit, TI included in their software a feature that converts an image (with a common format such as jpg, png etc.) into a TI.Image format.

References