2010-11-15 6 views
2

J'ai quelques tranches dans mon document photoshop.Obtenir les paramètres de tranches dans photoshop

Comment puis-je obtenir leurs paramètres (largeur, hauteur, décalage x, décalage y, nom, url, ...) via javascript> scripting dans photoshop?

+0

Vous pouvez essayer d'utiliser http://photo.stackexchange.com/ - son site stackexchange sur les photos. – IAdapter

Répondre

0

Utilisez l'outil de sélection de tranche dans le jeu d'outils Rogner et couper. Vous pouvez le sélectionner manuellement en le choisissant dans votre barre d'outils ou, en survolant une tranche que vous avez créée, il apparaîtra automatiquement pour vous.

Il est également activé en maintenant la touche CMD enfoncée (Ctrl dans Windows) lorsque vous passez la souris sur une tranche créée précédemment. Puis double-cliquez sur la tranche et une fenêtre de dialogue s'ouvrira pour vous donner toutes les informations nécessaires pour cette tranche.

Joyeux coupage!

+0

Merci pour la réponse, mais ce n'est pas ce que je demandais. Je voulais écrire un script qui pourrait automatiquement exporter des setteings en tranches dans un fichier CSS. Mais comme je l'ai découvert plus tard, dans PS il n'y a pas grand-chose que je puisse faire à ce sujet et je devrais utiliser des techniques spéciales. Et j'ai déjà écrit un script/une commande pour exporter des données de tranches dans Fireworks, où cela pourrait être fait plus facilement. – SublimeYe

+0

Ah oui ... clarifiez votre question un peu la prochaine fois peut-être. Pensé que c'était un peu une question élémentaire pour SO lol. Il n'y a aucune raison de le faire dans PS .. c'est ce que FW est pour. – kettultim

2

@SublimeYe, j'ai aussi la même quête, et à ce jour, aucune solution n'est disponible. Adobe Scripting en javascript n'a aucun moyen de voir dans le modèle d'application pour accéder aux tranches. Ainsi, après quelques recherches, la meilleure solution que j'ai trouvée m'a été présentée par Trevor Morris (http://morris-photographics.com/photoshop/scripts/index.html). Nous avons payé à Trevor 500 $ + pour écrire un script qui utilise un groupe de calques de "tranches" et pour chaque calque, il y a un calque de forme correspondant. Le javascript peut voir des groupes, des calques et des calques de forme afin que le script puisse recadrer et enregistrer pour le Web bien. L'inconvénient est que vous ne pouvez pas utiliser l'outil de découpage, donc l'adoption de ce script a été minime de notre équipe de conception. Après avoir encore ce problème depuis des années, j'ai récemment essayé de chercher à nouveau ce forum adobe http://feedback.photoshop.com/photoshop_family/topics/slice_compositions_that_work_like_layer_compositions et un lien vers cet outil SliceMaster par Enzo http://www.electriciris.com/slicemaster.html. Cet outil permet plusieurs tranches par document qui sont stockées en tant que groupes de tranches dans des couches. Ma quête est maintenant d'automatiser les compilations de calques avec les ensembles de tranches de calques, ce qui, je pense, est très similaire à la vôtre. J'ai une question à faire à Enzo pour voir s'il peut écrire ou projette d'écrire cette automatisation.

Je pense que la seule façon d'obtenir ce que vous voulez faire est d'utiliser un plugin Adobe Photoshop SDK qui est écrit en code C++, pas un script en javascript. Je viens de télécharger le SDK et je jette un coup d'œil aux codes C++ pour voir si une solution peut être faite.

Cependant, j'espère que Enzo pourra faire la solution puisqu'il est déjà développeur Photoshop SDK ... restez à l'écoute!

1

Après mes recherches pour les temps. J'ai trouvé un moyen facile d'obtenir les informations de tranche par script.

Comme vous le savez, il n'y a aucun moyen direct d'accéder à une tranche en tant que sélection. Mais quand vous découpez une zone en ps, elle distribue un événement! Donc, vous pouvez ajouter un écouteur d'événement à cet événement, un gestionnaire d'événement dans le gestionnaire d'événements, vous pouvez obtenir le ActionDescriptor, et quand vous obtenez ActionDescriptor, vous obtenez tout!

Si vous avez installer de scripts, vous pouvez trouver le ActionDescriptor comme ci-dessous:

var idMk = charIDToTypeID("Mk "); 
var desc2 = new ActionDescriptor(); 
var idnull = charIDToTypeID("null"); 
    var ref1 = new ActionReference(); 
    var idslice = stringIDToTypeID("slice"); 
    ref1.putClass(idslice); 
desc2.putReference(idnull, ref1); 
var idUsng = charIDToTypeID("Usng"); 
    var desc3 = new ActionDescriptor(); 
    var idType = charIDToTypeID("Type"); 
    var idsliceType = stringIDToTypeID("sliceType"); 
    var iduser = stringIDToTypeID("user"); 
    desc3.putEnumerated(idType, idsliceType, iduser); 
    var idAt = charIDToTypeID("At "); 
     var desc4 = new ActionDescriptor(); 
     var idTop = charIDToTypeID("Top "); 
     var idPxl = charIDToTypeID("#Pxl"); 
     desc4.putUnitDouble(idTop, idPxl, 83.000000); 
     var idLeft = charIDToTypeID("Left"); 
     var idPxl = charIDToTypeID("#Pxl"); 
     desc4.putUnitDouble(idLeft, idPxl, 229.000000); 
     var idBtom = charIDToTypeID("Btom"); 
     var idPxl = charIDToTypeID("#Pxl"); 
     desc4.putUnitDouble(idBtom, idPxl, 144.000000); 
     var idRght = charIDToTypeID("Rght"); 
     var idPxl = charIDToTypeID("#Pxl"); 
     desc4.putUnitDouble(idRght, idPxl, 327.000000); 
    var idRctn = charIDToTypeID("Rctn"); 
    desc3.putObject(idAt, idRctn, desc4); 
var idslice = stringIDToTypeID("slice"); 
desc2.putObject(idUsng, idslice, desc3); 
executeAction(idMk, desc2, DialogModes.NO); 

Donc, si nous pouvions obtenir ce ActionDescriptor, nous pourrions obtenir l'infomation rectangle!

Maintenant, nous commençons par l'ajout d'un écouteur d'événement (ici j'utilise ExtendScript, également disponible en javascript)

