2 For Version 1.00 of this spec see:
4 http://reality.sgi.com/grafica/sgiimage.html
11 The SGI Image File Format
17 Silicon Graphics Computer Systems
21 This is the definitive document describing the SGI image file format. This
22 is a low level spec that describes the actual byte level format of SGI image
23 files. On SGI machines the preferred way of reading and writing SGI image
24 files is to use the image library -limage. This library provides a set
25 of functions that make it easy to read and write SGI images. If you are
26 on an SGI workstation you can get info on -limage by doing:
30 A note on byte order of values in the SGI image files
32 In the following description a notation like bits[7..0] is used to denote
33 a range of bits in a binary value. Bit 0 is the lowest order bit in
36 All short values are represented by 2 bytes. The first byte stores the
37 high order 8 bits of the value: bits[15..8]. The second byte stores
38 the low order 8 bits of the value: bits[7..0].
40 So, this function will read a short value from the file:
42 unsigned short getshort(inf)
48 return (buf[0]<<8)+(buf[1]<<0);
51 All long values are represented by 4 bytes. The first byte stores the
52 high order 8 bits of the value: bits[31..24]. The second byte stores
53 bits[23..16]. The third byte stores bits[15..8]. The forth byte stores
54 the low order 8 bits of the value: bits[7..0].
56 So, this function will read a long value from the file:
58 static long getlong(inf)
64 return (buf[0]<<24)+(buf[1]<<16)+(buf[2]<<8)+(buf[3]<<0);
68 The general structure of an SGI image file is as shown below:
70 The header indicates whether the image is run length encoded (RLE).
72 If the image is not run length encoded, this is the structure:
77 If the image is run length encoded, this is the structure:
86 The header consists of the following:
88 Size | Type | Name | Description
90 2 bytes | short | MAGIC | IRIS image file magic number
91 1 byte | char | STORAGE | Storage format
92 1 byte | char | BPC | Number of bytes per pixel channel
93 2 bytes | ushort | DIMENSION | Number of dimensions
94 2 bytes | ushort | XSIZE | X size in pixels
95 2 bytes | ushort | YSIZE | Y size in pixels
96 2 bytes | ushort | ZSIZE | Number of channels
97 4 bytes | long | PIXMIN | Minimum pixel value
98 4 bytes | long | PIXMAX | Maximum pixel value
99 4 bytes | char | DUMMY | Ignored
100 80 bytes | char | IMAGENAME | Image name
101 4 bytes | long | COLORMAP | Colormap ID
102 404 bytes | char | DUMMY | Ignored
105 Here is a description of each field in the image file header:
107 MAGIC - This is the decimal value 474 saved as a short. This
108 identifies the file as an SGI image file.
110 STORAGE - specifies whether the image is stored using run
111 length encoding (RLE) or not (VERBATIM). If RLE is used, the value
112 of this byte will be 1. Otherwise the value of this byte will be 0.
113 The only allowed values for this field are 0 or 1.
115 BPC - describes the precision that is used to store each
116 channel of an image. This is the number of bytes per pixel
117 component. The majority of SGI image files use 1 byte per
118 pixel component, giving 256 levels. Some SGI image files use
119 2 bytes per component. The only allowed values for this field
122 DIMENSION - described the number of dimensions in the data stored
123 in the image file. The only allowed values are 1, 2, or 3. If
124 this value is 1, the image file consists of only 1 channel and
125 only 1 scanline (row). The length of this scanline is given by the
126 value of XSIZE below. If this value is 2, the file consists of a
127 single channel with a number of scanlines. The width and height
128 of the image are given by the values of XSIZE and YSIZE below.
129 If this value is 3, the file consists of a number of channels.
130 The width and height of the image are given by the values of
131 XSIZE and YSIZE below. The number of channels is given by the
132 value of ZSIZE below.
134 XSIZE - The width of the image in pixels
136 YSIZE - The height of the image in pixels
138 ZSIZE - The number of channels in the image. B/W (greyscale) images
139 are stored as 2 dimensional images with a ZSIZE or 1. RGB color
140 images are stored as 3 dimensional images with a ZSIZE of 3. An RGB
141 image with an ALPHA channel is stored as a 3 dimensional image with
142 a ZSIZE of 4. There are no inherent limitations in the SGI image
143 file format that would preclude the creation of image files with more
146 PINMIN - The minimum pixel value in the image. The value of
147 0 may be used if no pixel has a value that is smaller than 0.
149 PINMAX - The maximum pixel value in the image. The value of
150 255 may be used if no pixel has a value that is greater than 255.
151 This is the value that is considered to be full brightness in
154 DUMMY - This 4 bytes of data should be set to 0.
156 IMAGENAME - An null terminated ascii string of up to 79 characters
157 terminated by a null may be included here. This is not commonly
160 COLORMAP - This controls how the pixel values in the file should be
161 interpreted. It can have one of these four values:
163 0: NORMAL - The data in the channels represent B/W values
164 for images with 1 channel, RGB values for images with 3
165 channels, and RGBA values for images with 4 channels.
166 Almost all the SGI image files are of this type.
168 1: DITHERED - The image will have only 1 channel of data.
169 For each pixel, RGB data is packed into one 8 bit value.
170 3 bits are used for red and green, while blue uses 2 bits.
171 Red data is found in bits[2..0], green data in bits[5..3],
172 and blue data in bits[7..6]. This format is obsolete.
174 2: SCREEN - The image will have only 1 channel of data.
175 This format was used to store color-indexed pixels.
176 To convert the pixel values into RGB values a colormap
177 must be used. The appropriate color map varies from
178 image to image. This format is obsolete.
180 3: COLORMAP - The image is used to store a color map from
181 an SGI machine. In this case the image is not displayable
182 in the conventional sense.
184 DUMMY - This 404 bytes of data should be set to 0. This makes the
185 header exactly 512 bytes.
188 The Image Data (if not RLE)
190 If the image is stored verbatim (without RLE), then image data directly
191 follows the 512 byte header. The data for each scanline of the first
192 channel is written first. If the image has more than 1 channel, all
193 the data for the first channel is written, followed by the remaining
194 channels. If the BPC value is 1, then each scanline is written as XSIZE
195 bytes. If the BPC value is 2, then each scanline is written as XSIZE
196 shorts. These shorts are stored in the byte order described above.
199 The Offset Tables (if RLE)
201 If the image is stored using run length encoding, offset tables
202 follow the header that describe what the file offsets are to the
203 RLE for each scanline. This information only applies if the value
204 for STORAGE above is 1.
206 Size | Type | Name | Description
208 tablen longs | long | STARTTAB | Start table
209 tablen longs | long | LENGTHTAB | Length table
211 One entry in each table is needed for each scanline of RLE data. The
212 total number of scanlines in the image (tablen) is determined by the
213 product of the YSIZE and ZSIZE. There are two tables of longs that
214 are written. Each consists of tablen longs of data. The first
215 table has the file offsets to the RLE data for each scanline in the
216 image. In a file with more than 1 channel (ZSIZE > 1) this table first
217 has all the offsets for the scanlines in the first channel, followed
218 be offsets for the scanlines in the second channel, etc. The second
219 table has the RLE data length for each scanline in the image. In a
220 file with more than 1 channel (ZSIZE > 1) this table first has all the
221 RLE data lengths for the scanlines in the first channel, followed
222 be RLE data lengths for the scanlines in the second channel, etc.
224 To find the the file offset, and the number of bytes in the RLE data
225 for a particular scanline, these two arrays may be read in and indexed as
228 To read in the tables:
230 unsigned long *starttab, *lengthtab;
232 tablen = YSIZE*ZSIZE*sizeof(long);
233 starttab = (unsigned long *)mymalloc(tablen);
234 lengthtab = (unsigned long *)mymalloc(tablen);
235 fseek(inf,512,SEEK_SET);
236 readlongtab(inf,starttab);
237 readlongtab(ing,lengthtab);
240 To find the file offset and RLE data length for a scanline:
242 rowno is an integer in the range 0 to YSIZE-1
243 channo is an integer in the range 0 to ZSIZE-1
245 rleoffset = starttab[rowno+channo*YSIZE]
246 rlelength = lengthtab[rowno+channo*YSIZE]
248 It is possible for two identical rows (scanlines) to share compressed
249 data. A completely white image could be written as a single compressed
250 row and having all table entries point to that row. Another little hack
251 that should work is if you are writing out a RGB RLE file, and a
252 particular scanline is achromatic (greyscale), you could just make the
253 r, g and b rows point to the same data!!
255 The Image Data (if RLE)
257 This information only applies if the value for STORAGE above is 1. If
258 the image is stored using run length encoding, the image data follows
259 the offset tables above. The RLE data is not in any particular order.
260 The offset tables above are used to locate the rle data for any scanline.
262 The RLE data must be read in from the file and expanded into pixel
263 data in the following manner:
265 If BPC is 1, then there is one byte per pixel. In this case the
266 RLE data should be read into an array of chars. To expand
267 data, the low order seven bits of the first byte: bits[6..0]
268 are used to form a count. If the high order bit of the first
269 byte is 1: bit[7], then the count is used to specify how many
270 bytes to copy from the RLE data buffer to the destination.
271 Otherwise, if the high order bit of the first byte is 0: bit[7],
272 then the count is used to specify how many times to repeat the
273 value of the following byte, in the destination. This process
274 continues until a count of 0 is found. This should decompress
275 exactly XSIZE pixels.
277 Here is example code to decompress a scanline:
279 expandrow(optr,iptr,z)
280 unsigned char *optr, *iptr;
283 unsigned char pixel, count;
288 if ( !(count = (pixel & 0x7f)) )
305 If BPC is 2, there is one short (2 bytes) per pixel. In this
306 case the RLE data should be read into an array of shorts. To
307 expand data, the low order seven bits of the first short: bits[6..0]
308 are used to form a count. If bit[7] of the first short is 1, then
309 the count is used to specify how many shorts to copy from the RLE
310 data buffer to the destination. Otherwise, if bit[7] of the first
311 short is 0, then the count is used to specify how many times to
312 repeat the value of the following short, in the destination. This
313 process proceeds until a count of 0 is found. This should decompress
314 exactly XSIZE pixels. Note that the byte order of short data in
315 the input file should be used, as described above.
320 Implementation of both RLE and VERBATIM format for images with
321 BPC of 1 is required since the great majority of SGI images are in
322 this format. Support for images with a 2 BPC is encouraged.
324 If the ZSIZE of an image is 1, it is assumed to represent B/W
325 values. If the ZSIZE is 3, it is assumed to represent RGB data,
326 and if ZSIZE is 4, it is assumed to contain RGB data with alpha.
328 The origin for all SGI images is the lower left hand corner. The
329 first scanline (row 0) is always the bottom row of the image.
333 On SGI systems, SGI image files end with the extension .bw if
334 they are B/W images, they end in .rgb if they contain RGB image
335 data, and end in .rgba if they are RGB images with alpha channel.
337 Sometimes the .sgi extension is used as well.
341 This program will write out a valid B/W SGI image file:
352 unsigned char buf[1];
355 fwrite(buf,1,1,outf);
362 unsigned char buf[2];
366 fwrite(buf,2,1,outf);
369 static int putlong(outf,val)
373 unsigned char buf[4];
379 return fwrite(buf,4,1,outf);
386 unsigned char outbuf[IXSIZE];
389 of = fopen("example.rgb","w");
391 fprintf(stderr,"sgiimage: can't open output file\n");
394 putshort(of,474); /* MAGIC */
395 putbyte(of,0); /* STORAGE is VERBATIM */
396 putbyte(of,1); /* BPC is 1 */
397 putshort(of,2); /* DIMENSION is 2 */
398 putshort(of,IXSIZE); /* XSIZE */
399 putshort(of,IYSIZE); /* YSIZE */
400 putshort(of,1); /* ZSIZE */
401 putlong(of,0); /* PIXMIN is 0 */
402 putlong(of,255); /* PIXMAX is 255 */
403 for(i=0; i<4; i++) /* DUMMY 4 bytes */
405 strcpy(iname,"No Name");
406 fwrite(iname,80,1,of); /* IMAGENAME */
407 putlong(of,0); /* COLORMAP is 0 */
408 for(i=0; i<404; i++) /* DUMMY 404 bytes */
411 for(y=0; y<IYSIZE; y++) {
412 for(x=0; x<IXSIZE; x++)
413 outbuf[x] = (255*x)/(IXSIZE-1);
414 fwrite(outbuf,IXSIZE,1,of);