Имя: Пароль:
1C
1С v8
Поворот рисунка в табличном документе
0 adom_us
 
22.09.14
14:11
Добрый день
Прошу подсказать есть ли в 1с метод либо параметр, позволяющий повернуть вставленный рисунок в табличный документ на произвольный угол. Ниже текст примера

Картинка = Ссылка.Хранилище.Получить();
ИмяВременногоФайла = Имяфайла;
Картинка.Записать(ИмяВременногоФайла);
Picture = MSWord.Selection.InlineShapes.AddPicture(ИмяВременногоФайла, Ложь, Истина);
Shape = Picture.ConvertToShape();
Shape.WrapFormat.Type = 5;
Shape.Left = 50;
Shape.Top = 50;

Прошу подсказать, как дополнить текст, чтобы повернуть например на 30 градусов рисунок. Или в 1с нет такого средства?
1 Asmody
 
22.09.14
14:20
Я не вижу в примере табличного документа
2 Asmody
 
22.09.14
14:26
3 adom_us
 
22.09.14
14:36
Про WOrd - спасибо. Там пока не стоял вопрос.

Не тот фрагмент вставил, извиняюсь. Исправленный вариант примера:

ДанРисунок = Ссылка.Хранилище.Получить();
Картинка=Новый Картинка(ДанРисунок .ПолучитьДвоичныеДанные());
ОбластьМакета.Рисунки.ПечатьОргКонтрагента.Картинка=Картинка;
ТабДокумент.Вывести(ОбластьМакета);

В макете задан рисунок в виде квадрата, который необходимо повернуть на угол (аналогично тому как в экселе можно повернуть рисунок)
4 Asmody
 
22.09.14
15:00
(3) В 1С нельзя.
5 Aceforg
 
22.09.14
15:26
(0) Можно повернуть внешними компонентами, например http://infostart.ru/public/74981/
6 trad
 
22.09.14
15:50
7 adom_us
 
22.09.14
15:55
Спасибо
8 adom_us
 
24.09.14
22:05
В общем, внешними компонентами повернуть не получилось. Те что нашел - делают только повороты на 90градусов.
9 adom_us
 
24.09.14
22:08
Сделал с помощью запуска внешнего приложения. Утилита convert из пакета ImageMagick мне помогла. Параметр rotate позволяет повернуть рисунок.
10 Vladal
 
25.09.14
00:29
Будь джентельменом, покажи свой код, как поворачивал.
11 Asmody
 
25.09.14
07:48
(10) у меня есть такая обработка. Скинуть?
12 ИС-2
 
naïve
25.09.14
08:25
(11) - можно текст выложить .

Еще можно сделать через библиотеки от смотрелок irfanview и xnview
13 DrZombi
 
