Mathematica: прозрачный фон с PNG - PullRequest
13 голосов
/ 13 июня 2011

Скорее всего, это ошибка в 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}}
]

Это скриншот того, что я получаю:

Output

Первое, что нужно отметить, это то, что последние два изображениянеправильный размер.В какой-то степени это нормально, так как я доволен разрешением 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.

Images

Все они вышлис ожидаемым разрешением :).Но что случилось с моим прозрачным фоном?Я указывал много раз через мой код 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}}]

Images

Нет фона!!!:) Отлично.Но что случилось с размерами моих изображений?Разрешение увеличивается, но размер изображения начинает уменьшаться.Я действительно слишком долго возился с этой проблемой.Я надеюсь, что один из вас сможет пролить некоторый свет на эту ошибку Mathematica и сможет найти взлом, чтобы получить прозрачный фон PNG с высоким разрешением.Пожалуйста, укажите версию Mathematica, которую вы, ребята, используете, если найдете ответ.

Ответы [ 2 ]

4 голосов
/ 14 июня 2011

Прежде всего: не используйте ImageResolution при экспорте!Эти глючные опции бесполезны большую часть времени и не делают того, на что можно рассчитывать.Он работает как аналог ImageSize.

Вместо этого используйте команду Magnify и параметр Magnification для Style.Они делают то, что мы хотим получить от 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}}]

выглядит при различных времени выполнения размеров окна ноутбука:

enter image description here

Видна очевидная зависимость вывода от размера окна ноутбука.

Обходной путь - передать PageWidth непосредственно в Cell:

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

enter image description here


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

Но он не позволяет указать прозрачный фон.

0 голосов
/ 13 июня 2011

Для отслеживания степени ошибки, вот изображения, которые я получаю из Mathematica 7.0.1 для Windows XP

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: enter image description here

40: enter image description here

100: enter image description here

300: enter image description here

400: enter image description here

500: enter image description here

600: enter image description here


Вывод, который я получаю для первого метода со сферами, кажется, совпадает с выводом, который вы получаете со вторым методом. То есть прозрачный фон, но разных размеров. Я буду загружать эти результаты, если требуется.

...