PostArt Poets Logo ETG Poem

Internet Art, Linguistic Deconstruction

Here’s a new posting of an Encoded Twitter Graphic, the protocol of which you may peruse here. This particular graphic is a tiled ETG, which is mentioned here. The tweets are as follows:

`CGA`09x12`ExrD11`{444444444444444444444444444444444444444C4444444CF
F7CC444CFFFFFF44CFCCC7F44CFC444744CF7C44C44CFFFF7F44CF7C7FF

`CGA`09x12`ExrD12`{4444444444CC4444444FF44444447F44444447F444C444CF7
C4FC4C7FFFFFC4F7FCFFC44F7F47F444F7FCFC444F7FFF444477FF44444

`CGA`09x12`ExrD21`{44CFC77C744CF7FFFF44CFCFCC7444CCFC444444CF7444444
4FFFF4444CF77F44444FC4C4444CFC444444CFC4444444FC44444444444

`CGA`09x12`ExrD22`{CCF744444F7CC44444FFF44444447F44444447F444444C7F4
44444FFF444444C77444444444444444444444444444444444444444444

And encode the logo of the PostArt Poets in the CGA color space. These four tweets may be considered a poem, in four stanzas, celebrating digital art in all its glory.

Actual size:

PPA-Tweet

Detail view (10x):
PPA-Tweet-Big

Another Way to Get More ETG Pixels

Data Representation, Internet Art

Continuing on the idea of stuffing the Twitter pipeline with pixels, maybe I should just not worry so much about compression and figure out a way to divide images up and let the coding enable people to reconstitute them. Thus, I have prepared a tiled Twitter graphic, expanding from a simple 9 x 12 pixel CGA graphic to a 27 x 36 pixel graphic in 9 tiles.

For this end, though, I’ll need to modify the header definitions. Consider this ETG V0.2, with a small tweak on how to deal with images that are supposed to be displayed together.

The ATG frames code includes a 4-letter ID squib and 2 hex digits for animation frame numbering. I reserved the first block of 128 for a non-looping animation set, which is actually kinda silly because most Web animations are looped anyway. So let’s use that block to indicate the location of each tile in the set. This gives us a latitude of 7 tiles across and 15 tiles down, or tile coordinates 7E.

If you have a tileset of 7 tiles by 10 tiles, then the tiling number 45 means “fourth tile from the left, fifth tile down”. The tiling number 12 means “first tile from the left, second down”. And, using hex, number 7A means “seventh tile from left, ten down”, or the last tile in this set.

For this image, I tiled an image into a 3×3 grid, or 9 tiles. For our first tile, the header will look like this:

`CGA which gives the color space

`09×12 which gives the size of the tile

`FedW11 which gives the ID squib and the origin tile (first from left, first down)

and `{ which locates the data payload.

The tiles can be tweeted in any order, because they share their unique ID squib and their ordering is contained within their headers. However, I prepared these in left-right/top-down order, so I’ll paste them here that way:

`CGA`09x12`FedW11`{000600000000000000000400000000400000000004000
0E7E80000000000000000000000000000000000000000000000000000000000

`CGA`09x12`FedW12`{000000008000000067000688087000C7707700077C867
000C7786700087778700067787800008E878066608887086206878600088687

`CGA`09x12`FedW13`{600068808680087808600066888088187780938077778
997067787199077777039187C760091177770001199E7000009993000000399

`CGA`09x12`FedW21`{006008604060666660604006086000040660000000004
0000000040000000000000000000000000008800000088860000870E668807E

`CGA`09x12`FedW22`{E777FFF776776877EF788888667766886877767888677
7777767F777E77777E777E77F776777F77777C67777688777C7788787C7C7F7

`CGA`09x12`FedW23`{677E6CC8867C7777888677E7777066777F67006767777
800087877780000660668804008778888860777788A007778A6630137787710

`CGA`09x12`FedW31`{0608000686000600460400060064008EFFF70000666E6
40006EE6A0000680600646066EE0600460666664008EE7C760646E7766800EE

`CGA`09x12`FedW32`{EE77A997E7F77708E6F7F7E66ECF76866F6F7C666A6A6
77088666A7E76E0000F77E7E8677FEEE6000777770444066E6000666E660000

`CGA`09x12`FedW33`{C76E00000C676400006E76040047670404067E6040040
780004000600000000000000000000000000000000400000000000000000006

Here are those pieces:

Here they are assembled:

And here they are enlarged for more clarity:

Further CGA ETG Compression

Data Representation, Internet Art

I’ve been trying to find a way to compress images even more, so I could expand the size of the color tweets available. Basically, since Twitter uses only the usable characters of ASCII text, and it can be hard to type higher-bit ASCII on some keyboards, I’ve pretty much exhausted the palette of encoding options with my 6-bit “0-9 A-Z a-v” encoding scheme. So… instead of encoding, maybe I could address patterns in the data itself.

One of the easiest things to see in the data are strings of repeating elements. If I could further encode those strings I could save room and not have long lines of 000000 or 33333 for fields of color in the image. Let’s say I simply put the number of pixels in front of the code for the pixel color, and the TwGD will decipher what was meant. So, a string of eight white CGA pixels, FFFFFFFF, would be represented as 8F.

The only problem with this is that the character 8 already encodes for dark grey. Putting numbers in the stream will collide with the numbers already there. So I’ll need to convert the hex numbers into a new coding scheme, so the pixel quantities don’t mess with the pixel codes. Say, pixel 0 (black) equals a, pixel 1 (dark blue) equals b, and so on. In this scheme, the string of white, FFFFFFFF, would become 8p. That’s a savings of 6 characters!

Of course, you won’t get that kind of savings everywhere. Especially 2-pixel doubles, since you’re just replacing 2 identical pixel codes with a “2” and the new code. There’s still some squishing to be had here. For this special case, I came up with a second series of codes, using punctuation to stand for pixel doubles. Here’s the full set of codes for this scheme, which I’m calling Similar String CGA encoding (“CGS”)

0 = a   00 = !
1 = b   11 = "
2 = c   22 = $
3 = d   33 = %
4 = e   44 = &
5 = f   55 = '
6 = g   66 = (
7 = h   77 = )
8 = i   88 = *
9 = j   99 = +
A = k   AA = ,
B = l   BB = -
C = m   CC = .
D = n   DD = /
E = o   EE = :
F = p   FF = ;

So, using this additional compression scheme, I was able to encode a 12 x 17 pixel CGA image with plenty of room to spare. It doesn’t sound like too much extra, but that’s 150% the area of the 10 x 13 CGA pixel image I tweeted back in December, and includes the ETG header information, too.

Here’s the image, a color version of the self-portrait from yesterday:

And the resulting tweet, using “CGS” as the code for this new compression scheme:

`GCS`12x17`{6ag12ae!ghi9ago11ag8aigag4ah*gpiag3a4h3pigahih3ihphioa3hp
)phigia)ih;hp)!*)p3hpi3ai5hgh3a3ihp4h!*haihp)g!b)i!i)3ajd)i8abj3hi5a

A New ETG (Encoded Twitter Graphic) Self-Portrait

Data Representation, Internet Art

I dusted off the old ETC encoding protocol today for a project I’m doing for a show entry, creating a self-portrait to send through social media. I used the 6-bit compression scheme I used for old Teddy Roosevelt’s 2-bit gray image for an image of myself. Because I did a couple tweaks on the protocol between encoding Roosevelt and nailing down the format, I had to sacrifice a line of pixels for this image. It’s 15×25 pixels, not 15×26, but that’s not too bad. The tweet:

`2bg`15x25`{K5LLX01MH5G41Kle00GR4004P0006M01GQL07glb0R$$r9UQ$lUkckhlh
$!PFl$$zMh$luck$gq6R!hm6Q!gWRMl$Hdql!LNj1O0Nwb0G2lgG51hxH006fGH00004

And the encoded image:

ATG for the New Year

Data Representation, Internet Art

It’s 2012! To celebrate, I’m posting this Animated Twitter Graphic (ATG):

`CGA`15x08`qqwD80`{888888888888888EE988EE98EE9EE988A9E98A98E988A88A9E9
8A98A988A8E98E98A98A98E9E988E98A98A9E98EEA98EE988A9EEA888888888888888

`CGA`15x08`qqwD81`{FFFFFFFFFFFFFFFEE988EE98EE9EE988A9E98A98E988A88A9E9
8A98A988A8E98E98A98A98E9E988E98A98A9E98EEA98EE988A9EEA888888888888888

`CGA`15x08`qqwD82`{BBBBBBBBBBBBBBBEE9FFEE9FEE9EE988A9E98A98E988A88A9E9
8A98A988A8E98E98A98A98E9E988E98A98A9E98EEA98EE988A9EEA888888888888888

`CGA`15x08`qqwD83`{FFFFFFFFFFFFFFFEE9BBEE9BEE9EE988A9E9FA9FE9FFA88A9E9
8A98A988A8E98E98A98A98E9E988E98A98A9E98EEA98EE988A9EEA888888888888888

`CGA`15x08`qqwD84`{888888888888888EE9FFEE9FEE9EE9BBA9E9BA9BE9BBAFFA9E9
FA9FA9FFA8E98E98A98A98E9E988E98A98A9E98EEA98EE988A9EEA888888888888888

`CGA`15x08`qqwD85`{888888888888888EE988EE98EE9EE9FFA9E9FA9FE9FFABBA9E9
BA9BA9BBAFE9FE9FA9FA9FE9E988E98A98A9E98EEA98EE988A9EEA888888888888888

`CGA`15x08`qqwD86`{888888888888888EE988EE98EE9EE988A9E98A98E988AFFA9E9
FA9FA9FFABE9BE9BA9BA9BE9E9FFE9FA9FA9E9FEEA98EE988A9EEA888888888888888

`CGA`15x08`qqwD87`{888888888888888EE988EE98EE9EE988A9E98A98E988A88A9E9
8A98A988AFE9FE9FA9FA9FE9E9BBE9BA9BA9E9BEEA9FEE9FFA9EEA888888888888888

`CGA`15x08`qqwD88`{888888888888888EE988EE98EE9EE988A9E98A98E988A88A9E9
8A98A988A8E98E98A98A98E9E9FFE9FA9FA9E9FEEA9BEE9BBA9EEAFFFFFFFFFFFFFFF

`CGA`15x08`qqwD89`{888888888888888EE988EE98EE9EE988A9E98A98E988A88A9E9
8A98A988A8E98E98A98A98E9E988E98A98A9E98EEA9FEE9FFA9EEABBBBBBBBBBBBBBB

`CGA`15x08`qqwD8A`{888888888888888EE988EE98EE9EE988A9E98A98E988A88A9E9
8A98A988A8E98E98A98A98E9E988E98A98A9E98EEA98EE988A9EEAFFFFFFFFFFFFFFF

`CGA`15x08`qqwD8B`{888888888888888EE988EE98EE9EE988A9E98A98E988A88A9E9
8A98A988A8E98E98A98A98E9E988E98A98A9E98EEA98EE988A9EEA888888888888888

`CGA`15x08`qqwD8C`{222222222222222EE922EE92EE9EE922A9E92A92E922A22A9E9
2A92A922A2E92E92A92A92E9E922E92A92A9E92EEA92EE922A9EEA222222222222222

`CGA`15x08`qqwD8D`{CCCCCCCCCCCCCCCEE9CCEE9CEE9EE9CCA9E9CA9CE9CCACCA9E9
CA9CA9CCACE9CE9CA9CA9CE9E9CCE9CA9CA9E9CEEA9CEE9CCA9EEACCCCCCCCCCCCCCC

`CGA`15x08`qqwD8E`{FFFFFFFFFFFFFFFEE9FFEE9FEE9EE9FFA9E9FA9FE9FFAFFA9E9
FA9FA9FFAFE9FE9FA9FA9FE9E9FFE9FA9FA9E9FEEA9FEE9FFA9EEAFFFFFFFFFFFFFFF

`CGA`15x08`qqwD8F`{888888888888888EE988EE98EE9EE988A9E98A98E988A88A9E9
8A98A988A8E98E98A98A98E9E988E98A98A9E98EEA98EE988A9EEA888888888888888

In animated GIF format, it looks like this:

Final ETG (Encoded Twitter Graphic) For The Day

Data Representation, Internet Art

I’m so amused by this silly thought-experiment that I’ll do one final one, a static image, as a response:

`CGA`16x08`{FFFFFFFFFFFFFFFE3000FFF60FF1000EF30FFF60F0FE10EEF30FFF60F0
EE10EEF30FFF60E0EE10EEF30F0E60E0EE10E030000EE60EE10000FEEEEEEEEEEEEEEE

Which sums up today in a nutshell:

and at 1000%:

Helicopter ATG

Data Representation, Internet Art

I was so pleased with my PacMan graphic that I decided to do another one. Here are the tweets:

`CGA`11x11`X3Dh80`{111BBB1111111111111111117777A7711711111A11111AAAAAA
AFF11171A6AAAF111111AAAAA111111212111111122222117111111111177111177111

`CGA`11x11`X3Dh81`{11BBB11111111111111111111177A7777117111A11111AAAAAA
AFF17111ACAAAF111111AAAAA111111212111111122222111111111111771111771117

`CGA`11x11`X3Dh82`{1BBB111111111111111111117777A7711711111A11111AAAAAA
AFF11171A6AAAF111111AAAAA111111212111111122222111111111117111117711177

`CGA`11x11`X3Dh83`{BBB1111111111111111111111177A7777117111A11111AAAAAA
AFF17111ACAAAF111111AAAAA111111212111111122222111111111171111177111771

`CGA`11x11`X3Dh84`{BB11111111B11111111111117777A7711711111A11111AAAAAA
AFF11171A6AAAF111111AAAAA111111212111111122222111111111711111771117711

`CGA`11x11`X3Dh85`{B11111111BB11111111111111177A7777117111A11111AAAAAA
AFF17111ACAAAF111111AAAAA111111212111111122222111111117111117711177111

`CGA`11x11`X3Dh86`{11111111BBB11111111111117777A7711711111A11111AAAAAA
AFF11171A6AAAF111111AAAAA111111212111111122222111111171111177111771111

`CGA`11x11`X3Dh87`{1111111BBB111111111111111177A7777117111A11111AAAAAA
AFF17111ACAAAF111111AAAAA111111212111111122222111111711111171117711117

`CGA`11x11`X3Dh88`{111111BBB1111111111111117777A7711711111A11111AAAAAA
AFF11171A6AAAF111111AAAAA111111212111111122222111117111111111177111177

`CGA`11x11`X3Dh89`{11111BBB11111111111111111177A7777117111A11111AAAAAA
AFF17111ACAAAF111111AAAAA111111212111111122222111171111111111771111771

And here’s the resulting animation (displayed at 200% for better recognition):

Animated Twitter Graphic (.atg?)

Data Representation, Internet Art

Another stab at using Twitter as a data pipe, this time I’ve decided to send an animated graphic as CGA-encoded color frames. This will be similar to an animated .gif file, and I’ve prepared one of those to show what the final image will look like, but this will be completely text-encoded for Twitter.

I’ve also decided that this process needs some machine-readable codes, so if you created a Twitter Graphic Decoder (TwGD) that monitored a Twitter feed it would automatically understand that a graphic was coming its way. Since Twitter itself already uses the hashtag (#) and the at sign (@) to encode Twitter-related information, I’ve decided to co-opt another rarely-used ASCII symbol for my own purposes. So, my Twitter Graphic Tag (TGT) will be the grave-accent, or (`).

So my tweets should set the format and the image payload for the TwGD as a matter of course. With that in mind, I need to have a given area of the tweet for such encoding, so let’s use the convention I set before, maybe using 8-15 characters for this information. To make it easier on the TGD, let’s use that space as a header instead of a footer like I did before. With all this in mind, here’s the first frame of my ATG:


`CGA`10x13`80`{0007EEE700007EEEEEEE700EEEEEEEEE07EEEEEEEEE7EEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEE7EEEEEEEEE70EEEEEEEEE007EEEEEEE700007EEE7000

The header convention spelled out here is this:

`CGA is the color encoding scheme, in this case, the hexadecimal CGA color palette. This will be a three-digit alphanumeric string.

`11×11 is the pixel dimensions in WWxHH, always two digits for each dimension with an (x) in-between. We really can’t encode anything larger than 30 pixels in a Tweet anyway, but the extra overhead is nice.

`80 will be the hexadecimal sequence number of the frame in an animation, starting with 00. For styles of animation, let’s define the first 128 frames (00 – 7F) as encoding static images and the second 128 frames (80-FF) as looping frames. This way we can keep two digits for animation encoding, include a looping option,  and still have around 100 frames to play with.

`{ is a code that makes it explicit that the image data payload is next. It’s not entirely necessary to encode this, but since I have the text space available, I figured it would be nice to have a strong signifier for the payload. The ({) works nicely.

With all that, I still have four text spaces to play with. It would be nice to have a unique identifier for the image so the TwGD can properly assemble the animation, kinda like the ASCII squib used for bit.ly links and such. Of course, this is limiting the Animated Twitter Graphic size to 121 pixels, or a max of about 11×11 or 12×10 or thereabouts. I think that’s okay. Animation always adds something extra that makes the image more human-readable. If there’s no animation-frame ID, the TwGD will assume it’s a static image and those extra seven spaces can be used for payload. So let’s redefine the animation frame code to be a four-digit ASCII ID with a two-digit frame count:

`XXXX00 will be the image ID number and frame sequence number in an animation.

So our new tweet will be:

`CGA`11x11`AqBy80`{0007EEE700007EEEEEEE700EEEEEEEEE07EEEEEEEEE7EEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEE7EEEEEEEEE70EEEEEEEEE007EEEEEEE700007EEE7000

Which will be joined by its siblings

`CGA`11x11`AqBy81`{0007EEE700007EEEEEEE700EEEEEEEEE07EEEEEEEEE7EEEEEEE
EE77EEEEE000000EEEEEEEEE777EEEEEEEEE70EEEEEEEEE007EEEEEEE700007EEE7000

`CGA`11x11`AqBy82`{0007EEE700007EEEEEEE700EEEEEEEEE07EEEEEEEE77EEEEEEE
7000EEEEE000000EEEEEEE70007EEEEEEEE770EEEEEEEEE007EEEEEEE700007EEE7000

`CGA`11x11`AqBy83`{0007EEE770007EEEEEEE700EEEEEEE0007EEEEEE0000EEEEEE0
0000EEEEE000000EEEEEE000007EEEEEE00000EEEEEEE00007EEEEEEE700007EEE7700

`CGA`11x11`AqBy84`{0007EEE700007EEEEEEE700EEEEEEEEE07EEEEEEEE77EEEEEEE
7000EEEEE000000EEEEEEE70007EEEEEEEE770EEEEEEEEE007EEEEEEE700007EEE7000

`CGA`11x11`AqBy85`{0007EEE700007EEEEEEE700EEEEEEEEE07EEEEEEEEE7EEEEEEE
EE77EEEEE000000EEEEEEEEE777EEEEEEEEE70EEEEEEEEE007EEEEEEE700007EEE7000

Which, when assembled by the still-vaporware TwGD, will look like this:

Let’s Get UltraMeta: Tweeting a Compressed QR

Data Representation, Internet Art

My success in compressing 1-bit black and white images (as Holly Golightly) through the Twitter data pipe got me thinking about 1-bit images in general use, and it’s not surprising that I thought of QR codes. QR codes are nothing but 1-bit bitmaps that can be interpreted by your smartphone through image analysis. I still don’t think they’re very useful, but that’s okay.

Most QRs are too large for the compression systems I’ve been using, but the URLs produced by the link-shortening utility on Twitter itself will just fit within the Twitter data packet. This post now has the shortlink http://t.co/Mwd0jCHy, which turns into this QR code:

This particular image is 216 x 216 pixels, but it can be easily reduced to 25 x 25 by resizing it and trimming the white borders:

25 x 25 1-bit pixels can be split into 5 groups of 5, which gives us 5-bit compression, or 32 encodings. I like to think of this as “duotridecimal” encoding, and I merely extend the hexidecimal encoding from 0-F to 0-V. It’s not as much compression as the 6-bit version I used on Audrey and Teddy, but it’s easier for the human operator to work with. Suitably encoded, the bitmap now looks like this:

VOFJV
G8221
N8MAT
NALIT
N8H2T
GA021
VQLBV
02S00
C94J8
G73JB
5CNVD
UL9FO
0QNR1
A3UQ3
OTLHT
5JQV0
UQFVI
028OL
VOIAP
G83OG
N8NVP
N8QHU
NB84J
GAU7G
G0000

Which turns into this Twitter stream:

VOFJVG8221N8MATNALITN8H2TGA021VQLBV02S00C94J8G73JB5CNVDUL9FO0QNR1A3UQ3
OTLHT5JQV0UQFVI028OLVOIAPG83OGN8NVPN8QHUNB84JGAU7GG0000 5b1 25x25 QR

The encoded image is only 125 characters, which means I have 15 characters to indicate the encoding scheme! W00t! “5b1” would mean “5bit-encoded 1-bit B&W image”, “25×25” gives the final dimensions, and “QR” would indicate what the image is to be used for.

I find this highly amusing, and I’m quite entertained. ; )

And Finally, A 2-Bit Grayscale Image of Teddy Roosevelt with 6 Bits of Compression

Data Representation, Internet Art

For my final trick this evening, I decided to see what would happen if I applied some pixel-level compression a la Audrey Hepburn to a grayscale image. Of course, I’m working with the bare-bones of grayscale, having only four levels of value: white, light gray, dark gray and black. That allows me to clump the pixels in triplets: 4 values x 4 values x 4 values = 64 encodings. So the encoding here is similar to Audrey’s, but instead of encoding “white-black-black-white-white-black”, the letter “P” now encodes “light gray – dark gray – light gray”.

The practical upshot of all this is that I could encode a 2-bit grayscale image of Teddy Roosevelt at 15 x 26 pixels and still fit it in a tweet. Here’s what the Rough Rider looks thus rendered:

Which is actually pretty recognizable, if not as Theodore Roosevelt, then at least a middle-aged white guy in a suit. That’s pretty good for only 140 bytes. Here he is embiggened:

Here are his compressed pixel values still in a grid:

$!xgk
lkggh
xggkg
jhwgh
fVfcg
ala6l
W9K0Q
a4G07
GL417
GL10N
WLbKN
XgbvM
bPbL7
qbWGM
eMKHQ
vRfKM
fbb5M
wsgLN
khbLN
wka5N
kRfPA
fI!aB
c2gGg
MHP1h
V1a6g
hQgQh

and, finally, his resulting tweet, with an information blurb included:

$!xgklkgghxggkgjhwghfVfcgala6lW9K0Qa4G07GL417GL10NWLbKNXgbvMbPbL7qbWGMeMKH
QvRfKMfbb5MwsgLNkhbLNwka5NkRfPAfI!aBc2gGgMHP1hV1a6ghQgQh 2bG 15x26