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}}
]
Это снимок экрана, который я получаю:
![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
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 файлов.
![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, которую вы, ребята, используете, если найдете ответ.
Ответы
Ответ 1
Прежде всего: не используйте 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}}]
просматривает различные размеры времени выполнения в окне ноутбука:
![введите описание изображения здесь]()
Можно видеть очевидную зависимость выхода от размера окна ноутбука.
Обходным путем является передача PageWidth
непосредственно на Cell
:
Rasterize[
Cell[[email protected]@Style[x^2 + y^2, 40], PageWidth -> Infinity],
ImageResolution -> 600]
![enter image description here]()
P.S. К тому же. Единственный случай, который я знаю, когда ImageResolution
работает так, как ожидалось, - это экспорт в формате PDF с помощью "AllowRasterization"->True
:
[email protected][
ExportString[Plot3D[Sin[x + y^2], {x, -3, 3}, {y, -2, 2}], "PDF",
"AllowRasterization" -> True, ImageResolution -> 200], "PDF"]
Но это не позволяет указать прозрачный фон.
Ответ 2
Чтобы отслеживать степень ошибки, вот изображения, которые я получаю от 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]()
Результат, который я получаю для первого метода со сферами, по-видимому, соответствует выходу, полученному во втором методе. То есть прозрачный фон, но разных размеров. Я загружу эти выходы, если потребуется.