1

I would like to get the index values of an indexed image, so that I can modify images in a game where the palette and the index data are separate files. I looked through the command-line options of identify, the -grayscale options, the FX expressions and tried the txt:- output format, but they all don't seem to do the trick.

So if I have an image with a red, a blue, and another red pixel, saved as a GIF with a palette of 0: red and 1: blue, then I'd like to get an output similar to "0 1 0" or "\x00\x01\x00".

Johannes Riecken
  • 2,301
  • 16
  • 17

2 Answers2

2

If you make a 3-pixel French flag similarly to @xenoid like this:

magick xc:red xc:white xc:blue +append french.gif

You can dump the colormap and pixels using MAP format like this:

magick french.gif map: | xxd
00000000: ff00 0000 00ff ffff ff00 0000 0002 01    ...............

Hopefully you can see the first three bytes are red 0xff 00 00, the next three are blue 0x00 00 ff and the next three are white 0xff ff ff and the last three are indices 0, 2, 1.


If you go Irish, with lime, white and orange:

magick xc:lime xc:white xc:orange +append irish.gif 
magick irish.gif map: | xxd
00000000: 00ff 00ff a500 ffff ff00 0000 0002 01    ...............

It may come in handy to know how many colours there are:

identify -format %k irish.gif
3

It may come in handy to use JSON to extract the number of entries in the colormap and their values:

magick irish.gif json: | jq -r '.[].image | .colormapEntries'                  
4

magick irish.gif json: | jq -r '.[].image | .colormap'       
[
  "#00FF00FF",
  "#FFA500FF",
  "#FFFFFFFF",
  "#000000FF"
]

Or you can use PIL/Pillow from Python:

python3 -c 'from PIL import Image; print(list(Image.open("irish.gif").getdata()))'

Sample Output

[0, 2, 1]

PIL/Pillow can also output the palette - though you need to be aware that it pads the palette out to 256 entries using shades of grey:

