【问题标题】:Mathematica: Transparent background with PNGMathematica:带有PNG的透明背景
【发布时间】:2011-06-13 03:01:05
【问题描述】:

这很可能是 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 fig 为具有高分辨率透明背景的 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 -&gt; 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 错误有所了解,并能找到一个 hack,以实现具有高分辨率的透明背景 PNG。如果您找到答案,请提及你们正在使用的 Mathematica 版本。

【问题讨论】:

  • 只是一个简短的评论。我只使用了几次透明 bkg,但总是在 RGBA 通道表示中这样做。
  • 在版本 7 上,x^2 + y^2 图形正确渲染,第一组球体以透明度导出。因此,我添加了mathematica-8 标签。
  • @Mr.Wizard,您的意思是 7.0.0 版吗?我在 7.0.1 版本中尝试了x^2 + y^2,Res_400.png 与 Res_500.png 和 Res_600.png 显示相同。感谢您添加标签。
  • @belisarius,RGBA 通道表示是什么意思?我检查了ColorSpace,允许的值为“灰度”、“RGB”、“CMYK”和“HSB”。
  • 我得到的输出见下面我的答案。

标签: image wolfram-mathematica plot mathematica-8


【解决方案1】:

首先:导出时不要使用ImageResolution!这个错误的选项在大多数情况下是无用的,并且不会做任何人可以期待的事情。它类似于ImageSize

改为使用Magnify 命令和StyleMagnification 选项。他们做了我们想从ImageResolution得到的东西!

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

似乎问题的根源在于图形的渲染实际上是由前端完成的,而后者在将图形转换为光栅时使用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]


附:此外。我知道ImageResolution 按预期工作的唯一情况是使用"AllowRasterization"-&gt;True 导出PDF:

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

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

【讨论】:

    【解决方案2】:

    为了追踪错误的严重程度,这里是我从 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:


    我使用球体的第一种方法获得的输出似乎与您使用第二种方法获得的输出相匹配。也就是说,一个透明的背景,但不同的大小。如果需要,我会上传这些输出。

    【讨论】:

    • 那么我帖子中的第一种方法会导致您机器中的第二种方法的输出?这太疯狂了。谈谈可移植代码。
    • 好吧,我想我弄坏了我的数学。我尝试运行代码只是为了尝试使用ImageResolution。首先它运行良好,图像结果为 300,然后我改为 500,它 M8 崩溃了。我再次尝试使用 300 并且它崩溃了。重新启动我的macbook pro,再试一次,它崩溃了。这一定是我需要睡觉的信号。祝巫师先生好运。这是我试图运行的代码:stackoverflow.com/questions/6301676/…,哦,设置为=72。
    • 没关系。原因是因为在首选项中我将抗锯齿更改为最高质量。我把它改回最低,它工作。问题:您是否尝试过使用 pdf 文件获得透明背景?编辑:制作图形的光栅化版本并使背景透明。
    • @jmlopez 关于 PDF 中带有 alpha 的光栅,我还没有尝试过,我记得。你为什么不把它作为一个新问题发布?
    猜你喜欢
    • 2013-12-10
    • 2015-11-12
    • 2011-12-04
    • 1970-01-01
    • 2015-07-10
    • 2021-03-28
    • 2010-09-21
    • 2013-12-28
    • 1970-01-01
    相关资源
    最近更新 更多