Difference between revisions of "TI.Image"
m |
|||
(4 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
− | The TI. | + | 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 | + | ==The header== |
+ | The header consists out of 20 bytes of data arranged as presented in the following table. All fields are little endian integers. | ||
− | The | + | {| class="wikitable" |
+ | |- | ||
+ | ! 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. | |
− | |||
− | If | ||
− | + | Example, converting a RGB color: | |
− | |||
− | |||
− | |||
− | + | R=255 → R = 31 (because each pixel can only have 5 bits per color)<br /> | |
− | + | G=012 → G = 1<br /> | |
− | + | B=123 → B = 15<br /> | |
− | + | 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 | + | Example implementation in a program: |
− | |||
− | + | <source> | |
− | + | 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 | ||
+ | </source> | ||
− | |||
− | |||
− | |||
==External Links== | ==External Links== | ||
− | [[User:Adriweb|Adriweb]] made [http://www.youtube.com/watch?v=YQhrMHNkL3A a video] showing some direct manipulations of the TI-Image, in order to understand better the format in general. | + | [[User:Adriweb|Adriweb]] made [http://www.youtube.com/watch?v=YQhrMHNkL3A a video] showing some direct manipulations of the TI-Image, in order to understand better the format in general. |
− | [[User:jimbauwens| | + | [[User:jimbauwens|Jim Bauwens]] made [http://bwns.be/jim/tiviewer.html a image previewer], [http://bwns.be/jim/sprite.html a sprite creator] and a basic [http://bwns.be/jim/convert.py 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. | These tools are not official and we'll update this as soon as we can / are allowed to. | ||
Line 98: | Line 75: | ||
==References== | ==References== | ||
http://en.wikipedia.org/wiki/Highcolor | http://en.wikipedia.org/wiki/Highcolor | ||
− | |||
− | |||
− |
Latest revision as of 15:46, 17 December 2013
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.