Экспорт изображения в формате eps не отображается в Matlab

У меня есть довольно сложная фигура, которую я хочу экспортировать в формате EPS. Этот рисунок содержит изображение, созданное с помощью imagesc. Когда я сохраняю его как файл PNG, все выглядит нормально; однако при экспорте в формате EPS все, кроме изображения, экспортируется правильно.

Вот правильный вывод: (с использованием .png)

Правильный вывод в png

И .eps:

Неправильный вывод

Здесь — это файл .fig.

Я попробовал export_fig FEX с помощью команды export_fig test.eps, и он также дал мне тот же результат< /а>

Я использую Matlab 2015b на Ubuntu.


person Rafnuss    schedule 16.11.2015    source источник
comment
Я могу воспроизвести это на OS X, используя R2015b. У меня уже был такой баг. Вместо этого вам может потребоваться сохранить/экспортировать в формате PDF (возможно, также с помощью настройки экспорта... в меню «Файл» рисунка).   -  person horchler    schedule 16.11.2015
comment
использовать FEX export_fig   -  person Ander Biguri    schedule 16.11.2015
comment
@AnderBiguri, я пробовал... у меня не работает. Вы пробовали?   -  person Rafnuss    schedule 16.11.2015
comment
@horchler, да, это может быть вариант плана Б, но я бы хотел сделать это с .eps   -  person Rafnuss    schedule 16.11.2015
comment
Как вы пытались и потерпели неудачу? Я пробовал... у меня не работает, дает нулевую информацию.   -  person Ander Biguri    schedule 16.11.2015
comment
@AnderBiguri, извините, я имею в виду, это дает мне ту же цифру, которую я указал в сообщении выше (без графика изображений) ссылка на файл eps. Я также добавил эту информацию в пост.   -  person Rafnuss    schedule 16.11.2015


Ответы (1)


Я знаю, что это поздний ответ на этот вопрос, но я решил, что дам объяснение того, что происходит, на случай, если у кого-то возникнет эта проблема в будущем.

Основная проблема здесь заключается в том, что файлы EPS изначально не поддерживают прозрачность (поэтому export_fig не дал другого результата). MATLAB знает об этом, поэтому, когда вы пытаетесь напечатать фигуру с использованием прозрачности, он пытается сделать все возможное, чтобы воссоздать изображение, которое у вас есть на экране. К сожалению, тоже не получается.

Итак, давайте возьмем очень простой пример. Мы собираемся создать красный surf и сделать так, чтобы каждый элемент имел разное значение Alpha.

% Surface with random transparency between 0 (transparent) and 1 (opaque)
surf(zeros(10), 'FaceColor', 'r', 'AlphaData', rand(10), 'FaceAlpha', 'flat'); 

Теперь давайте сохраним версии PNG и EPS и проверим их.

введите здесь описание изображения введите здесь описание изображения

Не так уж плохо, верно? Похоже, прозрачность была сохранена между версиями PNG и EPS. В основном это так, за исключением случаев, когда мы определили поверхность как полностью прозрачную. В этих областях MATLAB фактически заменил сплошной красный цвет для этих областей. Проще говоря, в областях, которые полностью белые в PNG, они полностью красные в EPS.

Чтобы продемонстрировать это дальше, давайте создадим поверхность, где AlphaData будет либо 0 (полностью прозрачная), либо 0.1 (почти прозрачная).

surf(zeros(10), 'FaceColor', 'r', 'AlphaData', eye(10)/10, 'FaceAlpha', 'flat');

введите здесь описание изображения введите здесь описание изображения

Итак, теперь мы можем видеть, что если мы определяем что-то как полностью прозрачное, MATLAB даже не пытается сделать что-то прозрачным. Это делает совсем наоборот. С другой стороны, полупрозрачные области кажутся все еще полупрозрачными. Они вообще прозрачные?

Чтобы определить, действительно ли здесь присутствует прозрачность, давайте на секунду вернемся к первому примеру. Давайте попробуем изменить цвет axes на черный, чтобы увидеть, действительно ли он прозрачен.

set(gca, 'Color', 'k')

И результаты при сохранении в формате PNG и EPS

введите здесь описание изображения введите здесь описание изображения

Ну, это интересно... так что именно здесь происходит. Как я уже говорил ранее, MATLAB знает, что EPS не может содержать информацию о прозрачности. Он также знает, что ваша фигура содержит прозрачность, и хочет каким-то образом включить эту информацию. Это происходит следующим образом: ваш цвет смешивается с ожидаемым цветом фона (белым), чтобы создать видимость прозрачности. К сожалению, если у вас под прозрачным объектом есть что-то не белое, вы его не увидите, потому что, в конце концов, более прозрачные области просто более белые и на самом деле не более прозрачные.

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

Если, с другой стороны, у вас нет объекта графика с переменной прозрачностью, а есть объект с непрозрачными или прозрачными областями, существует обходной путь.

На самом деле вы можете установить FaceColor прозрачных граней на NaN. Это приведет к тому, что это конкретное лицо даже не будет отображаться, и MATLAB просто проигнорирует это лицо при печати в файл.

% Make everything but the diagonal be NaN (transparent)
cdata = ones(10);
cdata(~eye(10)) = NaN;

% Create a surface with no transparency and just CData with NaN values
surf(zeros(10), 'FaceColor', 'flat', 'CData', cdata);

% Change axes color to check transparency
set(gca, 'Color', 'k')

введите здесь описание изображения введите здесь описание изображения

Теперь и PNG, и EPS могут успешно отображать цветные axes внизу, что означает, что все, что находится за пределами диагонали, функционально прозрачно в как PNG, так и EPS. Это работает, если это просто axes внизу или есть и другие объекты сюжета.

Итак, теперь, возвращаясь к вопросу, который вы разместили. К сожалению, ссылки на ваши изображения больше недействительны, но если вы откроете созданный EPS-файл, вы, скорее всего, увидите, что изображение находится под желто-зеленой поверхностью, это просто поверхность использовал прозрачность, а MATLAB заставил прозрачные области не быть прозрачными и вместо этого смешал их с белым. Затем эта твердая поверхность закрывает изображение внизу, когда вы просматриваете полученный файл EPS, создавая впечатление, что оно исчезло. Если вы измените значение CData элементов прозрачной поверхности на NaN, вы сможете видеть изображение сквозь поверхность в этих местах.

person Suever    schedule 05.06.2016