(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Автоматизация поворота изображения в Photoshop с помощью JavaScript

Источник: habrahabr

Для одного проекта потребовалось сделать множество одинаковых изображений, но каждое должно было быть повернуто на 1 градус относительно предыдущего.

Первое, что пришло в голову: php-скрипт с использованием imagerotate из библиотеки GD. Получается, прямо скажем, несколько не то, что хотелось. Пояснить проще на примере:

 Таким образом, при повороте, изображение у нас получается больше, чем исходное. Делая подобную операцию в Photoshop (Free Transform), мы избегаем этой проблемы. Скорее всего решение нашлось бы и при использовании GD, но давно хотелось попробовать автоматизировать некоторые операции в Photoshop.

 Итак, необходимо автоматизировать операцию поворота и запись в файл.

Исходная картинка - компас со стрелкой:                                  Стрелка в отдельном слое и нужно получить 360 изображений этой стрелки.

                                                                                                                                                                                                                                

 Для бОльшей универсальности усложним скрипт - сделаем возможность не только записывать в отдельный файл каждый поворот, но и делать одно широкое изображение. Примерно так:

 

 

 Фотошоп у меня старенький, CS1, поэтому скрипт для него. Впрочем, под CS2 пойдет без проблем, а под более старшие версии допилить труда не составит. Комментарии в коде, примеры в конце.

Код:

// Устанавливаем значения
var Angle=360;  // На сколько градусов поворачиваем
var Frames=360;    // Количество кадров. Автоматически подсчитывается на сколько градусов нужно повернуть каждый кадр.
var saveFile = 1;  // Запись в файл каждого отдельного изображения: 0 - пишем в файл, 1 - не пишем
var Negative="";     // Если нужно крутить против часовой стрелки, то ставим минус

if (app.documents.length > 0) {
   
    // Определяем размеры текущего изображения
    app.preferences.rulerUnits = Units.INCHES;
    var srcDoc = app.activeDocument;
    var x2 = srcDoc.width * srcDoc.resolution;
    var y2 = srcDoc.height * srcDoc.resolution;

    // Выделяем все
    srcDoc.selection.select(Array (Array(0, 0), Array(x2, 0), Array(x2, y2), Array(0, y2)), SelectionType.REPLACE, 0, false);
    // Копируем выделенное
    srcDoc.selection.copy();

    // Создаем новый документ аналогичного размера, если каждый файл пишем отдельно.
    // Или документ нужной ширины, если всем делаем в одном файле
    app.preferences.rulerUnits = Units.PIXELS;
    var iFrames = 1;
    if (saveFile == 1) {
        iFrames = Frames;
    }
    var pasteDoc = app.documents.add(Number(x2*iFrames), Number(y2), srcDoc.resolution, "Rotated Layers", NewDocumentMode.RGB, DocumentFill.TRANSPARENT);

    // Выделяем все
    pasteDoc.selection.select(Array (Array(0, 0), Array(x2, 0), Array(x2, y2), Array(0, y2)), SelectionType.REPLACE, 0, false);
    // Вставляем изображение из буфера
    pasteDoc.paste();
    layerRef = pasteDoc.layers[0];
    // Самое главное - поворачиваем выделенное на количество градусов разделенных на количество картинок, которое нам нужно получить
    Angle = Angle / Frames;
    if (saveFile == 0) {
        // записываем в файл
        SaveToFile('0');
        // Не нашел как удалить слой в CS1, поэтому просто делаем слой невидимым
        layerRef.visible = false;
    }
    // Повторяем операцию нужное количество раз
    for ( var i = 1; i < Frames; i++ ) {
        var xs = x2 * i;
        pasteDoc.selection.select(Array (Array(xs, 0), Array(xs+x2, 0), Array(xs+x2, y2), Array(xs, y2)), SelectionType.REPLACE, 0, false);
        pasteDoc.paste();
        layerRef = pasteDoc.layers[0];
        layerRef.rotate(Negative + Angle*i);
        if (saveFile == 0) {
            SaveToFile(i);
            layerRef.visible = false;
        }
    }

} else {
    alert("Надо открыть хоть какое-нибудь изображение");
}  
   
function SaveToFile(n) {

    // Путь к файлу и имя файла. Нужно обратить внимание на регистр и слэши.
    var saveFile = new File("C:/test/"+n+".png");
    pngSaveOptions = new PNGSaveOptions();
    app.activeDocument.saveAs(saveFile, pngSaveOptions, true, Extension.LOWERCASE);

}

Как пользоваться:

Называем файл скрипта, например Rotate.js и помещаем его в каталог фотошопа: Photoshop\Presets\Scripts\
Редактируем параметры.
Открываем изображение, которое нужно обработать и в меню File->Scripts выбираем скрипт Rotate.

Демо. Картинка кликабельна. Жмем на стрелку - она крутится. В данном примере использован метод создания одного большого изображения. По мере вращения, картинка в цикле сдвигается на нужное количество пикселей, имитируя плавное вращение стрелки.

 Планировал сделать один большой PNG высотой 110px и шириной 39600px, но Firefox и Chrome отказались отображать его (IE8, Opera и Safari - смогли). Пришлось поделить на две части. Каждая часть получилась весом примерно по 620Кб.

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 31.01.2012 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Quest Software. SQL Navigator Professional Edition
Quest Software. SQL Navigator for Oracle
Business Studio 4.2 Enterprise. Конкурентная лицензия + Business Studio Portal 4.2. Пользовательская именная лицензия.
TeeChart for .NET with source code single license
Quest Software. Toad for Oracle Development Suite
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование в AutoCAD
Компьютерный дизайн - Все графические редакторы
OS Linux для начинающих. Новости + статьи + обзоры + ссылки
Вопросы и ответы по MS SQL Server
Все о PHP и даже больше
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100