private const MK_INT:int = Photoshop.app.charIDToTypeID("Mk "); // event name 
CSXSInterface.instance.evalScript("PhotoshopRegisterEvent", MK_INT); // add event listener 
ExternalInterface.addCallback("PhotoshopCallback" + CSXSInterface.getInstance().getExtensionId(), myPhotoshopCallback); // event handler 

alors que nous faisons dans le gestionnaire d'événements:

private function myPhotoshopCallback(eventID:Number, descID:Number):void { 
var desc2:ActionDescriptor = new ActionDescriptor(); 
    desc2.fromID(descID); 
    // there ! we got the ActionDescriptor! 
    // now we need to filter the event 
    if (eventID == MK_INT) { 
     var idUsng:Number = Photoshop.app.charIDToTypeID("Usng"); 
    var classID:Number = desc2.getObjectType(idUsng); 
    if (classID == Photoshop.app.stringIDToTypeID("slice")) { 
    var desc3:ActionDescriptor = desc2.getObjectValue(idUsng); 
    var idAt:Number = Photoshop.app.charIDToTypeID("At "); 
    var idRctn:Number = Photoshop.app.charIDToTypeID("Rctn"); 
    if (idRctn == desc3.getObjectType(idAt)) { 
     var desc4:ActionDescriptor = desc3.getObjectValue(idAt); 
     var idTop:Number = Photoshop.app.charIDToTypeID("Top "); 
     var idLeft:Number = Photoshop.app.charIDToTypeID("Left"); 
     var idBtom:Number = Photoshop.app.charIDToTypeID("Btom"); 
     var idRght:Number = Photoshop.app.charIDToTypeID("Rght"); 
     trace("top: " + desc4.getUnitDoubleValue(idTop)); 
     trace("left: " + desc4.getUnitDoubleValue(idLeft)); 
     trace("bottom: " + desc4.getUnitDoubleValue(idBtom)); 
     trace("right: " + desc4.getUnitDoubleValue(idRght)); 
    } 

    } 
    } 
} 

Comme vous pouvez le voir, nous obtenons l'ActionDescriptor, nous pourrions obtenir n'importe quelle information le Descripteur! J'ai essayé et travaillé!

+0

Aurais-je besoin que le script soit en cours d'exécution pendant que l'utilisateur crée des tranches? Je veux obtenir l'information de la tranche, mais pas avant qu'ils aient fait leurs tranches. Dites l'utilisateur fait 3 tranches, puis ils exécutent le script, puis je connais les dimensions des tranches. – jkupczak

0

J'ai aussi été dans cette quête pendant des années. J'ai finalement créé une solution presque parfaite. Le seul inconvénient est qu'il nécessite l'ouverture de votre PSD dans Fireworks. Un peu boiteux, je sais. Serait mieux de simplement les sauver de photoshop mais je ne crois pas que ce soit possible. Prenez le code et enregistrez-le dans un fichier .jsf. Ensuite, ouvrez votre PSD avec des tranches de feux d'artifice. Allez dans Commandes> Exécuter le script ... et sélectionnez votre fichier .jsf. Il devrait enregistrer toutes vos informations de tranche dans un fichier texte dans le dossier que vous sélectionnez. J'espère que cela aide quelqu'un.

var curDoc = fw.getDocumentDOM(); 
var slices = curDoc.layers[curDoc.layers.length-1].elems; 
var result = ""; 
for (curSliceNum = slices.length-1; curSliceNum >= 0; curSliceNum--) { 
     var slice = slices[curSliceNum] 
     result += slice.baseName + "\r\n"; 
     result += "W: "+slice.width+", H: "+slice.height + "\r\n"; 
     result += "X: "+slice.pixelRect.left+", Y: "+slice.pixelRect.top + "\r\n"; 
     result += "---------------------------\r\n"; 
} 

// Saves text to the specified file 
function saveText(fileURL, text){ 

    // Delete any existing file with the same name. If 
    // you do not, and then open the file for rewriting, 
    // saved text will be written over the existing file 
    // which could leave remnants of the old file behind 
    if (Files.deleteFileIfExisting(fileURL)){ 

     // Create a new file to write in. Note: 
     // this is only required for Macs; Windows 
     // will create a file with the call to open() 
     if (Files.createFile(fileURL, ".txt", "TEXT")){ 

      // Open the file for writing. If successful, this 
      // will return a reference to the file so that 
      // text can be added to it using the write() 
      // command. 
      var fileReference = Files.open(fileURL, true); 
      if (fileReference){ 

       // Write the text to the opened file 
       fileReference.write(text); 

       // When finished, be sure to close the 
       // file using the close() command so other 
       // processes will be able to access it 
       fileReference.close(); 

       // Returning true signals a successful save 
       return true; 
      } 
     } 
    } 

    // Returning false signals a failed save 
    return false; 
} 

var fileForSave = fw.browseForFolderURL(); 
saveText(fileForSave+"/coords.txt", result); 
Questions connexes