python3 -c 'from PIL import Image; print(list(Image.open("irish.gif").getpalette()))'
[0, 255, 0, 255, 165, 0, 255, 255, 255, 0, 0, 0, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 48, 49, 49, 49, 50, 50, 50, 51, 51, 51, 52, 52, 52, 53, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, 56, 57, 57, 57, 58, 58, 58, 59, 59, 59, 60, 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 65, 65, 65, 66, 66, 66, 67, 67, 67, 68, 68, 68, 69, 69, 69, 70, 70, 70, 71, 71, 71, 72, 72, 72, 73, 73, 73, 74, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77, 77, 78, 78, 78, 79, 79, 79, 80, 80, 80, 81, 81, 81, 82, 82, 82, 83, 83, 83, 84, 84, 84, 85, 85, 85, 86, 86, 86, 87, 87, 87, 88, 88, 88, 89, 89, 89, 90, 90, 90, 91, 91, 91, 92, 92, 92, 93, 93, 93, 94, 94, 94, 95, 95, 95, 96, 96, 96, 97, 97, 97, 98, 98, 98, 99, 99, 99, 100, 100, 100, 101, 101, 101, 102, 102, 102, 103, 103, 103, 104, 104, 104, 105, 105, 105, 106, 106, 106, 107, 107, 107, 108, 108, 108, 109, 109, 109, 110, 110, 110, 111, 111, 111, 112, 112, 112, 113, 113, 113, 114, 114, 114, 115, 115, 115, 116, 116, 116, 117, 117, 117, 118, 118, 118, 119, 119, 119, 120, 120, 120, 121, 121, 121, 122, 122, 122, 123, 123, 123, 124, 124, 124, 125, 125, 125, 126, 126, 126, 127, 127, 127, 128, 128, 128, 129, 129, 129, 130, 130, 130, 131, 131, 131, 132, 132, 132, 133, 133, 133, 134, 134, 134, 135, 135, 135, 136, 136, 136, 137, 137, 137, 138, 138, 138, 139, 139, 139, 140, 140, 140, 141, 141, 141, 142, 142, 142, 143, 143, 143, 144, 144, 144, 145, 145, 145, 146, 146, 146, 147, 147, 147, 148, 148, 148, 149, 149, 149, 150, 150, 150, 151, 151, 151, 152, 152, 152, 153, 153, 153, 154, 154, 154, 155, 155, 155, 156, 156, 156, 157, 157, 157, 158, 158, 158, 159, 159, 159, 160, 160, 160, 161, 161, 161, 162, 162, 162, 163, 163, 163, 164, 164, 164, 165, 165, 165, 166, 166, 166, 167, 167, 167, 168, 168, 168, 169, 169, 169, 170, 170, 170, 171, 171, 171, 172, 172, 172, 173, 173, 173, 174, 174, 174, 175, 175, 175, 176, 176, 176, 177, 177, 177, 178, 178, 178, 179, 179, 179, 180, 180, 180, 181, 181, 181, 182, 182, 182, 183, 183, 183, 184, 184, 184, 185, 185, 185, 186, 186, 186, 187, 187, 187, 188, 188, 188, 189, 189, 189, 190, 190, 190, 191, 191, 191, 192, 192, 192, 193, 193, 193, 194, 194, 194, 195, 195, 195, 196, 196, 196, 197, 197, 197, 198, 198, 198, 199, 199, 199, 200, 200, 200, 201, 201, 201, 202, 202, 202, 203, 203, 203, 204, 204, 204, 205, 205, 205, 206, 206, 206, 207, 207, 207, 208, 208, 208, 209, 209, 209, 210, 210, 210, 211, 211, 211, 212, 212, 212, 213, 213, 213, 214, 214, 214, 215, 215, 215, 216, 216, 216, 217, 217, 217, 218, 218, 218, 219, 219, 219, 220, 220, 220, 221, 221, 221, 222, 222, 222, 223, 223, 223, 224, 224, 224, 225, 225, 225, 226, 226, 226, 227, 227, 227, 228, 228, 228, 229, 229, 229, 230, 230, 230, 231, 231, 231, 232, 232, 232, 233, 233, 233, 234, 234, 234, 235, 235, 235, 236, 236, 236, 237, 237, 237, 238, 238, 238, 239, 239, 239, 240, 240, 240, 241, 241, 241, 242, 242, 242, 243, 243, 243, 244, 244, 244, 245, 245, 245, 246, 246, 246, 247, 247, 247, 248, 248, 248, 249, 249, 249, 250, 250, 250, 251, 251, 251, 252, 252, 252, 253, 253, 253, 254, 254, 254, 255, 255, 255]
Mark Setchell
  • 191,897
  • 31
  • 273
  • 432
  • 1
    Thanks for also mentioning how to get the palette. Before I manually parsed it from `identify -verbose`, but this makes it much easier. Looks like the three zero bytes before the indices 0, 2, 1 is padding, at least these bytes disappear when I add a fourth green pixel at the end. – Johannes Riecken Jun 06 '22 at 16:59
  • @MarkSetchell. What is MAP? Is that Imagemagick? I do not see it at https://imagemagick.org/Usage/files/. Where is the documentation for it? – fmw42 Jun 06 '22 at 20:04
  • @fmw42 It's under `identify -list format`. – Mark Setchell Jun 06 '22 at 20:09
1

If you use IM's convert to convert an image to XPM and get the pixel color indices:

For instance this 9x3 French flag:

enter image description here

Produces this:

/* XPM */
static char *FrenchFlag[] = {
/* columns rows colors chars-per-pixel */
"9 3 3 1 ",
"  c #0026FF",
". c #FF2900",
"X c white",
/* pixels */
"   XXX...",
"   XXX...",
"   XXX..."
};
xenoid
  • 8,396
  • 3
  • 23
  • 49
  • Thanks for this trick. I wasn't aware of this image format. I think I'll give it another 2 days before accepting this solution, as I think there must be a better way with less complex text post-processing involved. – Johannes Riecken Jun 06 '22 at 08:11