EPS数据的不透明度

时间:2011-03-24 06:18:08

标签: wolfram-mathematica opacity eps

在Mathematica中保存图形时,是否可以以EPS格式保存不透明的图形?例如,

Plot[Evaluate[Table[BesselJ[n, x], {n, 4}]], {x, 0, 10}, 
 Filling -> Axis]

给出了下图,它以EPS以外的任何格式整齐地保存。

Transparency in Mma

如果我尝试保存到EPS(在Mathematica 7中),结果看起来像

EPS from Mma7

在Mathematica 8中,它看起来像

EPS from Mma8

有没有人知道如何在EPS图中获得不透明度(或者如果可能的话)? “使用栅格化透明度”选项看起来并不像缩放时的真实EPS那样令人印象深刻。

3 个答案:

答案 0 :(得分:3)

我通常在这种情况下栅格化我的图形。尝试

Rasterize[Plot[Evaluate[Table[BesselJ[n, x], {n, 4}]],
  {x, 0, 10}, Filling -> Axis], RasterSize -> 600, ImageSize -> 400]

当然,结果将无法扩展,并且可能占用更多内存。您可以通过将RasterSize设置为大于ImageSize来部分解决可伸缩性问题,就像我在这里所做的那样。

答案 1 :(得分:3)

好的,因此EPS不能支持真正的透明度/不透明度 - 但这并不意味着Mathematica 7可以免于做这么糟糕的工作。正如我的Mathematica 8所证明的那样,它可以让它看起来更好。

Mathematica 7输出的问题在于,当你真的想要更浅的颜色时,它使用与曲线相同的颜色。 EPS是一种纯文本格式,因此编写快速入侵非常容易。这是PS图形上的quick tute

在PS图形中,你定义一个路径,然后你说你想要它描边(线)还是填充(区域) - 或者我们不需要担心的其他事情。颜色被设置并保持在那里直到它们被重置。所以我只需导入Mma7生成的EPS并找到所有填充的路径。对于每个填充的路径,您可以找到上一个颜色,并将填充命令上方的颜色重置为更轻的颜色。

所以这是一个例子(我没有费心将它打包成一个脚本/模块)。 所有输出均来自Mathematica 7.0.1

p = Plot[Evaluate[Table[BesselJ[n, x], {n, 4}]], {x, 0, 10}, Filling -> Axis]

original image

使用Export["BesselJs7.eps", p]导出到EPS文件。这会产生一种可怕的图形 original EPS

好的,现在是“修复”

pList = Import["BesselJs7.eps", "List"];  (* Import image as a list of strings *)
FList = Flatten@Position[pList, "F"];     (* find all fill commands            *)

请注意,EPS文件的行/F { fill} bind def定义了快捷方式F。 此外,您可以检查pList[[FList - 1]]是否会生成"closepath"的列表。

FColorList = {}; (* get list of colors associated with fills *)
Catch[Do[
  i = 0; rgb = True; newpath = True;
  While[rgb || newpath,
   (*Print[{f,i,f-i,rgb,newpath,pList[[f-i]]}];*)
   If[rgb && StringMatchQ[pList[[f - i]], __ ~~ "r"], rgb = False; 
    AppendTo[FColorList, pList[[f - i]]]];
   If[newpath && StringMatchQ[pList[[f - i]], "newpath" ~~ __], 
    newpath = False; np[f] = f - i];
   If[f - i == 1, Throw[{f, rgb, newpath}]];
   i++],
  {f, FList}]]

现在是创建新颜色的黑客 - 我所做的就是为每个rgb值添加.5。这绝对可以做得更好:

FColorListNew = Table[Most@ToExpression@StringSplit[f] + .5, 
                {f, FColorList}] /. _?(# > 1 &) -> 1.;
FColorListNew = Table[StringJoin[{Riffle[ToString /@ f, " "], " r"}],
                {f, FColorListNew}];

最后,插入新颜色并将其写回:

Do[pList = Insert[pList, FColorListNew[[i]], np[FList[[i]]] + i], 
   {i, Length[FList]}]
Export["BesselJsFixed.eps", pList, "List"]

fixed EPS

有些事情,比如找到newpath位置,是不必要的,整个事情可能会被整理掉。但我现在已经花了足够的时间来做它!

答案 2 :(得分:1)

根据Mark的回答,要导出具有透明度的PNG,请使用:

Export[
  "testfile.png",
  Plot[Evaluate[Table[BesselJ[n, x], {n, 4}]], {x, 0, 10}, Filling -> Axis],
  ImageSize -> 600,
  Background -> None
]