скриптинг Open As

  • Автор темы Автор темы setnull
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
Ответ: скриптинг Open As

j - JPEGSaveOptions со всеми значениями

JPEGSaveOptions - это сложная переменная, то есть тип переменной сложенный из других, простых или сложных типов. Называется - структура.

Например в эту переменную входит параметр сжатия изображения. Это число от 1 до 10. Число 10 можно записать в 4-х битах, но у компа есть квант адресации - байт, 8 бит. Значит этот параметр - integer, или "целое". Битность "целого" опредедяется компилятором езыга. В эту переменную входит параметр сохранения цветового профиля. Этот параметр передает лишь 1 ответ на 1 вопрос: сохранять профиль в файле? Да/Нет. Поскольку 1 бит может существовать в двух состояниях - 1 и 0 - то для этого параметра требуется ровно 1 бит. Например 0 означает НЕ сохранять, а 1 - сохранять. Но поскольку комп не адресует биты по-отдельности, то такой параметр будет передаваться "словом" - то есть 16-ю битами. Такова судьба компа. formatOptions - это указатель.

Вы знаете что такое @указатели? :)
 
Ответ: скриптинг Open As

Zest, вы сделали совершенно правильный вывод, что я не программист. А мой знакомый программер - не дизайнер. У него просто нет времени влезать в дизайнерские нюансы. Книг по Яве натянул около гига, буду читать про @указатели.
Вопрос: Если я открываю PSD с винта, скрипт работает ОК.
Если это растрированный EPS или PDF - "не может сохранить".
Как сие вылечить?
 
Ответ: скриптинг Open As

А на яве разве есть указатели? Этожэ кажется на С. Я тоже не программист и что?

Если это растрированный EPS или PDF - "не может сохранить".

Куда сохранить? В епс или педиэф, или в пиезде?
 
Ответ: скриптинг Open As

С явой вообще проблема в том, что для нее нет среды разработки. Ну, в смысле с явой ФШ, с ява-скриптами. Например на басике я могу писать не читая документации. Потому что редактор подсказывает какие методы и свойства доступны в том или ином контексте. Из самих названий уже становится многое понятно, а если не понятно - вызвываем Object Browser и читаем краткие аннотации к методам и свойствам объектов. В окне intermediate я могу проверять куски кода и даже писать целые функции немедленно проверяя результат. Например могу написать: Photoshop.ActiveDocument.Layers(0).delete - нажать Enter и в ФШ в активном документе первый по счету слой удалится. А для явы фотошопа ничего лучше нотепада или ихнего тупого редактора не предусмотрено.
 
Ответ: скриптинг Open As

Zest, надо сохранить как жопег (jpg) открытый шопом pdf или eps.
Еще одна проблема вылезла: если открыто несколько документов, шоп почему-то сохраняет как jpg один из неактивных документов. И оставляет его незакрытым.
 
Ответ: скриптинг Open As

Такой вариант лично мне намного понятнее:

var aaaDoc = app.documents[0] // назначение переменной "aaaDoc" для активного документа
aaaDoc.saveAs(new File(aaaDoc.fullName), JPEGSaveOptions(quality = 4, embedColorProfile = false), false, Extension.LOWERCASE)
aaaDoc.close(SaveOptions.DONOTSAVECHANGES) // Закрыть документ "aaaDoc" без сохранения
 
Ответ: скриптинг Open As

Дело в том что JPEGSaveOptions это сложная переменная - структура. Метод saveAs должен получить в качестве аргумента ссылку на эту самую структуру. Ну, по идее так должно быть, хотя, конечно, я определенно не знаю как это делает компилятор явы.

То есть, JPEGSaveOptions это несколько упорядоченных переменных разных типов. Например quality - явно целое без знака, embedColorProfile - бит, или флаг (boolean) хотя адресуется, разумеется, как минимум байтом (8 бит).

Поскольку я даже понятия не имею как на яве определять типы переменных, поскольку в сырцах они там все var (видимо от variable - переменная), то приведу пример как это делается на басике. Простые переменные:

Dim myInt as Integer ' целое со знаком, 2 байта.
Dim myBool as Boolean ' бит или флаг, 1 бит, да или нет, true or false
Dim myStr as String ' строка, фактически массив с заголовком

Сложная переменная состоит из простых переменных, но по правилам программирования сначала надо определить тип этой сложной переменной. В примере выше мы пользовались встроенными, то есть готовыми типами, а можно создавать свои собственные:

Private Type myComplexVar
*Dim myInt as Integer ' целое со знаком, 2 байта.
Dim myBool as Boolean ' бит или флаг, 1 бит, да или нет, true or false
Dim myStr as String ' строка, фактически массив с заголовком
End Type

Когда тип собственной переменной определен можно его начинать использовать:

Dim myVar as myComplexVar

Dim это dimension, as это "как" - дословно.

Доступ к суб-переменным сложной переменной осуществляется по общему для явы и басику синтаксису - через точку:

myVar.myString = "Привет мир!"
myVar.myBool = false
myVar.myInt = 5

После этого вы можете присваивать значение одной сложной переменной другой сложной переменной того же типа через знак равенства: myAnotherVar = myVar.

