Масштабирование изображений внутри фрейма

  • Автор темы Автор темы Septic87
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Septic87

Участник
Топикстартер
Сообщения
29
Реакции
0
Всем привет.
Вставляю во фрейм текстовый документ содержащий картинки. И если размер фрейма меньше одной из картинок, то картинка не вставляется и он остается переполненным.
Подскажите как пропорционально с масштабировать картинки до размера фрейма.

Код:
     TextFrame frame;

     ....
     string sPath = "с:\\1.docx";
     frame.Place(sPath);
     frame.Fit(idFitOptions.idFillProportionally);
     for (int i = 1; i < frame.AllGraphics.Count; i++)
     {
          Image g = frame.AllGraphics as Image;
          Rectangle r = (g.Parent as Rectangle);
          r.Fit(idFitOptions.idProportionally);
     }
Заранее благодарю за помощь.
 
Комментарий модератора: @Septic87, для вставки в сообщения кусков кода используйте [code]...[/code].
Ваше сообщение я подправил.
 
  • Спасибо
Реакции: bossrus и Eugenyus
Вы вставляете не картинку, а текстовый документ с картинкой.
И получаете такую конструкцию:
Фрейм, в котором пустой текст, в который in-line вставлена картинка.
В этом случае fit содержимого по тексту не работает.
Вставляйте картинку, т.е image, а это tif, eps, jpg, pdf...

И вот еще:
fit вы делаете для фрейма, который вставлен в текст в основном фрейме.
 
Вставляйте картинку, т.е image, а это tif, eps, jpg, pdf...
Не совсем вас понял, дело в том что когда через place я вставляю документ, то в нем будет, например, текст и картинка, которая обернута в другой фрейм (это мы увидим если экспортнуть результат, например, в .indd и открыть Indesign) и это все внутри главного фрейма. Напрямую экспортировать из Word мне не подходит (скажем так ограничения задачи).
Забыл в первом посте отметить, что картинка так же может вставиться но не влезть по ширине, тогда ее фрейм будет шире "главного". В этом случае мне тоже нужно с масштабировать ее пропорционально до ширины "главного" фрейма.
Если после вставки Word документа попытаться запросить GeometricBounds, то там будет пусто.
Код:
for (int i = 1; i < frame.AllGraphics.Count; i++)
{
    Image g = frame.AllGraphics[i] as Image;
    Rectangle r = g.Parent as Rectangle;
    r.GeometricBounds; // тут ошибка. здесь как установить так и запросить свойство не получается
    TextFrame f = r.Parent as TextFrame;// тоже мне не понятно, в результате f == null а должен быть == frame
}
Отсюда я не догоняю как мне уменьшить картинку пропорционально до того размера, чтобы она влезла в "главный" фрейм.
 
1. Если объект не размещен, то GeometricBounds его пуст.

2. r.Parent даст не TextFrame, а character.
А вот его ParentTextFames даст цепочку фреймов. Вам нужен [0]-й.
Для него можно взять GeometricBounds и посчитать ширину.
Размеры изображения можно взять из свойств линка.
Там есть размеры в пикселях и эффективное разрешение.
Тогда можно посчитать необходимый масштаб,
Посмотреть какой масштаб стоит сейчас и применить нужный.
Причем масштаб применять не к изображению, а к содержащему его фрейму,
который у вас r.

Ну, как-то так...
 
Спасибо за подсказку.
Я попробовал:
Код:
  Image g = frame.AllGraphics[i] as Image;
  Rectangle r = (g.Parent as Rectangle);
  Character c = (r.Parent as Character);
  TextFrame ts2 = c.ParentTextFrames as TextFrame;//каст не прошел
  TextFrames ts = c.ParentTextFrames as TextFrames;//каст не прошел
  TextPaths ts1 = c.ParentTextFrames as TextPaths;//каст не прошел
По документации в ParentTextFrames действительно лежит коллекция фреймов, но почему то каст не проходит. Почему может не кастоваться? Какое из свойств линка брать, и к чему его кастить? Фрэйму или чему-то другому?
 
Ну раз коллекция, значит, наверное,
Код:
c.ParentTextFrames[j]
?
 
не проще, кстати, перейти на js и забыть про касты вообще?
 
