首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mathematica:带有PNG的透明背景

Mathematica:带有PNG的透明背景
EN

Stack Overflow用户
提问于 2011-06-13 11:01:05
回答 2查看 6.1K关注 0票数 13

这很可能是Mathematica 8.0.1和其他版本中的一个bug。让我们尝试以下操作:

代码语言:javascript
运行
复制
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或更高的分辨率感到满意。现在看看这个:

代码语言:javascript
运行
复制
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的差劲尝试。

代码语言:javascript
运行
复制
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

让我们使用这个想法。

代码语言:javascript
运行
复制
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版本。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-14 21:14:27

首先:导出时不要使用ImageResolution!这种有缺陷的选项在大多数情况下都是无用的,并且不会做人们所能期望的事情。它的工作原理类似于ImageSize

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

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

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

代码语言:javascript
运行
复制
In[1]:= Options[Cell, PageWidth]
Out[1]= {PageWidth -> WindowWidth}

让我们来看看如何输出

代码语言:javascript
运行
复制
Table[Rasterize[Style[x^2 + y^2, 40], Background -> None, 
  ImageResolution -> r], {r, {300, 400, 500, 600}}]

查看notebook窗口的不同运行时大小:

可以看到输出对notebook窗口大小的明显依赖性。

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

代码语言:javascript
运行
复制
Rasterize[
 Cell[BoxData@ToBoxes@Style[x^2 + y^2, 40], PageWidth -> Infinity], 
 ImageResolution -> 600]

附注:另外。我所知道的唯一一种ImageResolution正常工作的情况是用"AllowRasterization"->True导出

代码语言:javascript
运行
复制
First@ImportString[
  ExportString[Plot3D[Sin[x + y^2], {x, -3, 3}, {y, -2, 2}], "PDF", 
   "AllowRasterization" -> True, ImageResolution -> 200], "PDF"]

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

票数 4
EN

Stack Overflow用户

发布于 2011-06-13 13:11:21

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

代码语言:javascript
运行
复制
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:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6326272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档