I am having this very strange issue. I am creating animated gifs from UIImages and most of the time they come out correct. However when I start to get into larger size images my
Following on, here's some more background on the quantisation fail that is occurring. If you run the GIF output through imagemagick
to extract the colour palettes for the version with a global colour map vs. a per-frame colour map, there is some insight into the root of the problem:
The version with GLOBAL colour map:
$ convert test.gif -format %c -depth 8 histogram:info:-
28392: ( 0, 0, 0,255) #000000FF black
240656: ( 71,162, 58,255) #47A23AFF srgba(71,162,58,1)
422500: (147,221,253,255) #93DDFDFF srgba(147,221,253,1)
676: (255,255,255,255) #FFFFFFFF white
2704: ( 71,162, 58,255) #47A23AFF srgba(71,162,58,1)
676: (147,221,253,255) #93DDFDFF srgba(147,221,253,1)
2704: ( 71,162, 58,255) #47A23AFF srgba(71,162,58,1)
676: (147,221,253,255) #93DDFDFF srgba(147,221,253,1)
2704: ( 71,162, 58,255) #47A23AFF srgba(71,162,58,1)
676: (147,221,253,255) #93DDFDFF srgba(147,221,253,1)
The version with per-frame colour maps:
$ convert test.gif -format %c -depth 8 histogram:info:-
28392: ( 0, 0, 0,255) #000000FF black
237952: ( 71,163, 59,255) #47A33BFF srgba(71,163,59,1)
2704: (113, 78, 0,255) #714E00FF srgba(113,78,0,1)
421824: (147,221,253,255) #93DDFDFF srgba(147,221,253,1)
676: (246, 81,249,255) #F651F9FF srgba(246,81,249,1)
676: (255,255,255,255) #FFFFFFFF white
28392: ( 0, 0, 0,255) #000000FF black
237952: ( 71,163, 59,255) #47A33BFF srgba(71,163,59,1)
2704: (113, 78, 0,255) #714E00FF srgba(113,78,0,1)
421824: (147,221,253,255) #93DDFDFF srgba(147,221,253,1)
676: (246, 81,249,255) #F651F9FF srgba(246,81,249,1)
676: (255,255,255,255) #FFFFFFFF white
28392: ( 0, 0, 0,255) #000000FF black
237952: ( 71,163, 59,255) #47A33BFF srgba(71,163,59,1)
2704: (113, 78, 0,255) #714E00FF srgba(113,78,0,1)
421824: (147,221,253,255) #93DDFDFF srgba(147,221,253,1)
676: (246, 81,249,255) #F651F9FF srgba(246,81,249,1)
676: (255,255,255,255) #FFFFFFFF white
28392: ( 0, 0, 0,255) #000000FF black
237952: ( 71,163, 59,255) #47A33BFF srgba(71,163,59,1)
2704: (113, 78, 0,255) #714E00FF srgba(113,78,0,1)
421824: (147,221,253,255) #93DDFDFF srgba(147,221,253,1)
676: (246, 81,249,255) #F651F9FF srgba(246,81,249,1)
676: (255,255,255,255) #FFFFFFFF white
So the first one is missing the brown and pink, the colours with 246
and 113
in the red channel are not listed at all, and these are listed correctly in the histogram (presumably repeated for every frame in the longer output) for the per-frame colour map version.
This is proof that the palette is generated incorrectly in the GIF, which is what we see easily with our eyes. However, what makes me wonder is that the global colour map version has duplicate entries for several colours. This points at a pretty clear bug in palette quantisation in ImageIO. There should be no duplicate entries in a limited colour palette.
In short: do not rely on Core Graphics to quantise your 24-bit RGB images. Pre-quantise them in advance before sending them to ImageIO and turn off global colour maps. If the problem still manifests then, ImageIO palette writing is broken and you should use a different GIF output library