Eugenyus, насколько я понимаю в ParentTextFrames лежит какой-то ком объект коллекции. И чтобы обратиться по индексу мне надо, собственно "запросить интерфейс", чтобы получить инстанс этой коллекции.
Skvoznyak, задача состоит именно в том, чтобы написать на шарпе. Но при желании я все равно могу позвать какой-нибудь скрипт с помощью DoScript у InDesignServer.Application или InDesign.Application.
 
По документации в ParentTextFrames действительно лежит коллекция фреймов, но почему то каст не проходит.
Потому, что у текста в оверсете нет свойства ParentTextFrames. Это очевидно.
Чтобы найти, в каком фрейме начинается оверсет, можно обратным обходом от c.Paregraphs[0] найти параграф, для которого ParentTextFrames будет коллекцией.
 
Так тоже не получается. У меня в коллекции параграфов всего один и для него ParentTextFrames пустой возвращается. Мне кажется все забыли конечную цель :). А необходимо получить инфу о фрейме, в который вставлена картинка, чтобы потом ее пропорционально смасштабировать для попадания ее в главный фрейм. И даже если я ParentTextFrames[1] получу, то тот ли фрейм у меня будет? И как мне картинку из линка подтянуть?
 
Код:
  Image g = frame.AllGraphics[i] as Image;
  Rectangle r = (g.Parent as Rectangle);
  Character c = (r.Parent as Character);
  for(int j = 1; j <= c.Paragraphs.Count; j++)
  {
        Paragraph pp = c.Paragraphs[j] as Paragraph;
        if (pp != null)
       {
             TextFrame tff = pp.Parent as TextFrame; // пусто
             bool bb = pp.ParentTextFrames == null; // false
             TextFrames ts = pp.ParentTextFrames as TextFrames; //пусто
       }
}

Я попробовал - безрезультатно. Но удалость прикастовать к Rectangles. В итоге я получил r. А у него, как описано выше, не задан GeometricBounds.
 
Обойти все текстовые контейнеры в story, найти минимальные размеры высоты и ширины, изменить размеры всех прямоугольников, которые больше минимальных. Затем уже подтягивать прямоугольники размеру конкретных текстовых фреймов.
 
Так же не получилось. В данном случае у Story есть только Rectangles, где есть те у которых нет GeometricBounds.
Код:
for (int l = 1; l <= doc.Stories.Count; l++)
{
      Story ps = frame.ParentStory;
      Story st = doc.Stories[l] as Story;
      bool isp = ps == st;// тут всегда false
      int co = st.TextFrames.Count;// тут всегда 0
      for (int hl = 1; hl <= st.Rectangles.Count; hl++)
      {
          Rectangle r = st.Rectangles[hl] as Rectangle;
          dynamic d = r.GeometricBounds;//тут валимся
         int coR = st.Rectangles.Count;
       }
  }
такое ощущение, что созданный фрейм, куда я вставляю доковский документ, не добавлен в Story. Фрейм я создаю дублированием из другого документа, но я проверил, что он не принадлежит ни одному из Story документа откуда дублирую, проверял через ParentStory (бегал по коллекциям нового документа и старого).
 
GeometricBounds -- это видимые границы объекта.
Если объект не видно -- то GeometricBounds не определен.
Прочитать размеры неразмещенного объекта мне не удалось,
но к неразмещенному объекту можно применить scale.
Например 50%
Код:
myRectangle.absoluteHorizontalScale = 50;
myRectangle.absoluteVerticalScale = 50
Если после этого GeometricBounds появится,
тогда можно посчитать, какой масштаб был нужен и применить его.
 
Тоже не вышло, поигрался константами - все тщетно. ((((
Видимо у задачи нет решения, кроме как приехать в Адобе и попросить их запилить функции масштабирования для не размещенных объектов. ))
 
А до 25% масштаб уменьшить? Или вообще до 10?
Код:
{ Rectangle r = st.Rectangles[hl] as Rectangle;
r.horizontalScale = r.verticalScale = 25;}
 
Да, это я тоже делал. Пробовал даже настройками (например TransformPreference) поиграться, тоже не помогло.
 
Вот это у меня работает.
У меня в файле одна картинка

Код:
var myDoc = app.activeDocument;
var myImage = myDoc.allGraphics[0];
var myRect = myImage.parent; // фрейм картинки
myRect.absoluteHorizontalScale = myRect.absoluteVerticalScale = 25;
 
Статус
Закрыто для дальнейших ответов.