Search code examples
c#postscriptrun-length-encodingrawimage

Extract a bitmap from a PostScript (CIP3) file


I've asked a similar question some months ago, on the following link: Creating a code to decompress byte-oriented RLE image

And I've also read this question (was closer to mine): Extract a bitmap from PostScript

I am dealing with CIP3 files, which are basically PostScript files with a few additional items. The important ones here are:
Image matrice
Image width / height
Image data

The image data is an RLE Encoded data - and I've got the code to decode RLE, from the question I asked some months ago. The code works, I tested it on some sample files I have.

However, look this table: CIP3 Image Orientation Reference

I got things working only on case 1 and 2. However, when it comes to read it "from right to left", or "from bottom to top" I can't get it to work.

I tried:
LINQ's Reverse() function - still produces an invalid image
Reverse the byte array using a regular for loop - invalid image also
Reverse the file after it was decoded - invalid image
Reverse the byte array before decoding - invalid image

This is the code to decode the RLE image:

class RLEDecompressor
{
    public byte[] rleDecompressed { get; private set; }
    public RLEDecompressor(byte[] byteFile)
    {
        List<byte> final = new List<byte>();
        int i = 0;
        while (i < byteFile.Length)
        {
            try
            {
                var lengthByte = byteFile[i++]; //First run, position 1
                if (lengthByte <= 127)
                {
                    int currLen = lengthByte + 1;
                    for (int j = 0; j < currLen; j++)
                        final.Add(byteFile[i++]);
                }
                else
                {
                    int currLen = 257 - lengthByte;
                    byte byteToCopy = byteFile[i++];
                    for (int j = 0; j < currLen; j++)
                        final.Add(byteToCopy);
                }
            }
            catch (Exception ex)
            {
                rleDecompressed = final.ToArray();
                break;
            }
        }
        rleDecompressed = final.ToArray();
        
    }

I expected the output to be an valid image. However all outputs I got were blurry images or "something else" (not a valid image).

I'm providing a sample of the file I'm trying to decode. The link is: https://drive.google.com/open?id=1iTSyCKTzXGPyONejXnw28KEDacjIpBUl&fbclid=IwAR2DujV_eYBA8Ees6LRWUVcQio0cJ5EIpb4ck1BT6xmcRdpXGVubf57BHh4

Image width: 2061

Image Height: 1571

Channels: 1

If everything is decoded correctly, the image can be viewed in Photoshop (just save it with extension .raw).

Thanks in advance for any input.


Solution

  • You appear to have your Image Width and Image Height values swapped around. The decoded data can be read into Gimp as "Raw image data" using the following settings:

    • Image type: Indexed
    • Offset: 0
    • Width: 1571
    • Height: 2016
    • Palette type: R, G, B (normal)
    • Palette offset: 0
    • Palette file: None