ОбрабатываемаяКартинка.УстановитьПлотность

Методы · SetDensity

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

Синтаксис

УстановитьПлотность(<ПоГоризонтали>, <ПоВертикали>)
Полное описание, параметры и ограничения

ОбрабатываемаяКартинка.УстановитьПлотность (ProcessingPicture.SetDensity)

ОбрабатываемаяКартинка (ProcessingPicture)

УстановитьПлотность (SetDensity)

Доступен, начиная с версии 8.3.14.

Синтаксис:
УстановитьПлотность(<ПоГоризонтали>, <ПоВертикали>)
Параметры:

<ПоГоризонтали> (обязательный)
Тип: Число.
Количество пикселей на дюйм изображения по горизонтали.

<ПоВертикали> (необязательный)
Тип: Число.
Количество пикселей на дюйм изображения по вертикали.
Описание:

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

Доступность:

Сервер, толстый клиент, внешнее соединение.

Использование в версии:

Доступен, начиная с версии 8.3.14.

Методическая информация

Практические примеры

Задать плотность PNG и отличить DPI от пиксельного размера

УстановитьПлотность меняет метаданные физического размера. Пиксельные 80×40 остаются прежними; допускается округление плотности при записи PNG.

Где и как запускать

Полный серверный общий модуль своей учебной конфигурации. Картинки только в памяти.

Подготовка

  1. В отдельной своей конфигурации УчебнаяКонфигурацияСинтаксиса создайте серверный общий модуль УчебныеКартинки с флагом Сервер. Вставьте весь код одного урока и вызовите УчебныеКартинки.ВыполнитьПример() из серверной команды своей обработки.

  2. Встроенный собственный PNG имеет 80×40 пикселей: белое поле, синий прямоугольник 40×20 с красной рамкой, начинающийся в точке 20,10. Фотографии, подписи, печати и документы пользователей не используются.

  3. Картинки создаются из Base64 в памяти. Методы изменения меняют ОбрабатываемаяКартинка, а не исходный Картинка. ПолучитьКартинку создаёт отдельный результат; результаты не записываются на диск или в базу.

  4. Основные уроки выполняйте на настольном сервере 1С 8.5.1.1343, не на мобильной платформе. Там другие ограничения форматов, метаданных цвета и плотности.

  5. Последний урок — отдельный клиентский обработчик команды своей управляемой формы: он нужен для ФильтрИменФайлов и чтения устаревшего API, не для серверной обработки.

Процедура ВыполнитьПример() Экспорт
    Исходная = Новый Картинка(Base64Значение("iVBORw0KGgoAAAANSUhEUgAAAFAAAAAoCAIAAADmAupWAAAAX0lEQVR4nO3YURGAMAxEwYhAROUgu66KCIZmuO6bE5D9Ta3DqnVYwOkBpwecHnB6r8BzjJZ1gq97bh4wMDAwMDAwMDAwMDAwMDDw1+CzXjx/DDg94PSA0wNOr7oP2N0DKcWmInx+weoAAAAASUVORK5CYII="));
    Если Исходная.Ширина() <> 80 ИЛИ Исходная.Высота() <> 40 Тогда
        ВызватьИсключение "Собственный PNG должен быть 80 на 40 пикселей";
    КонецЕсли;
    ИсходнаяГоризонталь = Исходная.ПлотностьПоГоризонтали();
    ИсходнаяВертикаль = Исходная.ПлотностьПоВертикали();
    Обработка = Новый ОбрабатываемаяКартинка(Исходная);
    Обработка.УстановитьФормат(ФорматКартинки.PNG);
    Обработка.УстановитьПлотность(300);
    Первая = Обработка.ПолучитьКартинку();
    Сообщить(Первая.ПлотностьПоГоризонтали() <> Неопределено);
    Сообщить(ПлотностьБлизка(Первая.ПлотностьПоГоризонтали(), 300));
    Сообщить(ПлотностьБлизка(Первая.ПлотностьПоВертикали(), 300));
    Обработка.УстановитьПлотность(150, 300);
    Вторая = Обработка.ПолучитьКартинку();
    Сообщить(ПлотностьБлизка(Вторая.ПлотностьПоГоризонтали(), 150));
    Сообщить(ПлотностьБлизка(Вторая.ПлотностьПоВертикали(), 300));
    Сообщить(Вторая.Ширина() = 80 И Вторая.Высота() = 40);
    Сообщить(Исходная.ПлотностьПоГоризонтали() = ИсходнаяГоризонталь);
    Сообщить(Исходная.ПлотностьПоВертикали() = ИсходнаяВертикаль);
КонецПроцедуры

Функция ПлотностьБлизка(Фактическая, Ожидаемая)
    Если Фактическая = Неопределено Тогда
        Возврат Ложь;
    КонецЕсли;
    Возврат Фактическая > Ожидаемая - 1 И Фактическая < Ожидаемая + 1;
КонецФункции

Разбор по шагам

  1. Запомнить фактическую исходную плотность, не присваивать стандартное значение из предположения.

  2. При одном параметре 300 вертикальная плотность берётся равной горизонтальной.

  3. При двух параметрах задать 150 по горизонтали и 300 по вертикали; размеры в пикселях не менять.

  4. Сравнивать плотность с допуском меньше 1 DPI из-за целочисленного представления единиц PNG.

  5. Проверить, что исходная картинка сохранила свою первоначальную метаинформацию.

Как проверить результат

  1. В настольном опыте восемь сообщений Истина. У второй копии 80×40, плотности примерно 150 и 300 DPI.

  2. Горизонтальная и вертикальная плотности исходника равны значениям, сохранённым до обработки.

Ожидаемый результат

Изменена физическая интерпретация рисунка без увеличения разрешения в пикселях.

На что обратить внимание

  1. Не во всех форматах плотность хранится: успешный вызов не всегда означает изменение метаинформации.

  2. Не выполняйте арифметику с Неопределено для картинки коллекции или мобильной платформы. Здесь используется свой самостоятельный настольный PNG.

  3. Это не настройка принтера и не масштаб элемента формы.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.