I was amazed when I found that Mathematica gives True
for the following code (on 32 bit Windows XP with Mathematica 8.0.1):
Rasterize[Graphics[{RGBColor[0, 0, 0], Disk[]}]] ===
Rasterize[Graphics[{RGBColor[0, 0, 1/257], Disk[]}]]
What is the minimal difference in RGB color values which Mathematica renders and exports as different colors? Is it machine-dependent?
I believe this behaviour is machine dependent, but I do not know how exactly it depends on the OS. On my machine, it evaluates to True
only when the denominator is 511
.
n = 257;
While[(Rasterize[Graphics[{RGBColor[0, 0, 0], Disk[]}]] ===
Rasterize[Graphics[{RGBColor[0, 0, 1/n], Disk[]}]]) != True,
n++];
Print@n
Out[1]=511
There is a difference between the two images for n<511
p1 = ImageData@Rasterize[Graphics[{RGBColor[0, 0, 0], Disk[]}]];
p2 = ImageData@Rasterize[Graphics[{RGBColor[0, 0, 1/257], Disk[]}]];
ArrayPlot[p1 - p2]
This difference is constant all the way through n=510
and is equal to 1/255
.
Max[p2 - p1] === N[1/255]
Out[1]=True
Looks like Rasterize
rounds each pixel's R G B channels to the closest 8bit value (to the closest 1/256
).
image = Image[{{{0, 0, .2/256}, {0, 0, .7/256}, {0, 0, 1.2/256}, {0,
0, 1.7/256}}}, ImageSize -> 4]
ImageData@image
Rasterize@image
ImageData@Rasterize@image
So the minimal difference, rasterizing into different colors should be around 0.000000000000000000000000000...
Guilty party here is Rasterize, which chops off color precision. Get help on ImageType[]
to see that Mathematica actually recognizes other bit depths, but Rasterize[] vandalizes anything beyond Byte.