0

I would like to know how the tiff image is decoded from PCL language. I have analyzed my PCL data and I have also parsed the row data if someone could help me decode it.

GhostScript output My canvas output with green rectangle fill

string* "\x1B*r1A" // Start Raster
string* "\x1B*b2M" // Compression Method Tagged image file format encoding interprets raster data as TIFF "Packbits."
string* "\x1B*b12W" // Transfer Raster by Row/Block
hex_raw* [ 81 00 81 00 81 00 82 00 02 3c 3c 38 ]
string* "\x1B*b12W" // Transfer Raster by Row/Block
hex_raw* [ 81 00 81 00 81 00 82 00 02 18 38 10 ]
string* "\x1B*b19W" // Transfer Raster by Row/Block
hex_raw* [ 
81 00 81 00 81 00 88 00 09 01 c7 f7 00 00 03 ff ff ff c0 
]
string* "\x1B*b21W" // Transfer Raster by Row/Block
hex_raw* [ 
81 00 81 00 81 00 88 00 0b 03 c3 c3 00 00 03 ff ff ff c0 00 02 
]
...
// more row data
...
string* "\x1B*b16W" // Transfer Raster by Row/Block
hex_raw* [ 81 00 81 00 81 00 85 00 06 01 81 80 00 01 01 01 ]
string* "\x1B*b18W" // Transfer Raster by Row/Block
hex_raw* [ 
81 00 81 00 81 00 86 00 08 03 03 83 80 00 03 83 83 03 
]
string* "\x1B*b0M" // Compression Method
string* "\x1B*rB" // End Raster Graphics

As far as I understand data below is compressed with packbits algorithm. I have tried uncompressing it and then tried to draw all the row bits which are one '1', are drawn to the canvas to the corresponding <x,y> (x = bit position - y = row number) position but not at all getting the correct results.

