Automatizar Photoshop – Intro
Si alguna vez te has encontrado repitiendo una serie de tareas manualmente en photoshop porque las actions no pueden ayudarte, entonces es el momento de probar a automatizar la herramienta. Las siguientes líneas deberían ayudarte a dar tus primeros pasos.
Lenguajes disponibles
La primera buena noticia es que si ya saben algo sobre programación en algún lenguaje serio, no les va a costar nada empezar. Lenguajes de programación serios son C y C++, todo lo demás son solo juguetes. La segunda buena noticia es que tenemos varios “lenguajes” donde elegir para meterle mano a Photoshop, aunque realmente solo hay una elección sensata:
- VBScript
- AppleScript
- JavaScript
¿Cuál es la elección sensata? JavaScript, está claro. ¿Por qué? Porque es independiente de la plataforma, así nuestros scripts para Windows podrán ser usados en Mac OS. Probablemente haya alguna razón para usar alguno de los otros dos lenguajes, pero eso implicaría aprender una nueva variante, tratar con esa broma que es Visual Basic, para después enfrentarse al engorro de portar de un lenguaje a otro. No, quedemosnos con JavaScript. Esa amalgama que tiene poco de Java, sí, pero que si estás programando algo para la web es indispensable controlar.
Como pueden imaginar, Adobe ha extendido la sintaxis del lenguaje para acomodar sus necesidades, de ahí que se en algunos sitios se refieran a el como ExtendedScript, pero para empezar, apenas notaremos diferencias. En cualquier caso, no dejen de mirar el la pagina de Adobe sobre Scripting para Photoshop (aquí). Destacaría tres cosas:
- Photoshop CS6 Scripting Guide, en el que encontrareis una guía para aprender que pueden hacer usando los lenguajes anteriormente mencionados.
- Photoshop CS6 JavaScript Reference, en el que está la documentación de todos los métodos disponibles desde JavaScript. ¿He dicho todos? Bueno, seguro que todo, todo no está.
- Scripting Listener Plug-in, un plug-in para Photoshop, que vuelca un registro de todo lo que hacemos en la interfaz de Photoshop como llamadas a funciones JavaScript. Muy útil, cuando no uno no tiene ni idea de como empezar con el código, pero si que tiene una idea de que pasos hay que automatizar. Por otro lado es indispensable para saber los identificadores de ciertas acciones que no están mencionadas en los anteriores documentos.
Escoja su editor
Los ficheros en los que vamos a trabajar son ficheros de texto normales, como los que usaríamos en una pagina web. Estos pueden tener la típica extensión .js, pero es recomendable que usemos la extensión .jsx. Esto nos ayudara a diferenciarlos de otros archivos JavaScript, y además nos permitirá ejecutarlos con un doble click… Para editarlos podemos usar cualquier editor de texto de nuestra preferencia.
Sin embargo vamos a hacer notar que Adobe ha incluido un editor propio, que, como editor, vale más bien poco, no he podido configurar que la sangría automática sea con tabulaciones, en vez de espacios. Y ese es un detalle que odio profundamente, no juzgarme muy seriamente si pienso que esas personas deberían morir. Lentamente, seguramente. Totalmente. Electricamente. Finalmente.
Si observan la parte inferior derecha de la ventana, tenemos una pestaña denominada Data Browser, que es una de las dos razones por la que querrán usar este editor. En este panel podemos inspeccionar variables y objetos que tenemos declarados (dependiendo del alcance de la variable eso si). Ténganlo en cuenta a la hora de depurar. La otra razón por la que querrán usarlo es la capacidad de añadir breakpoints, ejecutar paso a paso, y otras muchas cosas a las que estamos acostumbrados de otros entornos de desarrollo. Por defecto, los scripts generados desde el editor de Adobe se guardan dentro de una carpeta llamada “Adobe Scripts”, localizada dentro de la carpeta documentos. No es un mal lugar, y desde el mismo editor podemos guardarlos en cualquier otro sitio.
Cómo ejecutar los scripts
En principio disponemos de tres maneras de ejecutar scripts, cada una con sus ventajas y desventajas:
- Desde el mismo ExtendedScript Toolkit. Desde la barra disponemos de los botones típicos para controlar la ejecución. Os puedo asegurar que esta es la opción más comoda mientras esten desarrollando su script.
- Desde Photoshop, desde el dialogo de selección de script. Esta es una opción un poco más promiscua, ya que os permite probar scripts estén donde estén (ideal para probar scripts recién descargados de Internet):
- Desde Photoshop, desde el menú Scripts. Para que vuestro script aparezca en esta lista, deben copiar el fichero a la carpeta PresetsScripts, dentro de su carpeta de usted de instalación de Photoshop. Tened en cuenta que la versión de 32 y 64 bits tienen carpetas separadas. Esta es la opción idónea para los scripts que son estables y que saben que van a usar muy a menudo. Además, de este modo pueden asignarle un atajo de teclado.
Por otro lado, también existe la posibilidad de grabar una acción que haga uso de un script. No he explorado las posibilidades de esto ni como casan con las tres opciones que os comento aquí. Experimenten un poco y averigüen como funciona.
Primeros pasos
Vamos a hacer algo sencillo, seguramente algo tan sencillo que se podría haber hecho con una acción, pero así nos podemos familiarizar con los elementos base, y a partir de ahí, dejaremos volar nuestra imaginación.
La finalidad del código es guardar una copia de cada uno de los archivos abiertos actualmente, en formato JPEG, reduciéndolos previamente a una altura de 512 pixeles, manteniendo la relación de aspecto. Si el archivo originalmente no tiene esta altura mínima, no se realiza ninguna acción. He separado en funciones algunas parte del código para mejorar la lectura y dejar más claro el flujo del programa, ya que éstas, aunque necesarias, si las incluyera junto al resto del código, nos distraerían un poco del flujo del programa, y siempre es bueno separar por si reutilizamos esas funciones.
var targetHeight = 512;
for (var i = 0; i < app.documents.length; i++) {
var doc = app.documents[i];
app.activeDocument = doc;
var imageWidth = doc.width;
var imageHeight = doc.height;
var imageAspectRatio = doc.width / doc.height;
if( imageHeight > targetHeight ) {
var tWidth = Math.round( imageAspectRatio * targetHeight );
doc.resizeImage( tWidth, targetHeight );
var fileName = getFileName( doc );
fileName.name += "_" + targetHeight;
saveFile( doc, fileName );
}
}
function getFileName( doc ) {
var filePath = doc.path.toString();
var fileName = doc.name.toString();
var lastDot = fileName.lastIndexOf( "." );
if ( lastDot == -1 ) {
lastDot = fileName.length;
}
var fileExtension = fileName.substr( lastDot );
var fileName = fileName.substr( 0, lastDot );
var outputName = filePath + "/" + fileName;
return { name: outputName, extension: fileExtension };
}
function saveFile( doc, fileName ) {
fileName.name += ".jpg";
var jpegOptions = new JPEGSaveOptions();
jpegOptions.quality = 10;
jpegOptions.embedColorProfile = true;
doc.saveAs( File( fileName.name ), jpegOptions, true );
}
Vayamos con el flujo principal del programa. Lo primero que podemos ver es que hacemos uso de una variable que no hemos declarado nosotros, app. Esta variable, que es en realidad un objeto de esos falsos que tiene JavaScipt, hace referencia a la aplicación activa (tened en cuenta que también se puede automatizar de un modo muy similar, Illustrator, After Effects, con lo que app puede ser una referencia a uno de estos programas también). Si utilizan el Data Broswe pueden inspeccionar la multitud de variables que contiene.
Una variable importante dentro de app es documents, que contiene todos los documentos abiertos. Es un array de los de toda la vida. Como queremos tratar todos los archivos abiertos, iteramos con un bucle for, y ya nos sentimos como en casa. En la linea 5 establecemos la variable activeDocument de app al documento actual por el que vamos iterando. El documento activo es el documento visible en Photoshop, y aunque esta asignación no es estrictamente necesaria, algunas funciones solo pueden usarse sobre el documento activo.
Seguidamente extraemos la información de ancho y alto del documento (imagen), calculamos la relación de aspecto, y pasamos a comparar si la imagen en cuestión tiene la altura mínima. En caso positivo, pasamos a redimensionar el fichero, mediante la función resizeImage, pasando como parámetros el alto y el ancho calculado.
Finalmente, para guardar el fichero, vamos a obtener el nombre del fichero, junto con la ruta absoluta, sobre el que estamos trabajando, mediante la función getFileName, y le añadimos un sufijo para indicar la nueva altura del fichero, y llamamos a la función saveAs que nos guardará el fichero en formato JPEG.
En la siguiente vamos a hacer algo un poco más complicado, que no podría resolverse simplemente con acciones, échale un vistazo: Cómo Atomatizar Photoshop a Fondo
excelente aportación para los que estamos relacionados al mundo de la programación y de una u otra manera al campo del diseño gráfico, excelente,,,, en mi caso estoy cursando la carrera de ingenieria informática y hace mucho tiempo hago uno que otro trabajo en photoshop ya que hago serigrafia….
muy buen aporte bendiciones…