Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mathematica: Transparent background with PNG

This is most likely a bug in Mathematica 8.0.1 and maybe other versions too. Lets try the following:

Table[
 Export[
  "Res_" <> ToString[r] <> ".png", Rasterize[
  Style[x^2 + y^2, 40],
  Background -> None,
  ImageResolution -> r
 ],
 Background -> None],
 {r, {20, 40, 100, 300, 400, 500, 600}}
]

This is a screen shot of what I obtain:

Output

First thing to notice is that the last two pictures are the wrong size. This is fine to some extent since I'm satisfied with a resolution of 300 or above. Now look at this:

in = 72;
G3D = Graphics3D[AspectRatio -> 0.925, Axes -> {True, True, True}, 
  AxesEdge -> {{-1, -1}, {1, -1}, {-1, -1}}, AxesStyle -> Directive[10, Black],
  BaseStyle -> {FontFamily -> "Arial", FontSize -> 12}, Boxed -> False,
  BoxRatios -> {1, 1, 1}, LabelStyle -> Directive[Black], 
  ImagePadding -> All, ImageSize -> 5 in, PlotRange -> All,
  PlotRangePadding -> None, TicksStyle -> Directive[10], 
  ViewPoint -> {2, -2, 2}, ViewVertical -> {0, 0, 1}, Background -> None
];
surf = Show[
  Graphics3D[Sphere[{0, 0, 0}, 1], Background -> None, 
  AxesLabel -> {"x", "y", "z"}], Options[G3D]
];
fig = Show[surf, AxesStyle -> Directive[Opacity[0]], 
  Background -> None
];

I wish to Export fig as a png file with transparent background with a high resolution. Here goes my lame attempt with the always buggy Mathematica.

Table[
  Export[
    "Res_" <> ToString[r] <> ".png",
    Rasterize[fig, ImageResolution -> r, Background -> None],
    Background -> None
  ], {r, {20, 40, 100, 300, 400, 500}}
]

Here is a screenshow of a few png files.

Images

All of them came out with the expected resolution :). But what happened to my transparent background? I have specified many times through my code Background -> None and yet this doesn't want to work. I looked around the web and I found this:

http://forums.wolfram.com/mathgroup/archive/2009/Feb/msg00943.html

Lets use this idea.

bgImage = Image[ConstantArray[{0, 0, 0, 0}, Reverse[ImageDimensions[fig]]], 
  ColorSpace -> "RGB"];
compImage = ImageCompose[bgImage, fig];
Table[Export["Res_" <> ToString[r] <> ".png", 
  Rasterize[compImage, ImageResolution -> r, Background -> None], 
  Background -> None], {r, {20, 40, 100, 300, 400, 500}}]

Images

No backgrounds!!! :) Great. But what happened to the sizes of my images? The resolution is increasing but the image size started to decrease. I have really been messing around with this problem for too long now. I hope one of you can shed some light into this Mathematica bug and can find a hack in order to achieve a transparent background PNG with high resolution. Please mention the Mathematica version you guys are using if you find an answer.

like image 257
jmlopez Avatar asked Jun 13 '11 03:06

jmlopez


1 Answers

First of all: do not use ImageResolution when exporting! This buggy options is useless most of the time and does not do what one can expect. It works as an analog of ImageSize.

Instead, use Magnify command and Magnification option of Style. They do what we want to get from ImageResolution!

Now about the reason for the behavior showed in the first part of the question. Yes, it happens. And yes, it is machine-dependent. Is it a bug? Yes, at least a great imperfection. It it completely unexpected? As for me - not.

It seems that the source of the problem is that rendering of graphics is in really made by the FrontEnd and the latter uses default settings for Cell when converting graphics to raster.

In[1]:= Options[Cell, PageWidth]
Out[1]= {PageWidth -> WindowWidth}

Lets try to see how output of

Table[Rasterize[Style[x^2 + y^2, 40], Background -> None, 
  ImageResolution -> r], {r, {300, 400, 500, 600}}]

looks at different run-time sizes of the notebook window:

enter image description here

One can see the obvious dependence of the output on the notebook window size.

A workaround is to pass PageWidth directly to Cell:

Rasterize[
 Cell[BoxData@ToBoxes@Style[x^2 + y^2, 40], PageWidth -> Infinity], 
 ImageResolution -> 600]

enter image description here


P.S. In addition. The only case I know when ImageResolution works as expected is PDF export with "AllowRasterization"->True:

First@ImportString[
  ExportString[Plot3D[Sin[x + y^2], {x, -3, 3}, {y, -2, 2}], "PDF", 
   "AllowRasterization" -> True, ImageResolution -> 200], "PDF"]

But it does not allow to specify transparent background.

like image 182
Alexey Popkov Avatar answered Oct 11 '22 22:10

Alexey Popkov