var context = document.getElementById('myCanvas').getContext('2d');
var rowData = `8100810081008200023c3c38
810081008100820002183810
81008100810088000901c7f7000003ffffffc0
81008100810088000b03c3c3000003ffffffc00002
81008100810088000defffffc0000fffffffc002e3e3c0
81008100810088000dbfffffc0002fffffffe000aff780
81008100810089000e0bffffff00007fffffff000bfffffc
81008100810089000e0afefefe00003efefefe002efffffc
8100810081008c00122038003ffffffc0002fffffffc003ffffffff0
8100810081008b001110003ffffffc0003fffffffc003fffffffd0
8100810081008d000e01fffd00fffffff00007fffffff000fdff00c0
8100810081008d000e03efff02ffffffe00003ffffffe003fdff00c0
8100810081008e000f02effff003ffffffc0000fffffffc003fdff020003c3
8100810081008d000eaffff003ffffffc0002fffffffc003fdff
8100810081008e00160bffffd003ffffff40003fffffff000bfffffff8000fff
8100810081008e00170efefef00afefeff00003efefeff000ffefefefc003efe30
8100810081008e00173fffff002fffffff0000fffffffc003ffffffff0003ffff8
8100810081008e00173fffff000fffffff0000fffffffe000ffffffff0003ffff0
8100810081008e0017ffffff000ffffffd0003fffffffc003fffffffc001fffffd
8100810081008f000a03ffffff000fffffff0003fdff09002fffffffc003ffffff
8100810081008f000f03ffffff003ffffff60003fffffff000fdff048003ffffff
8100810081008f001803fffffc003ffffffc0003fffffff0003fffffff0003ffffff
8100810081008f00190ffffffc007ffffff8000ffffffff000fffffffe000fffffff40
8100810081008f00182ffefefc003efefefc002ffefefef0007efefefc002ffefeff
8100810081008f00193ffffff000fffffff0003ffffffff000fffffffc003ffffffff0
8100810081008f00193ffffff000fffffff0001fffffffc000fffffffc001fffffffd0
8100810081008f0019bfffffc003ffffffc0003fffffffc003fffffff4003ffffffff0
8100810081008f0019bfffffc003ffffffc0002fffffffc003fffffff0002fffffffe0
81008100810090001502ffffffc003ffffffc000bfffffff0003fffffff000fdff00f0
8100810081008f0019ffffffc003ffffffc0003fffffff0003fffffff000bffffffff0
8100810081008f0014ffffff000bffffff40007fffffff000ffffffff000fdff00fc
8100810081008f0014fefeff000ffefeff20003efefefe002ffefefef000fdfe00fc
81008100810090001503ffffff000fffffff0000fffffffc003ffffffff000fdff00fc
81008100810090001503ffffff000fffffff0000fffffffc000fffffffd000fdff00fc
81008100810090001507ffffff000fffffff0003fffffff4000fffffffc003fcff
81008100810090001503ffffff000fffffff0003fffffff2000fffffffc003fcff
8100810081009000150fffffff000fffffff0003fffffff0002fffffffc003fcff0080
8100810081009000150fffffff000fffffff0003fffffff0002fffffffc003fcff
8100810081009000153ffffffc003ffffffc0003fffffff0003fffffff000ffcff
8100810081009000153efefefc003efefefc000bfefefef0003efefeff000ffdfe00ff
8100810081009000153ffffffc003ffffffc000ffffffff0003fffffff000ffcff
8100810081009000153ffffffc003ffffffc000ffffffff0003fffffff000ffcff00c0
81008100810090000fbffffff000bffffffc000fffffffc000fdff01000ffcff00c0
810081008100900004fffffff000fdff06000fffffffc000fdff01000ffcff00c0
81008100810090000ffffffff000fffffff0000fffffffc000fdff01000ffcff00c0
81008100810090000ffffffff000fffffff0000fffffffc000fdff01000ffcff00c0
810081008100900015fffffff000fffffff8003fffffff0000fffffffc003ffcff00f0
8100810081009000157efefef000fefefefc003efefeff0000fefefefc003efcfe00f0
810081008100900015fffffff000fffffff8003fffffff0000fffffffc003ffcff00f0
810081008100900015fffffff000fffffff0003fffffff0000fffffffc003ffcff00f0
81008100810091001603ffffffc001fffffff0003fffffff0003fffffff400bffcff00f0
81008100810091001603ffffffc003ffffffe000afffffff0003fffffff200bffcff00f0
81008100810091000a03ffffffc003ffffffc000fdff060003fffffff000fbff00f0
81008100810091001603ffffffc003ffffffe000bfffffff0003fffffff000bffcff00f0
81008100810091001603ffffffc003fffffff0007ffffffc0003fffffff8003ffcff00fc
81008100810091001c02fefefef002fefefef0003efefefc0002fefefef8003efefefffefefc
81008100810091001c0bffffffc003fffffff0007ffffffc0003fffffff0003fffff72fffffc
81008100810091001c03ffffffc003ffffffd000fffffffc0003fffffff0007fffffc2fffffc
81008100810091001c03ffffffc003ffffffc001fffffff40003fffffff001ffffff01fffffc
81008100810091001c03ffffffc003ffffffc003fffffff20003ffffffe003ffffff83ffffff
81008100810091001c03ffffffc003ffffffc003fffffff00003ffffffe003ffffff00ffffff
81008100810091001c07ffffffc003ffffffc003fffffff00003ffffffe000ffffff00fffffc
81008100810091001c0fffffff000bffffff4000fffffff0000ffffffff000fffffc003ffffc
81008100810091001c3ffefeff000ffefeff3000fefefef8000ffefefef000fefefc003efefc
81008100810091001c3fffffff000fffffff0000fffffff0000ffffffff000fffffc003ffffc
81008100810091001c0fffffff000fffffff4002fffffff0000ffffffff000fffffc003ffffc
81008100810091001c0fffffff0007ffffffc003fffffff00007ffffffc003fffff4003fffff
81008100810091001c0fffffff8003ffffffc003ffffffe00003ffffffc003fffff2000fffff
81008100810091001c0fffffff0003ffffffc003ffffffc00007ffffffc003fffff0000fffff
81008100810091001c0fffffff0007ffffffc003ffffffc0000fffffffc003fffff4000fffff
81008100810091001c1fffffff000fffffff000bffffffd0001fffffffc003fffff8001fffff
81008100810091001c3efefefe002ffefeff000bfefefef0003ffefefff002fefefc003efefe
81008100810091001c3ffffffe000fffffff000ffffffff0003fffffffc003fffff8003ffffe
81008100810091001c3fffffff000fffffff000bffffffc0000fffffffc003fffff0001fffff
81008100810091001c3fffffff000fffffff0003ffffffc0000fffffffc003fffff0000fffff
81008100810091001c2fffffff000fffffff8003ffffffc0000fffffffc003ffffe0000fffff
81008100810091001c3fffffff000fffffff0003ffffffc0000fffffffc003fffff00007ffff
81008100810091001c3fffffff000fffffff000fffffffc0000fffffffc003fffff0000fffff
81008100810091001c3ffffffc000fffffff000fffffff00001fffffff4003fffff0000fffff
81008100810091001c3efefefc003ffefefe003efefeff00003efefeff000bfefef0002ffefe
81008100810091001c3ffffffc003ffffffe003fffffff00003fffffff000bfffff0000fffff
81008100810091001c3ffffffc000fffffff000fffffff00001fffffff0003fffff0000fffff
81008100810091001d3ffffffd000fffffff000fffffff00000fffffff8003fffff00007ffff80
81008100810091001d3fffffff000fffffff000fffffff80000fffffffc003ffffe00003ffffc0
81008100810091001d3fffffff000fffffff000fffffff00000fffffffc003ffffe00003ffffc0
81008100810091001d3ffffffd000fffffff000fffffff00000fffffff8003fffff00003ffffc0
81008100810091001c3ffffffc001fffffff001fffffff00003fffffff000bfffff0000fffff
81008100810091001c3efefefc003efefefe003efefefe00003efefeff000ffefef0000ffeff
81008100810091001c3ffffffc003ffffffe003ffffffc00003fffffff000ffffff0000fffff
81008100810091001c3ffffffc001fffffff003ffffffe00003fffffff000bfffff0000fffff
81008100810091001d3ffffffd000fffffff003fffffff00000fffffff8003ffffc00003ffffc0
81008100810091001d3fffffff000fffffff000fffffff00000fffffffc003ffffc00003ffffc0
81008100810091001d3fffffff000fffffff002fffffff00000fffffffc003ffffc00003ffffc0
81008100810091001d3ffffffd000fffffff003ffffffd00000fffffff0003ffffc00003ffffc0
81008100810091001c3ffffffc001fffffff003ffffffc00003fffffff000bfffff0000bffff
81008100810091001c3efefefc003efefefe003efefefc00003efefeff000ffefef0000ffeff
81008100810091001c3ffffffc003ffffffe003ffffffc00003fffffff000ffffff0000fffff
81008100810091001c3ffffffc000fffffff003ffffffc00003fffffff000bfffff0000fffff
81008100810091001d3ffffffd000fffffff003ffffffd00000fffffff8003ffffc00003ffffc0
81008100810091001d3fffffff000fffffff003fffffff00000fffffffc003ffffc00003ffffc0
81008100810091001d3fffffff000fffffff003fffffff00000fffffffc003ffffc00003ffffc0
81008100810091001d3fffffff000fffffff003ffffffc00000fffffffc003ffffc00003ffffc0
81008100810091001c3ffffffc000fffffff003ffffffc00003fffffff000bfffff0000bffff
81008100810091001c3efefefc003ffefefe003efefefc00003efefeff000ffefef0000ffeff
81008100810091001c3ffffffc000ffffffe003ffffffc00003fffffff000bfffff0000fffff
81008100810091001c3ffffffe000fffffff003ffffffc00003fffffff0003fffff0000fffff
81008100810091001d3fffffff0007ffffff003ffffff400000fffffffc003fffff00003ffff80
81008100810091001d3fffffff0003ffffff003ffffff200000fffffffc003ffffe00003ffffc0
81008100810091001d3fffffff0003ffffff803ffffff000000fffffffc003ffffe00003ffff80
81008100810091001c3fffffff0007ffffff003ffffff000000fffffffc003fffff00003ffff
81008100810091001c3fffffff000fffffff003ffffff800001fffffffc003fffff0000fffff
81008100810091001c3efefefe000ffefeff003efefefc00003efefeff600bfefef0002ffefe
81008100810091001c3fffffff000fffffff003ffffffc00003fffffff4003fffff0000fffff
81008100810091001c3fffffff0003ffffff003ffffff800001fffffffc003fffff0000fffff
81008100810091001c0fffffff0003ffffffc03ffffff000000fffffffc003fffff00007ffff
81008100810091001c0fffffff8003ffffffc0bffffff000000fffffffc003ffffe00003ffff
81008100810091001c0fffffff8003ffffffc0bffffff000000fffffffc003fffff0000fffff
81008100810091001c0fffffff0003ffffffc03ffffff000000fffffffc003fffff0000fffff
81008100810091001c1fffffff0003ffffff403ffffff800000fffffffd003fffff0001fffff
81008100810091001c3efefeff0002fefeff203efefefc00003ffefefef002fefef8003efefe
81008100810091001c3fffffff0002ffffff603ffffff800000ffffffff000fffffc003ffffc
81008100810091001c0fffffff0003ffffffc03ffffff000000fffffffd002fffff0001ffffe
81008100810091001c0fffffffc003ffffffc03ffffff0000007ffffffc003fffff0000fffff
81008100810091001c0fffffffc003ffffffc0bffffff0000003ffffffc003fffff0000fffff
81008100810091001c03ffffffc003ffffffc0bffffff0000003ffffffc003fffff0000fffff
81008100810091001c07ffffffc000ffffffc03ffffff0000003ffffffe001fffff4002ffffd
81008100810091001c0fffffffd000fffffff03ffffff000000bfffffff000fffffc003ffffc
81008100810091001c0ffefefef000fefefef03efefef800000ffefefef000fefefc003efefc
81008100810091001c0bfffffff0003ffffff03ffffff000000ffffffff000fffffc003ffffc
81008100810091001c03ffffffd0007ffffff03ffffff0000003fffffff000fffffc003ffffc
81008100810091001c03ffffffe000bffffff03ffffff0000003fffffff000ffffff00bffffc
81008100810091001c03ffffffc000fffffff03ffffff0000003ffffffe003ffffff00ffffff
81008100810091001c03fffffff000bffffff03ffffff0000003fffffff000ffffff00fffff4
81008100810091001c03fffffff0003ffffff03ffffff0000003fffffff000ffffff00fffffc
8100810081009000
8100810081009000
810081008100900015fffffff8003ffffffc3ffffff8000000fffffffc003ffcff00f8
810081008100900015fffffff0003ffffffc3ffffff0000002fffffffc003ffcff00f0
81008100810091001601fffffff4000fffffff3ffffff0000001fffffff4003ffcff00f0
81008100810091001603fffffff0000fffffff2ffffff0000003fffffff300affcff00f0
810081008100900005fffffff40007fbff03f0000003fdff01002ffcff00e0
810081008100900005fffffffc000ffbff09f0000000fffffffc002ffcff00f0
8100810081009000053ffffffc000ffbff09f8000000fffffffc003ffcff00f0
8100810081009000053efefefc000ffbfe09fc000000fefefefc003efcfe00f0
8100810081009000053ffffffc000bfbff09fc0000003ffffffc003ffcff00f0
8100810081009000053ffffffc0003fbff09f80000007ffffffc001ffcff00c0
8100810081009000053fffffff0003fbff09f0000000bfffffff000ffcff00c0
8100810081009000052fffffff0003fbff03f0000000fdff01000ffcff00c0
8100810081009000050fffffff0003fbff09f00000003fffffff0003fcff00c0
8100810081009000050fffffff0003fbff09f00000003fffffff0007fcff00c0
8100810081009000050fffffff0000fbff09fc0000003fffffff000bfcff
8100810081009000052ffefeff0000fbfe09fc0000003efefeff000efdfe00ff
8100810081009000060bffffff00003ffcff09fc0000003fffffff4003fdff00fe
81008100810090000603ffffff40003ffcff09fc0000003fffffffc003fcff
81008100810090000603ffffffc0003ffcff09fc0000000fffffffc003fcff
81008100810090000603ffffffc000bffcff09f70000000fffffffc003fcff
81008100810090000603ffffffc0002ffbff0800000007ffffffc003fcff
81008100810090000601ffffffc0002ffcff09fc0000000fffffffe000fdff00fc
8100810081008f00057ffffff0001ffcff0efc0000000bfffffff0007ffffffffc
8100810081008f00053efefef0003efcfe0efc0000000ffefefef0003efefefefc
8100810081008f00053ffffffc000ffcff0efc0000000bfffffffc003ffffffff0
8100810081008f00053ffffff8000ffcff0efc00000003fffffffc003ffffffff0
8100810081008f00050ffffffc0003fbff0d01c18187fffffffc000fffffffc0
8100810081008f00050fffffff0003fbff0303c3c3c3fdff05000fffffffc0
8100810081008f000503ffffff0003fbff0003faff05000fffffffc0
8100810081008f000507ffffff0003fbff0001faff05000fffffffc0
8100810081008f000603ffffff00007ffcff0000faff04000bffffff
8100810081008f000602fefefe00003efcfe0000fafe04000ffefefe
8100810081008e00053fffff00003ffcff0000faff040000fffffc
8100810081008e00057fffffc0003ffcff0000faff044000fffffc
8100810081008e00053fffffc0000ffcff0080faff04c000fffff0
8100810081008e00052fffffc0000ffcff00c2faff04c002fffff2
8100810081008e000503fffff00003fcff00c0faff04f0000fffc0
8100810081008e000503fffff00003fcff00c0faff04f0000fffc0
8100810081008d00047ffffc0000fcff01c03ffbff03fc00007c
8100810081008d00043efefc0000fcfe01f03efbfe03fc00003c
8100810081008d00053fffff00003ffdff01f03ffaff
8100810081008d00051fffff00003ffdff01d03ffaff
8100810081008c0004a7ffc00007fdff01e00ffaff00c0
8100810081008d000503c3ffc00003fdff01c00ffaff00c0
8100810081008c00040283c00003fdff01f003faff00c0
8100810081008b000303c00001fdff01f007faff00c0
8100810081008700051ffffffff803fbff0010
81008100810087000c3efffefefc02fefefefffffc38
81008100810086000a3efffffc003ffffffe3c30
8100810081008600091ffffffc003fffffff78
81008100810085000601818000010101
810081008100860008030383800003838303`
var rasterData = rowData.split('\n');
// loop through rows
for(var i = 0; i < rasterData.length; ++i)
{
 var inputData = '';
 // loop trough row bytes and convert them to hex string
 for(var j = 0; j < rasterData[i].length; j+=2)
 {
 var byteStr = rasterData[i].charAt(j) + rasterData[i].charAt(j+1);
 if(j == 0)
 {
 inputData = byteStr;
 }
 else
 {
 inputData += ' ' + byteStr;
 }
 }
 // unpack packbits 
 var data = unpackBits(hex2str(inputData));
 var unPackedHexData = str2hex(data).split(' ');
 var minX = 3950; // reposition draw -- otherwise canvas will be more than 4000px wide
 // redo draw
 for(var j = 0; j < unPackedHexData.length; ++j)
 {
 var binaryDataStr = dec2bin(Number('0x'+unPackedHexData[j]));
 for(var k = 0; k < binaryDataStr.length; ++k)
 {
 // if binary data is '1' then draw green 
 if(binaryDataStr.charAt(k) == '1')
 {
 context.beginPath();
 let size = 1;
 context.rect((j*8+(7-k))*size-minX,(i)*size,size,size);
 context.strokeStyle="green";
 context.stroke();
 }
 }
 }
}
console.log('done');
 
