65.9K
CodeProject is changing. Read more.
Home

SUN Raster File Decoder

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.72/5 (9 votes)

Jul 11, 2004

CPOL

1 min read

viewsIcon

51572

downloadIcon

679

This article provides information on the decoder for Sun Raster files.

Sample Image - RAS_Decoder.jpg

Introduction

This article provides information on the decoder for Sun Raster files. I had been using a free image library for quiet some time. A few days back, I wanted to support the Sun Raster file format (.ras). Since the library I am currently using doesn't support this format, I started looking for a decoder. I found that the FreeImage Imaging Library supports this format. So I used this library as a reference to write a standalone decoder.

The RAS File Format

The RAS format is described here.

The RAS Header

The RAS header is as follows:

struct RASHEADER {
DWORD magic;            // Magic number
DWORD width;            // Image width in pixels
DWORD height;           // Image height in pixels
DWORD depth;           // Depth (1, 8, 24 or 32 bits) of each pixel
DWORD length;          // Image length (in bytes)
DWORD type;            // Format of file
DWORD maptype;      // Type of colormap
DWORD maplength;   // Length of colormap (in bytes) 
} RASHEADER;

Note the following:

#define RAS_MAGIC 0x59A66A95 // Magic number for Sun rasterfiles

A check for the above number should be done after reading the header information to verify if it's a SUN Raster file.

The RAS decoder consists of a class CLibRAS having the following functions:

  • BMP * LoadRAS(FILE* handle);
  • unsigned GetWidth(BMP *dib);
  • BYTE *GetBits(BMP *dib);
  • unsigned GetHeight(BMP *dib);
  • BITMAPINFO *GetInfo(BMP *dib);
  • unsigned GetLine(BMP *dib);
  • unsigned GetBPP(BMP *dib);
  • unsigned GetColorsUsed(BMP *dib);
  • RGBQUAD * GetPalette(BMP *dib);
  • unsigned GetPitch(BMP *dib);

The LoadRAS function returns the image in a DIB format which can be used with the StretchDIBits function to draw the image on the device context.

A simple usage of the class would be as follows:

CLibRAS Decoder;
BMP *dib = Decoder.LoadRAS(fopen("C:\\lady256.ras","rb"));
  
  ::StretchDIBits(AfxGetMainWnd()->GetDC()->m_hDC,
                  10,                       // Destination x
                  10,                       // Destination y
                  Decoder.GetWidth(dib),    // Destination width
                  Decoder.GetHeight(dib),   // Destination height
                  0,                        // Source x
                  0,                        // Source y
                  Decoder.GetWidth(dib),    // Source width
                  Decoder.GetHeight(dib),   // Source height
                  Decoder.GetBits(dib),     // Pointer to bits
                  Decoder.GetInfo(dib),     // BITMAPINFO
                  DIB_RGB_COLORS,           // Options
                  SRCCOPY);                 // Raster operator code

Would appreciate if you post the results after usage.