Mathematica:透明背景与PNG

这很可能是Mathematica 8.0.1中的一个错误,也可能是其他版本。 让我们试试以下内容:

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}}
]

这是我获得的屏幕截图:

产量

首先要注意的是最后两张图片的尺寸是错误的。 由于我对300或以上的分辨率感到满意,这在某种程度上是好的。 现在看看这个:

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
];

我希望Export无花果作为一个高分辨率透明背景PNG文件。 在这里,我总是碰到越野车Mathematica的蹩脚尝试。

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

这是几个png文件的屏幕显示。

图片

所有人都拿出了预期的分辨率:)。 但是我的透明背景发生了什么? 我已经通过我的代码Background -> None指定了很多次,但是这并不想工作。 我环顾网络,发现了这一点:

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

让我们使用这个想法。

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}}]

图片

没有背景! :)太好了。 但是,我的图像的大小发生了什么? 分辨率正在增加,但图像尺寸开始减小。 我真的一直在解决这个问题太久了。 我希望你们中的一位能够阐明这个Mathematica的bug,并且能够找到一个黑客来获得高分辨率的透明背景PNG。 如果您找到答案,请提及您使用的Mathematica版本。


首先:输出时不要使用ImageResolution ! 这种多功能选项在大多数时间是无用的,并没有做到人们所期待的。 它用作ImageSize的模拟。

而是使用Style Magnify命令和Magnification选项。 他们做我们想从ImageResolution获得的东西!

现在问题的第一部分显示了行为的原因。 是的,它发生了。 是的,它是依赖于机器的。 这是一个错误吗? 是的,至少有一个很大的缺陷。 它完全出乎意料? 至于我 - 不是。

看起来问题的根源在于,图形的渲染实际上是由FrontEnd完成的,而后者在将图形转换为栅格时使用Cell默认设置。

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

让我们试着看看如何输出

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

查看笔记本窗口的不同运行时间大小:

在这里输入图像描述

人们可以看到输出对笔记本窗口大小的明显依赖性。

解决方法是将PageWidth直接传递给Cell

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


PS另外。 我知道当ImageResolution按预期工作时唯一的情况是PDF导出为"AllowRasterization"->True

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

但它不允许指定透明背景。


为了追踪错误的程度,下面是我在Windows XP上从Mathematica 7.0.1获得的图像

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}}]

20:

40:

100:

300:

400:

500:

600:


我用第一种方法得到的输出看起来与第二种方法得到的输出相匹配。 即透明背景,但大小不同。 如果需要,我会上传这些输出。

链接地址: http://www.djcxy.com/p/35627.html

上一篇: Mathematica: Transparent background with PNG

下一篇: Function minimization with equality constraints in Mathematica 8