// utility functions source got from here https://en.wikipedia.org/wiki/PackBits
function str2hex (str) {
 return str.split('').map(function (char) {
 var value = char.charCodeAt(0);
 return ((value < 16 ? '0' : '') + value.toString(16)).toUpperCase();
 }).join(' ');
}
function hex2str (hex) {
 return hex.split(' ').map(function (string) {
 return String.fromCharCode(parseInt(string, 16));
 }).join('');
}
function unpackBits (data) {
 var output = '',
 i = 0;
 while (i < data.length) {
 var hex = data.charCodeAt(i);
 if (hex == 128) {
 // Do nothing, nop
 }
 else if (hex > 128) {
 // This is a repeated byte
 hex = 256 - hex;
 for (var j = 0; j <= hex; ++j) {
 output += data.charAt(i + 1);
 }
 ++i;
 }
 else {
 // These are literal bytes
 for (var j = 0; j <= hex; ++j) {
 output += data.charAt(i + j + 1);
 }
 i += j;
 }
 ++i;
 }
 return output;
}
 
function dec2bin(dec) {
 return (dec >>> 0).toString(2);
}
<html>
<head>
</head>
<body>
<h1>(tiff) decoder </h1>
<canvas id="myCanvas" width="300px" height="300px">
</canvas>
</body>
</html>

Christoph Rackwitz
16.4k5 gold badges42 silver badges56 bronze badges
asked Mar 9, 2022 at 14:24
2
  • Yes, looks like PackBits, but not knowing how you interpret or draw them can’t say why it isn’t working. Since your image has no empty pixels I assume you’re skipping them somehow Commented Mar 9, 2022 at 14:30
  • Well my thought process for the implementation was to go through the packed image row by row by unpacking each row. Once row data has been unpacked I go through the result bit by bit and if the bit value is ’1’ i will draw a green rectangle to my canvas at the corresponding bit position and row position. After go row data is completed we unpack the next row data and so on. But I guess that I’m not properly unpacking the data or I have misunderstood the whole rasterization procedure.. I will edit my question and post my code for reference. Commented Mar 9, 2022 at 16:46

0

Know someone who can answer? Share a link to this question via email, Twitter, or Facebook.

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.