гуру
25.09.14
08:39
//Неудачный проект!!!
Функция ПовернутьКартинкуНаГрадусMiniRotate(Картинка,Градус) Экспорт
    
    Попытка
        //http://infostart.ru/public/241765/
        ПутьMiniRotate = КаталогВременныхФайлов()+"MiniRotate04.exe";
        ФайлMiniRotate = Новый Файл(ПутьMiniRotate);        
        Если НЕ ФайлMiniRotate.Существует() Тогда
            
            ПрограммаИзПамяти = ПолучитьОбщийМакет("ПрограммаMiniRotate");
            Если ПрограммаИзПамяти <> Неопределено Тогда        
                ПрограммаИзПамяти.Записать(ПутьMiniRotate);
            КонецЕсли;
        КонецЕсли;
        
        пИмяВремКартинки = ПолучитьИмяВременногоФайла("bmp");
        Картинка.Записать(пИмяВремКартинки);
        
        пИмяВремКартинкиКон = ПолучитьИмяВременногоФайла("bmp");
        
        
        WshShell = Новый COMОбъект("WScript.Shell");
        WshShell.Run("" + ПутьMiniRotate + " """ + пИмяВремКартинки + """ /u:" + Формат(Градус,"ЧДЦ=0; ЧН=0; ЧГ=0") + "/fs:""" + пИмяВремКартинкиКон + """" ,0,-1);    
        
        пКартинкаНовый = Новый Картинка(пИмяВремКартинкиКон,Истина);
    Исключение
        ЗаписьЖурналаРегистрации("Переворот картинки ШК под углом", УровеньЖурналаРегистрации.Ошибка,,,
        ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
        
        пКартинкаНовый = Неопределено;
    КонецПопытки;
        
    УдалитьВременныйФайл(пИмяВремКартинки);
    УдалитьВременныйФайл(пИмяВремКартинкиКон);
    
    Возврат пКартинкаНовый;
КонецФункции

//Требуется библиотека C:\Windows\System32\wiaaut.dll
Функция ПовернутьКартинкуНаГрадусWIA(Картинка,Градус) Экспорт
    Перем Image,IP,IP1,К;
    
    Попытка
        пИмяВремКартинки = ПолучитьИмяВременногоФайла("tmp");
        Картинка.Записать(пИмяВремКартинки);
        
        Image = Новый COMОбъект("WIA.ImageFile");
        Image.LoadFile(пИмяВремКартинки);
        
        Если Image = Неопределено Тогда
            УдалитьВременныйФайл(пИмяВремКартинки);
            Возврат Неопределено;
        КонецЕсли;
        
        IP = Новый COMОбъект("WIA.ImageProcess"); //создаем объект WIA для редактирования изображения
        IP.Filters.Add(IP.FilterInfos("RotateFlip").FilterID); //создаем WIA-фильтр для поворота
        IP1 = IP.Filters(1);
        Для К = 1 По IP1.Properties.Count Цикл
            Если IP1.Properties(К).Name = "RotationAngle" Тогда
                IP1.Properties(К).Value = Градус; //вертеть можно на 90,180 и 270 грудосов
                Прервать;
            КонецЕсли;
        КонецЦикла;
        
        Image = IP.Apply(Image);
        
        пИмяВремКартинки2 = ПолучитьИмяВременногоФайла("bmp");
        Image.SaveFile(пИмяВремКартинки2);
        
        Image = "";
        IP = "";
        IP1 = "";
        
        пКартинкаНовый = Новый Картинка(пИмяВремКартинки2,Истина);
    Исключение
        ЗаписьЖурналаРегистрации("Переворот картинки ШК под углом", УровеньЖурналаРегистрации.Ошибка,,,
        ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
        
        пКартинкаНовый = Неопределено;
    КонецПопытки;
    
    УдалитьВременныйФайл(пИмяВремКартинки);
    УдалитьВременныйФайл(пИмяВремКартинки2);
    
    Возврат пКартинкаНовый;
КонецФункции

Процедура УдалитьВременныйФайл(пИмяВремКартинки) Экспорт

    Попытка
        Если пИмяВремКартинки = Неопределено или ПустаяСтрока(пИмяВремКартинки) Тогда
            Возврат;
        КонецЕсли;
            
        ВремФайл = Новый Файл(пИмяВремКартинки);
        Если ВремФайл.Существует() и ВремФайл.ЭтоФайл() Тогда
            УдалитьФайлы(пИмяВремКартинки);
        КонецЕсли;
    Исключение
    КонецПопытки;
    
КонецПроцедуры
14 DrZombi
 
гуру
25.09.14
08:41
(13) По ПовернутьКартинкуНаГрадусMiniRotate, она на Сервере х64 не работает. Если только локально на клиентской машинке под х32.

По поводу ПовернутьКартинкуНаГрадусWIA, требует на сервере WIA, но у меня были связаны руки... в общем на Сервере 2012 х64 не взлетело :(

Но локально на клиенте все вертит на ура :)
15 Asmody
 
25.09.14
12:48
Вот https://db.tt/qci6msUh
Писал для 8.1, под УФ не переделывал, не было потребности
16 DrZombi
 
гуру
25.09.14
13:21
(15) ImageMagick у тебя там версия 6.4.5
И на Сервере 2012 не работает :(   (но все ровно спасибо, и зачем писать все на английском, дело привычки или как?)
17 Asmody
 
25.09.14
13:55
(16) IM можно поменять. Загрузи mogrify.exe из дистрибутива
18 Asmody
 
25.09.14
13:59
Оно сначала было частью другой обработки по обмену с сайтом, а там разные xml'и, rpc, json'ы. Ну и так и осталось.
19 adom_us
 
26.09.14
14:00
Тестовый пример:

ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");

ОбластьМакета = Макет.ПолучитьОбласть("Область1");
Рис=Макет.Рисунки.ПечатьОрганизации;
ПО=Организация.ПечатьОрганизации;
Если ЗначениеЗаполнено(ПО) Тогда
    Дан=ПО.Хранилище.Получить();
    
    СтарыйФайл = "d:\file1.bmp";
    Дан.Записать(СтарыйФайл);
    НовыйФайл = "d:\file2.bmp";
           
    ИФайл = "d:\convert.exe -rotate 30 "+СтарыйФайл +" " +НовыйФайл; //30 угол поворота
    ЗапуститьПриложение(ИФайл);

    Кар=Новый Картинка(НовыйФайл);
    Рис.Картинка=Кар;
КонецЕсли;
ТабДок.Вывести(Макет);
ТабДок.Показать();

Но есть пара проблем
1. рисунок не успевает сконвертиться при первом запуске. Поэтому процедуру разбил на два действия. 1) конвертация 2) печать уже сконвертированного рисунка.
2. при вращении все таки изменяется сам рисунок и он фактически сжимается при печати. Как это обойти - пока не нашел.
В связи чем есть два вопроса:
а) может ли кто подсказать как сохранить рисунок в виде круга (чтоб избежать изменения размеров рисунка)
б) может все таки есть в 1с средства позволяющие повернуть на произвольный угол тот фрагмент, где макете отображается рисунок?
20 adom_us
 
26.09.14
14:10
В тесте вместо ПО - ПечатьОрганизации, сорри за такое сокращение.
21 H A D G E H O G s
 
26.09.14
14:30
(19) При поворотах на углы, отличные от кратных 90 для любых изображений идет изменение размера.
22 H A D G E H O G s
 
26.09.14
14:31
Хрен в ним, с размером.
Вопрос - чем заливать дополнительные области.
23 Serginio1
 
26.09.14
14:40
24 adom_us
 
26.09.14
17:43
(21) Про это я и писал - проблема 2. Как ее решить, кто может помочь. Если можно пример текста для 1с
25 adom_us
 
26.09.14
18:31
Все таки нужен сдвиг и поворот на угол области с рисунком в макете (кроме поворота нужен еще и сдвиг влево-вправо,вверх-вниз. Все таки есть ли какие либо функции в 1с, позволяющие управлять этой областью в табличном документе?
26 EvgeniuXP
 
26.09.14
19:01
(25) нет, высотой строки и шириной колонки можешь регулировать только, а так используй ActiveX
27 Asmody
 
26.09.14
19:19
"Сохранить рисунок в виде круга" — ААААА! Смешарики атакуе!!!111
28 adom_us
 
26.09.14
19:31
(27) Да, безумная идея...
29 adom_us
 
26.09.14
19:46
Но если б рисунок был бы в форме круга, а не прямоугольник, то это бы многое решило..

(25) можно пример как это сделать. Спасибо
30 adom_us
 
26.09.14
19:54
(26) прошу пример, если есть, как можно управлять вот этим объектом Макет.Рисунки.Рисунок через ActiveX. Рисунок - прямоугольная область на макете.
31 adom_us
 
26.09.14
20:18
Появился еще один вариант - обрезать лишние области на сконвертированном рисунке. Зная размеры рисунка, можно рассчитать - на сколько увеличится рисунок, и по краям сделать обрезку, чтобы приблизить к первоначальному размеру рисунка.
В ImageMagick это можно сделать?
Либо другую утилиту можете предложить?
32 adom_us
 
26.09.14
21:16
Ура! (31) вроде реализовал

convert 1.bmp -gravity Center -crop 346x346+0 2.bmp


1.bmp - повернутый файл
2.bmp - результат

обрезаю по центру сконвертированного файла согласно первоначального размера рисунка (346пикселей)

на выходных уже на конфе протестирую.
33 adom_us
 
26.09.14
21:22
(26) Но это так актуально. Хотелось бы управлять непосредственно областью рисунка в макете. Прошу дать пример
34 zulu_mix
 
26.09.14
21:36
пиши компоненту с использованием виндовых функций GDI
35 zulu_mix
 
26.09.14
21:39
36 EvgeniuXP
 
26.09.14
22:14
http://infostart.ru/public/138263/

делал с помощью файла text_1c.ocx
37 EvgeniuXP
 
26.09.14
22:16
правда реализовывал в 7.7. Также этот ActiveX вставлял и в 8.1  (настройками баловался, но реализовывать не надо было - добавляется как внешний объект)
38 EvgeniuXP
 
26.09.14
22:19
пример под 7.7 - но его легко преобразовать и под 8.х - т.к. используются свойства ActiveX - надо, пиши емайл - закину

(где качал смотрю уже страницу убили автора)
39 EvgeniuXP
 
26.09.14
22:24
возьмешь если надо - https://yadi.sk/d/9KH7KShxbgZv2.
40 adom_us
 
26.09.14
22:49
(39) Спасибо. Буду разбираться
41 Vladal
 
28.09.14
00:52
(15) Спасибо, добрый человек.