jpegSaveOptions не передается в функцию как есть, то есть по значению. Фунцкция получает ссылку на адрес данных переменной этого типа и получает эти данные по этому адресу. Это очень просто. Поскольку известна байтовая длина каждой простой переменной входящей в сложную переменную - например целое это 2 байта, флаг это 1 байт, строка имеет собственный указатель на свой массив и его длину - то программа просто отсчитывает нужное количество байт (смещение) от указанного адреса и считывает данные из памяти для своих нужд.

Метод saveAs требует от вас передавать указатель на сложную переменную типа jpegSaveOptions - структуру данных о параметрах записи формата jpeg. Поэтому вы не можете передавать ей эти параметры по-отдельности.

Аналогично ссылкой на адрес в памяти является объектная переменная docRef (название не имеет значение, можно написать myLovelyDocumentReference). Аналогично ей является объектная переменная типа File. Так что вам лучше подчиниться этим простым правилам и попробовать понять так, как оно устроено, а не так, как вам хотелось бы.
 
Ответ: скриптинг Open As

Спасибо за популяризированный ответ, ясно, где я ошибся.

var aaaDoc = app.documents[0] // назначение переменной "aaaDoc" для активного документа
var j = new JPEGSaveOptions() // параметры формата графического файла
aaaDoc.flatten() // Слить все слои документа "aaaDoc"
j.quality = 4 // качество сохранения "4"
j.embedColorProfile = false // не сохранять профиль
var jpgFile = new File(aaaDoc.fullName) // задание использования старого имени для сохранения
aaaDoc.saveAs(jpgFile, j, false, Extension.LOWERCASE)
aaaDoc.close(SaveOptions.DONOTSAVECHANGES) // Закрыть документ "aaaDoc" без сохранения

действительно работает, в мое "укороченное" творение - нет.
 
Ответ: скриптинг Open As

Тут еще есть кто?
Возникла необходимость открывать диалог SaveAs, чтобы пользователь мог внести коррективы в настройки процесса. В CS скрипт работает нормально. В CS3 окно диалога открываться не хочет - пролетает на автомате. Как можно заставить диалог отобразиться?

И еще один вопрос. Периодически при работе этого скрипта, если в фотошопе открыто несколько файлов, начинает сохраняться файл, следующий за открытым. Скрипт вызывается из экшена. Можно ли как-то перестраховаться для гарантированной работы именно с активным документом?

Самоё скрипт:
PHP:
var docRef = app.activeDocument;

SaveAsJPEG (app.activeDocument.path, "_bw", 10);

function SaveAsJPEG (Destination, TailName, Quality, Limit) 
{ 
	docRef.displayDialogs = true;
	var FileName = docRef.name;
	var OutputFileName = Destination + "\\" + FileName;
	
	FullOutputFileName = OutputFileName + TailName + ".jpg";
	var regex = /(.*)\.(.*)/;
	var CorrectedName = regex.exec(OutputFileName);
	
	OutputFileName = CorrectedName[1];
	FullOutputFileName = OutputFileName + TailName + ".jpg";
	
	jpegFile = new File(FullOutputFileName);
	jpegSaveOptions = new JPEGSaveOptions();
	jpegSaveOptions.embedColorProfile = false;
	jpegSaveOptions.quality = Quality;
	
	docRef.saveAs(jpegFile, jpegSaveOptions, true, Extension.LOWERCASE);
	
	jpegFile = null;
}
 
Ответ: скриптинг Open As

Это бессмысленная строка:
Код:
docRef.displayDialogs = true;

Для отображения диалога нужно добавить строку:
Код:
app.displayDialogs = DialogModes.ALL;

Про путаницу активного и следующего соображений нет.
 
Ответ: скриптинг Open As

Kuzmin сказал(а):
Это бессмысленная строка:
Код:
docRef.displayDialogs = true;
В пылу битвы добавил...

Kuzmin сказал(а):
Для отображения диалога нужно добавить строку:
Код:
app.displayDialogs = DialogModes.ALL;

Про путаницу активного и следующего соображений нет.
Очень спасибо. Заработало!
 
Ответ: скриптинг Open As

True/False/Undefined это -1, 0, 1 соответственно. Адобские упыри запросто могли бы сделать ALL = -1, NO = 0, и Errors = 1. Задав умолчание = 1.

начинает сохраняться файл, следующий за открытым

Смотрите выше по скрипту в цикле откуда оно берется. Можно просто тупо добавить в начало функции строку app.activeDocument = docRef;
 
Ответ: скриптинг Open As

Чтобы не плодить темы, с позволения задам вопрос здесь.

Не подскажете, как можно получить список Экшинов, загруженных в фотошопе? Т.е. мне нужно достать из него их так как достает Бэтч: Список Set-ов и соответствующие им Action-ы.
 
Ответ: скриптинг Open As

У меня такой скриптик обнаружился, когда-то с сети скачал. Работает с ЦС2, с другими версиями не пробовал.
 

Вложения

Ответ: скриптинг Open As

Огромное спасибо. Разобрался.
 
Статус
Закрыто для дальнейших ответов.