Все началось с темы на форуме Т1С, где всплыла проблема: Йоксель выдает ошибку о нехватке памяти при загрузке некоторых документов из MXL, тогда как сам Моксель эти файлы открывает. Договорились с автором о высылке тестового файла. На вид файл оказался очень маленьким: меньше одной страницы А4. Но на диске занимал весьма заметное место: 42 Мб.
В общем-то, уже по этим показателям можно понять проблему. Для проверки в объект "Табличный Документ?" был добавлен метод «ИзвлечьКартинки», который позволяет записать все внедренные в документ картинки в каталог на диске. Анализ полученных файлов подтвердил гипотезу. В тестовом табличном документе был внедрен ряд картинок размером от мегабайта до 8–12 мегабайт. Гигантские размеры файлов объясняются просто. Во-первых, моксель может хранить растровые картинки только в формате BMP без сжатия. Во-вторых, внедренные картинки имели гигантские физические размеры. Самое меньшее – 500х700 пикселов. Наибольшие картинки имели физические размеры 1500х2000 пикселов и, примерно, 2000х2000 пикселов. При этом видимый размер этих картинок на листе составлял примерно 75х90 пикселов. На этом изучение проблемы было закончено.
Теперь можно подумать о решении проблемы. Просто предложить автору вручную уменьшить картинки и забыть о проблеме – неспортивно :) К тому же приходится регулярно сталкиваться с проблемой чрезмерно больших внедренных картинок и хотелось бы окончательно решить этот вопрос раз и навсегда. К тому же вручную уменьшить внедренные картинки не слишком хорошее решение. Сегодня, например, формат прайса у нас один, а завтра другой и, соответственно, размеры картинок тоже другие. И что теперь все изображения товаров вручную перемасштабировать? Нет, нужно другое решение.
Решение было выбрано следущее. В метод «Открыть» табличного документа добавлен новый параметр, включающий автоматическое масштабирование картинок. Автомасштабирование работает следующим образом:
Некоторые пояснения. Обычно разрешение экрана составляет 96 точек на дюйм. Однако, для эталонного разрешения было выбрано разрешение 120 точек на дюйм. Дело в том, что нельзя гарантировать, что документ всегда будет просматриваться на мониторах с разрешением 96 точек на дюйм. Если использовать разрешение 96 точек на дюйм, то при просмотре в разрешении 120 точек на дюйм изображение, скорее всего, будет иметь видимые на глаз искажения. К тому же разрешение 120 точек на дюйм становится все более и более «ходовым» из распространения LCD-мониторов высокого разрешения.
Для масштабирования картинка должна превышать видимые размеры больше чем на 5%. Такое соотношение было выбрано по следующим соображениям. Если выполнять масштабирование при меньших различиях в размерах, то на картинке, скорее всего, возникнут искажения, но сильно в объеме памяти мы не выиграем. Поэтому разница должна превышать 5%.
Итак, результаты. Исходный тестовый файл после открытия с масштабированием и записи под другим именем стал занимать на диске всего 300К без изменений во внешнем виде. Т.е. файл стал более, чем в 140 раз меньше. Теперь можно спокойно использовать в прайс-листе картинки любого размера и не беспокоясь как об объеме файла, так и о возможном изменении формата прайса.
Возможность, автомасштабирования также была добавлена в дикий Йоксель, т.е. в самостоятельное приложение. Настройкой можно управлять через меню «Сервис» – «Параметры». Однако, в самостоятельном приложении автомасштабирование включено по умолчанию.