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
-
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 somehowSami Kuhmonen– Sami Kuhmonen2022年03月09日 14:30:48 +00:00Commented 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.kisuli– kisuli2022年03月09日 16:46:52 +00:00Commented Mar 9, 2022 at 16:46