20080930

Ошибка сохранения файла в GIMP при нехватке памяти

При редактировании больших изображений в GIMP иногда можно столкнуться с ситуацией, когда нужные правки уже сделаны, но файл сохранить не удаётся. Ошибка, которую выдаёт GIMP в этом случае связана с тем, что вся доступная память уже израсходована под хранение данных изображения, и запустить дочерний процесс, который сохранит файл, GIMP уже не может. К счастью, это совсем не означает, что результаты редактирования сохранить нельзя и они будут потеряны. Файл можно сохранить, очистив предварительно историю изменений.

Увидеть, сколько занимает изображение в памяти GIMP можно в строке состояния окна изображения. Например, в данном случае изображение занимает в памяти 164 МБ:


Если это значение сопоставимо с размером оперативной памяти компьютера, то GIMP не только будет работать медленно (из-за обращения к диску), но и может испытывать сложности с сохранением изменённого файла. При редактировании изображения это значение растёт.

Однако при большом количестве изменений значительная часть памяти приходится не на хранение самого изображения, а на хранение промежуточных результатов (необходимых, чтобы работала функция «отмены»). Если удалить историю действий, то можно обычно освободить немало памяти. Выбираем в меню редактируемого узображения «Правка → История действий» и видим такой диалог:


На иллюстрации помечена кнопка, позволяющая принудительно очистить историю изменений. После этого перестанет работать функция «Отмены», но зато освободится память.

Вообще, настроить желаемое количество уровней отмены можно в разделе «Окружение» настроек GIMP.

PS: Кто-нибудь знает, каким свободным софтом можно обрабатывать действительно большие изображения (т.е. такие, которые не помещаются в оперативную память)? Желательно, чтобы программа умела подгружать изображение «по частям». Меня интересуют прежде всего операции кадрирования, поворота на произвольный угол, коррекция кривых и цветов. Спасибо читателям за подсказку, что действительно большие изображения можно редактировать в nip2 (обзор здесь). Разбираюсь.

Смотрю с большой надеждой на формат JPEG2000, в котором есть поддержка произвольного доступа к областям изображения, но пока он, похоже, поддерживается только в ImageMagick. При этом ковертация JPEG→JPEG2000 требует много больше памяти, чем размер несжатого TIFF-а с тем же изображением. В придачу большинство просмотрщиков работать с JPEG2000 не могут.

20080918

Python внутри LaTeX (и математический пакет Sage тоже)

Недавно узнал такой приёмчик: внутри документа LaTeX можно исполнять скрипты на Python. Можно использовать, например, для автоматической генерации фрагментов текста (например, таблиц, илюстраций), считывания данных из внешних источников и т.д. Простор для фантазии большой.

Для этого нужно:
  • скачать файл python.sty (копия python.sty на gist.github.com). Положить его в каталог с документом.
  • В документе в преамбуле включить \usepackage{python}
  • Внутри документа фрагменты кода на Python помещать в окружение \begin{python}\end{python}. Всё, что эти фрагменты кода будут печатать, станет частью конечного документа.
  • Запускать LaTeX нужно с опцией -shell-escape (разрешая тем самым запуск внешнего кода из-под LaTeX)
Вот, пример исходника LaTeX и PDF, который из него получается.

Дополнение 2008-09-22: Вот более интересные примеры использования Python внутри LaTeX, файл LaTeX и полученный из него PDF. В этих примерах: символические вычисления с помощью sympy, сохранение переменных между вызовами Python, построение графиков с помощью matplotlib.

P.S. Заодно узнал, что есть такая штука, как Sage, пакет для математических расчётов, объединяющий в себе многие разработки с открытым исходным кодом. Очень похоже на Matematica, но в отличие от последней с нормальным, питоническим синтаксисом:) Так вот, Sage тоже можно вызывать прямо из LaTeX (и подставлять в него результаты, картинки и прочее). Это делается пакетом sagetex. Да, кстати, начать пользоваться Sage можно не устанавливая его, а воспользовавшись web-версией. Das ist fantastisch. Google Docs отдыхают.

Ссылки по теме:
Embedding Python in LaTeX
Примеры использования Python внутри LaTeX: симолические вычисления, построение графиков, сохранение результатов
Sage, достойная альтернатива Математике
Пример использования Scheme внутри LaTeX

Этот пост по-английски: Python inside LaTeX (and Sage too)

Визуализация профилей высоты и скорости GPS-треков

Помимо нанесения GPS-трека на карту, одним из наиболее интересных способов его представления является, на мой взгляд, построение графика изменения высоты или скорости движения как функции пройденного расстояния или прошедшего времени. Такие графики я называю «профилями» трека.

Нарисовать такие графики можно, например, воспользовавшись сайтом gpsvisualizer.com. Однако мне не очень нравится иметь их метку на картинке (раз) и не иметь свободного ПО, чтобы проделать это же самое на своём собственном компьютере (два).

Так что предлагаю свой скрипт gpxplot, который строит такие графики по данному GPX-файлу. Прямая ссылка на скрипт: gpxplot.py. Собственно, тут всего две важных особенности:

1) GPX-файл может содержать несколько несвязных треков, каждый из которых может состоять из нескольких «сегментов», поэтому хотелось сохранить возможность показывать их на графике именно как отдельные участки трека.

2) Информации о пройденном расстоянии в GPX-файле нет. Скрипт рассчитывает его в предположении сферической формы земли. Думаю, для большинства приложений этого достаточно.

Будучи запущен без параметров, скрипт просто печатает таблицу с данными по всеми точкам трека. Построить какой угодно график по такой таблице можно в любой программе.

Скрипт может также построить график самостоятельно (с помощью gnuplot). Для этого используется опция -g:
$ ./gpxplot.py -g -x time -y elevation track.gpx
Если модуль python-gnuplot установлен, то картинка появится на экране. Если такого модуля нет, то будет напечатан скрипт для gnuplot. В этом случае запустить gnuplot можно так:
$ ./gpxplot.py -g -x time -y elevation track.gpx | gnuplot -persist -
Как уже, наверное, понятно, -x time указывает откладывать по оси абсцисс время (-x distance — пройденный путь), а -y elevation — откладывать по оси ординат высоту (-y velocity — скорость).

Чтобы сохранить результат в файл, указываем опцию -o имяфайла:
$ ./gpxplot.py -g -x time -y elevation -o track.png track.gpx
Поддерживаются форматы: SVG, EPS, PNG, JPG.

Указать местную временную зону можно опцией -t имя_зоны:
$ ./gpxplot.py -g -t 'Europe/Moscow' track.gpx
В этом случае необходимо присутствие в системе модуля pytz.

Получается примерно так:

пример графика в формате SVG

Может быть, в будущем добавлю всякую раскраску и украшательство графиков. Вероятно, добавлю другие механизмы отрисовки графиков (matplotlib, например). Было бы интересно сделать отрисовку средствами Google Charts (тогда уже и до веб-версии недалеко).

Впрочем, главное назначение скрипта — просто вытянуть из GPX файла данные нужные для построения профилей. Предварительную обработку и фильтрацию треков предлагаю делать с помощью gpsbabel.

Дополнение 2008-10-17: Скрипт заметно обновился, появилась поддержка Google Charts, а также теперь доступна онлайн-версия.

Ссылки:
скрипт для визуализации профилей высоты GPS-треков
Visualizing altitude and velocity profiles of GPS tracks
GPXplot онлайн