Версия для печати темы (https://pro1c.org.ua/index.php?s=601a2dd5d037a087dc8feea23958ebac&showtopic=54684)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Тематическое общение _ Как программно установить значение DPI при сканировании через WIA ?

Автор: andrew76 17.10.19, 8:22

Добрый день !

Появилась необходимость сканирования фотографий из 1с 8.2 через сервис VIA.
Все работает в принципе,но хотелось бы устанавливать значение DPI программно.
Не могу разобраться с тех.документацией на WIA.
в принципе после вызова следующей строчки кода появляется диалоговое окно WIA.В этом окне и устанавливается значение DPI.
По умолчанию оно 150.А мне нужно 300.Можно ли задать его программно ?

DevManager = Новый COMОбъект("WIA.CommonDialog");

Автор: Vofka 17.10.19, 8:57

У вас где-то должен быть объект сканера. Если нету, то попробуйте вызвать метод ShowSelectDevice(1, false, false) на DevManager, который по идее вернет этот объект. После этого попробуйте:

Property prop = scannner.properties.get_Item("6147");
prop.set_Value(300);


Вот список ещё кое каких свойств, которые вам возможно пригодятся:


Автор: andrew76 17.10.19, 9:12

Цитата(Vofka @ 17.10.19, 11:57) *
ShowSelectDevice(1, false, false)


Это будет сканер по умолчанию ? Т.е, я хотел сказать сканер по умолчанию в операционной системе ? Значит объект CommonDialog
свойства DPI не имеет ? Установка DPI возможна только через объект Сканер получается.

Автор: Vofka 17.10.19, 10:33

andrew76, то что я написал выше, это не мой личный опыт, это я набросал вариант из того, что погуглил в интернете. Насколько я понял, ShowSelectDevice покажет вам тоже какой-то диалог, в котором будет перечень сканеров (первый параметр говорит о том, что надо показать именно сканеры), из которого вы должны будете выбрать нужный. Для начала проверьте работает ли это и дает ли это тот эффект, который вы ожидаете. Если получится достигнуть таким образом нужный эффект, я думаю, что есть какой-то АПИ, что бы выбрать сканер без диалога, а как-то программно (возможно через https://pro1c.org.ua/redirect.php?https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wiaaut/-wiaaut-devicemanager). https://pro1c.org.ua/redirect.php?https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wiaaut/-wiaaut-shared-samples много разных примеров есть.

Автор: andrew76 17.10.19, 10:43

Vofka @ Сегодня, 13:33 * ,
Работает ,программно установил значение DPI в значение 300.Зато теперь сканирует только черно-белое изображение.
И вообще без показа диалогов.

Автор: Vofka 17.10.19, 11:30

Цитата(andrew76 @ 17.10.19, 11:43) *
Зато теперь сканирует только черно-белое изображение.

А так?
Property prop = scannner.properties.get_Item("6146");
prop.set_Value(1);

Автор: andrew76 17.10.19, 12:36

Vofka @ Сегодня, 14:30 * ,

Так-помогло.Теперь сканирует цветное изображение.Но ни одного диалогового окна WIA не видно на мониторе.
Сканирование идет втихую.По идее в первом варианте после вызова DevManager = Новый COMОбъект("WIA.CommonDialog")
появлялось диалоговое головное окно WIA.А сейчас нет.

Автор: Vofka 17.10.19, 12:57

andrew76, вы полный код не показываете, поэтому сложно что-то сказать. Видимо окно у вас было не после DevManager = Новый COMОбъект("WIA.CommonDialog"), а после какого-то другого метода, т.к. по идее эта строка у вас не поменялась. Но опять таки, сложно что-то угадывать, не видя что вы пишете у себя.

Автор: andrew76 17.10.19, 13:09

Vofka @ Сегодня, 15:57 * ,

ScannerDeviceType  = 1;

ИмяФайла="c:\proba1.jpg";


Device = Новый COMОбъект("WIA.DeviceManager");
DeviceInfo = Device.DeviceInfos();

Если DeviceInfo.Count() > 0 Тогда
Dialog = Новый COMОбъект("WIA.CommonDialog");
objDevice = Dialog.ShowSelectDevice();

// Настройка сканера
Сканер = objDevice.Items(1);
СканерПараметры = Сканер.Properties();
СканерПараметры.Item("6146").Value = 1;
СканерПараметры.Item("6147").Value = 300;              
СканерПараметры.Item("6148").Value = 300;              

objImageFile = Сканер.Transfer();

objImageProcess = Новый COMОбъект("WIA.ImageProcess");
ImageProcess = Новый COMОбъект("WIA.ImageProcess");  
ImageProcess.Filters.Add(ImageProcess.FilterInfos("Convert").FilterID);
IP1 = ImageProcess.Filters(1);

Для К = 1 По IP1.Properties.Count Цикл

Если IP1.Properties(К).Name = "FormatID" Тогда
     IP1.Properties(К).Value = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}";;
КонецЕсли;

КонецЦикла;
objImageFile = ImageProcess.Apply(objImageFile);

objImageFile.SaveFile(ИмяФайла);

КонецЕсли;

Автор: Vofka 17.10.19, 13:52

Dialog.ShowSelectDevice() и ShowSelectDevice(1, false, false) разве одно и то же?

Автор: andrew76 17.10.19, 15:37

Vofka @ Сегодня, 16:52 * ,

Поведение не меняется-что с аргументами,что без-нет разницы.Там первый параметр-код устройства.
1-это сканер.Диалоговых окон не видно никаких.Тихо сканирует и все.
Мне кажется дело в этой строчке:

objImageFile = Сканер.Transfer();


Вот часто попадающийся пример из Интернета:
Здесь видны диалоговые окна WIA,при сканировании видно индикатор процесса.
Этот вариант бы мне подошел,но я не понимаю ,как этом варианте установить значение DPI программно.
Здесь используется другой метод : DevManager.ShowAcquireImage()

Image = Новый COMОбъект("WIA.ImageFile"); //создаем объект "Изображения" в WIA для дальнейшей работы с ним
DevManager = Новый COMОбъект("WIA.CommonDialog"); //а это диалог сканирования
Image = DevManager.ShowAcquireImage(); //записываем сканированное изображение
IP = Новый COMОбъект("WIA.ImageProcess"); //создаем фильтр для сохранения изображения
IP.Filters.Add(IP.FilterInfos("Convert").FilterID);

IP1 = IP.Filters(1);
Для К = 1 По IP1.Properties.Count Цикл
      Если IP1.Properties(К).Name = "FormatID" Тогда
            IP1.Properties(К).Value = "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}";
            Прервать;
        КонецЕсли;
КонецЦикла;

Image = IP.Apply(Image);  
Image.SaveFile(ИмяФайла);

Автор: Vofka 17.10.19, 16:15

andrew76, а на какой строке там диалоговое окно появляется, на вызове метода ShowAcquireImage?

Автор: andrew76 17.10.19, 16:20

Vofka @ Сегодня, 19:15 * ,

На вот этой 2-й строке : DevManager = Новый COMОбъект("WIA.CommonDialog"); //а это диалог сканирования

а это само сканирование: Image = DevManager.ShowAcquireImage();

Автор: Vofka 17.10.19, 16:46

Странно как-то. Если оно должно выскакивать на строке DevManager = Новый COMОбъект("WIA.CommonDialog");, то почему оно не выскакивает на этой строке в вашем варианте из сообщения #9?

Автор: andrew76 17.10.19, 16:50

Vofka @ Сегодня, 19:46 * ,

Подозреваю,что все окна "гасит" команда на сканирование : objImageFile = Сканер.Transfer()

Автор: Vofka 18.10.19, 8:32

Есть ещё такая штука:

Image = CommonDialog.ShowTransfer(Item);


Item - это по идее объект Сканер, который вы получили из objDevice.Items(1). Более подробно https://pro1c.org.ua/redirect.php?https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wiaaut/-wiaaut-icommondialog-showtransfer.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua