फ़ोटोशॉप और एक्सटेंडस्क्रिप्ट टूलकिट के साथ प्रसंस्करण छवियाँ

अक्सर हमें चित्रों के झुंड के साथ कुछ करने की आवश्यकता होती है। इसे प्राप्त करने के कई तरीके हैं:कटौती के तहत उत्तरार्द्ध विधि के पेशेवरों और विपक्षों पर विचार किया जाएगा। एक बोनस के रूप में, आइए हम अनजाने फ़ोटोशॉप एपीआई को देखें।

हमें आवश्यकता होगी

सिद्धांत


फ़ोटोशॉप में एक COM एपीआई है जो फ़ोटोशॉप के कई कार्यों को कवर करता है। बेशक, यह जेएस या वीबीएस लिपियों से उपयोग किया जा सकता है। Adobe कृपया अपने IDE के साथ स्वतः पूर्ण और विराम बिंदु के साथ डेवलपर्स प्रदान करता है। इसमें समर्थित भाषाएं JScript, VBScript (Win) और AppleScript (Mac) हैं। मैं JScript पर बस गया, क्योंकि ज्यादातर लोग इसे सबसे अच्छा समझेंगे।

आईडीई


उसका नाम एक्सटेंडस्क्रिप्ट टूलकिट है। यहाँ यह है: एक्स्टेंडस्क्रिप्ट टूलकिट
मुझे उससे क्या मिला:स्क्रिप्ट को jsx प्रारूप में सहेजा जा सकता है, जब आप इसे खोलते हैं, तो आप प्रश्न देखेंगे: "स्क्रिप्ट चलाएं या संपादित करें?"।
यह अच्छा है कि jsx संकलित किया जा सकता है (फ़ाइल → बाइनरी के रूप में निर्यात), और jsxbin एक्सटेंशन वाली फ़ाइल बनाई जाएगी। इसकी सामग्री कुछ इस प्रकार होगी:
@JSXBIN@ES@2.0@MyBbyBnAIMVbyBn0AHJWn
सुविधाजनक, खासकर यदि आपको ऑर्डर के लिए फ़ोटोशॉप के लिए एक स्क्रिप्ट लिखने की आवश्यकता है और स्रोत नहीं देना चाहते हैं। मैंने इसे विघटित करने की संभावना के बारे में विस्तार से नहीं समझा, लेकिन मुझे लगता है कि यह चर बदलता है और फिर भी कुछ अनुकूलन करता है।
तो, पहली नज़र में आईडीई असहज है, लेकिन लगभग 30 मिनट तक इसमें काम करने के बाद, आपको इसकी आदत हो जाती है।

स्क्रिप्टिंग भाषा


यह वाक्यांश के साथ शुरू होता है
#target photoshop
यह एडोब लाइब्रेरीज़ के साथ नियमित जावास्क्रिप्ट है।
फ़ाइल सिस्टम के साथ काम करने के लिए उपकरण हैं, सॉकेट, प्रतिबिंब, एक्सएमएल के लिए समर्थन। क्लास ऑब्जेक्ट है।
फ़ोटोशॉप से ​​कनेक्ट करने के लिए, एक वैश्विक ऐप ऑब्जेक्ट है, ActiveXObject को करने की आवश्यकता नहीं है। इसमें सक्रिय दस्तावेज़ app.activeDocumet है। चेतावनी फ़ंक्शन फ़ोटोशॉप में एक संदेश प्रदर्शित करता है।
जब त्रुटि दुर्घटनाग्रस्त हो जाती है, तो कुछ भी नहीं होता है, स्क्रिप्ट चुपचाप निष्पादन बंद कर देती है, जैसे कि कोई भी नहीं था।
मुझे पसंद आया कि कैसे माप (px, pt, cm, mm) एक दूसरे में परिवर्तित होते हैं:
app.activeDocument.width. as ( "px" );
क्योंकि ExtendScript क्रॉस-प्लेटफ़ॉर्म है, फ़ाइल पथों को / d / Temp / ... के रूप में दर्शाया जाता है

जीवित उदाहरण


कार्य: फ़ोल्डर में 100 फाइलें हैं। यह उन प्रत्येक लोगो में एम्बेड करना आवश्यक है जो PSD फ़ाइल में हैं।
लोगो उदाहरण:
लोगो उदाहरण
और यहाँ स्क्रिप्ट है:
#target photoshop
app.bringToFront(); // Photoshop. , , .
var Constants = { /* - */ }
ProcessDir(Constants.InputDir, Constants.OutputDir);
function ProcessDir(dir, outDir) {
var folder = Folder(dir); // Adobe-
var files = folder.getFiles(Constants.FileMask); // , (*.jpg,*.png) .
var outFolder = Folder(outDir);
if (!outFolder.exists) {
if (!outFolder.create()) {
alert( "Cannot create output folder" );
return ; //
}
}
var totalFiles = 0;
for ( var fileNum in files) {
var outFile = GetOutputFileName(files[fileNum], outFolder.fullName); //
AddLogoToFile(files[fileNum], outFile); // ,
totalFiles++;
}
alert(totalFiles + " files processed" ); // Photoshop-
}
function AddLogoToFile(file, outputFile) {
var photoFile = File(file); // , open
var logoFile = File(Constants.AddLogo.LogoPath);

app.open(logoFile); //
app.activeDocument.artLayers[ "Text" ].copy(); // ArtLayers – . "Text"
var logoWidth = app.activeDocument.width. as ( "px" );
var logoHeight = app.activeDocument.height. as ( "px" );
app.activeDocument.close();

app.open(photoFile); //

var width = app.activeDocument.width. as ( "px" );
var height = app.activeDocument.height. as ( "px" );

var logoLayer = app.activeDocument.artLayers.add(); // ,
logoLayer.name = "Logo" ; //

app.activeDocument.paste(); // clipboard

var shape = [ // Photoshop ; ,
[(width - logoWidth) / 2, (height - logoHeight) / 2],
[(width - logoWidth) / 2, (height + logoHeight) / 2],
[(width + logoWidth) / 2, (height + logoHeight) / 2],
[(width + logoWidth) / 2, (height - logoHeight) / 2]
];
app.activeDocument.selection.select(shape);

app.activeDocument.selection.translate( // selection
new UnitValue((width - logoWidth)/ 2, "px" ),
new UnitValue((height - logoHeight) / 2, "px" ));

var minImageDimension = Math.min(width, height); // , 5
var logoScaleMultiplier = minImageDimension / 5 / logoWidth * 100;
app.activeDocument.selection.resize(logoScaleMultiplier, logoScaleMultiplier, AnchorPosition.BOTTOMRIGHT); //

app.activeDocument.selection.deselect();

app.activeDocument.artLayers[ "Logo" ].opacity = 75; //
app.activeDocument.artLayers[ "Logo" ].blendMode = BlendMode.LUMINOSITY; // ,
// blending options! .
SaveFile(outputFile); //
}

function SaveFile(outputFile) {
var isPng = /png$/i.test(outputFile);
var saveOptions;
if (isPng) {
saveOptions = new PNGSaveOptions();
} else {
saveOptions = new JPEGSaveOptions(); /* */
}
app.activeDocument.saveAs(File(outputFile), saveOptions, true , Extension.LOWERCASE)
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES); //
}
स्क्रिप्ट तैयार है। यह PSD प्रारूप में लोगो बनाने के लिए बना हुआ है - जैसे कि अंदर एक पाठ परत थी जिस पर लोगो को रखा जाना चाहिए।
क्या होता है इसका एक उदाहरण:
लोगो फोटो
स्क्रिप्ट पूरी तरह से पास्टबिन पर रखी गई है।

ओह दुखद


फ़ोटोशॉप में सबसे स्वादिष्ट चीज सम्मिश्रण विकल्प है! और एपीआई में कोई नहीं हैं। CopyLayerStyle है, लेकिन यह GUI से भी सही तरीके से काम नहीं करता है (आप इसे ड्रॉप शैडो के साथ खेलकर जांच सकते हैं)। इसलिए, निश्चित रूप से, हम लोगो को सम्मिलित कर सकते हैं, लेकिन परिणाम बहुत ही ImageMagick से अधिक नहीं होगा।
UPD: स्क्रिप्ट से शैलियों को जल्दी और आसानी से लागू करने के दो तरीके हैं:

अनिर्दिष्ट एपीआई के बारे में थोड़ा


डॉक पढ़ने के बाद (आप उन्हें% में पा सकते हैं ProgramFiles% Adobe \ Adobe Photoshop CS5 \ Scripting \ Documents \), हमें पता चला कि फ़ोटोशॉप उपयोगकर्ता कार्यों को रिकॉर्ड कर सकता है। ऐसा करने के लिए:
  1. "ProgramListener.8li" फ़ाइल को% ProgramFiles% Adobe \ Adobe Photoshop CS5 \ Scripting \ Utilities से कॉपी करें।% ProgramFiles% Adobe \ Adobe फ़ोटोशॉप CS5 \ प्लग-इन \ स्वचालित करें
  2. (पुनः) फोटोशॉप चलाएं
  3. उस क्रिया को करें जिसके बारे में आप जानना चाहते हैं
  4. अपने डेस्कटॉप पर ScriptListener.jsx और ScriptListener.vbs खोजें
  5. ScriptListener.8li को हटाना न भूलें (यह फ़ोटोशॉप को धीमा कर देता है)
हम जिस चीज़ की प्रतीक्षा कर रहे थे उसका कोड पाने की उम्मीद करते हुए, हम Desktop से ScriptListener.jsx खोलते हैं। और यहाँ एक आश्चर्य हमें इंतजार कर रहा है: यहाँ फ़ाइल में इस तरह के एक गैर-प्रयोग करने योग्य कचरा है:
var idsetd = charIDToTypeID( "setd" );
var desc15 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref6 = new ActionReference();
var idPrpr = charIDToTypeID( "Prpr" );
var idLefx = charIDToTypeID( "Lefx" );
ref6.putProperty( idPrpr, idLefx );
var idLyr = charIDToTypeID( "Lyr " );
var idOrdn = charIDToTypeID( "Ordn" );
var idTrgt = charIDToTypeID( "Trgt" );
ref6.putEnumerated( idLyr, idOrdn, idTrgt );
desc15.putReference( idnull, ref6 );
var idT = charIDToTypeID( "T " );
var desc16 = new ActionDescriptor();
var idScl = charIDToTypeID( "Scl " );
var idPrc = charIDToTypeID( "#Prc" );
desc16.putUnitDouble( idScl, idPrc, 100.000000 );
var idDrSh = charIDToTypeID( "DrSh" );
var desc17 = new ActionDescriptor();
var idenab = charIDToTypeID( "enab" );
desc17.putBoolean( idenab, true );
var idMd = charIDToTypeID( "Md " );
var idBlnM = charIDToTypeID( "BlnM" );
var idMltp = charIDToTypeID( "Mltp" );
desc17.putEnumerated( idMd, idBlnM, idMltp );
var idClr = charIDToTypeID( "Clr " );
var desc18 = new ActionDescriptor();
var idRd = charIDToTypeID( "Rd " );
desc18.putDouble( idRd, 0.000000 );
var idGrn = charIDToTypeID( "Grn " );
desc18.putDouble( idGrn, 0.000000 );
var idBl = charIDToTypeID( "Bl " );
desc18.putDouble( idBl, 0.000000 );
var idRGBC = charIDToTypeID( "RGBC" );
desc17.putObject( idClr, idRGBC, desc18 );
var idOpct = charIDToTypeID( "Opct" );
var idPrc = charIDToTypeID( "#Prc" );
desc17.putUnitDouble( idOpct, idPrc, 75.000000 );
var iduglg = charIDToTypeID( "uglg" );
desc17.putBoolean( iduglg, true );
var idlagl = charIDToTypeID( "lagl" );
var idAng = charIDToTypeID( "#Ang" );
desc17.putUnitDouble( idlagl, idAng, 120.000000 );
var idDstn = charIDToTypeID( "Dstn" );
var idPxl = charIDToTypeID( "#Pxl" );
desc17.putUnitDouble( idDstn, idPxl, 5.000000 );
var idCkmt = charIDToTypeID( "Ckmt" );
var idPxl = charIDToTypeID( "#Pxl" );
desc17.putUnitDouble( idCkmt, idPxl, 0.000000 );
var idblur = charIDToTypeID( "blur" );
var idPxl = charIDToTypeID( "#Pxl" );
desc17.putUnitDouble( idblur, idPxl, 5.000000 );
var idNose = charIDToTypeID( "Nose" );
var idPrc = charIDToTypeID( "#Prc" );
desc17.putUnitDouble( idNose, idPrc, 0.000000 );
var idAntA = charIDToTypeID( "AntA" );
desc17.putBoolean( idAntA, false );
var idTrnS = charIDToTypeID( "TrnS" );
var desc19 = new ActionDescriptor();
var idNm = charIDToTypeID( "Nm " );
desc19.putString( idNm, "Linear" );
var idShpC = charIDToTypeID( "ShpC" );
desc17.putObject( idTrnS, idShpC, desc19 );
var idlayerConceals = stringIDToTypeID( "layerConceals" );
desc17.putBoolean( idlayerConceals, true );
var idDrSh = charIDToTypeID( "DrSh" );
desc16.putObject( idDrSh, idDrSh, desc17 );
var idLefx = charIDToTypeID( "Lefx" );
desc15.putObject( idT, idLefx, desc16 );
executeAction( idsetd, desc15, DialogModes.NO );
आपको क्या लगता है कि यह कोड क्या करता है? यह परत में एक ड्रॉप शैडो जोड़ता है, जैसा कि आप "DrSh" नाम से देख सकते हैं। मुझे संदेह है कि फ़ोटोशॉप के अंदर जीयूआई में नियंत्रण वास्तव में कहा जाता है।
लेकिन इस कोड को निष्पादित करने से, हम पाते हैं कि यह काम करता है।
आप पा सकते हैं कि निष्पादित करेंउपयोगकर्ता दोनों उपयोगकर्ता को संवाद दिखा सकता है और चुपचाप अपना काम कर सकता है (यह अंतिम पैरामीटर निर्धारित करता है)। ID-shniki स्वयं कहीं भी वर्णित नहीं है, हम केवल उनके बारे में अनुमान लगा सकते हैं (साथ ही CS6 में उनके साथ क्या होगा)।
फिर भी, लॉगिंग क्रियाओं की विशेषता काफी दिलचस्प है, अगर आपको वास्तव में इसकी आवश्यकता है, तो आप जल्दी से अपने लिए एक स्क्रिप्ट अपलोड कर सकते हैं।

अधिक स्क्रिप्ट


उसी समय, मैंने ये कार्य लिखे:यदि आप रुचि रखते हैं, तो आप उन्हें पास्टबिन पर उसी स्क्रिप्ट में देख सकते हैं।

रोचक तथ्य

निष्कर्ष


एपीआई स्वादिष्ट, स्वादिष्ट है। लेकिन सम्मिश्रण विकल्पों के लिए समर्थन की कमी बहुत निराशाजनक है; यदि आपको उनकी आवश्यकता है - इस तथ्य के लिए तैयार रहें कि आपको डरावने कोड के साथ गड़बड़ करना है। यदि आप सभी की जरूरत है (जो ज्यादातर मामलों में बैच प्रसंस्करण से आवश्यक है) तस्वीर को फ्रेम करना है, मुझे लगता है कि इस मामले में ImageMagick तेज और बहुत अधिक सुविधाजनक होगा।

+ / -

प्लस फिल्टर, हिस्टोग्राम
प्लस रॉ
प्लस फ़ोटो प्रोफाइल, जैसा कि फ़ोटोशॉप में है
प्लस जावास्क्रिप्ट एक सुविधाजनक भाषा है जो लगभग सभी के लिए समझ में आती है
प्लस उदाहरण के साथ प्रलेखन
ऋण सम्मिश्रण विकल्पों की कमी
ऋण फ़ोटोशॉप को काम करने की जरूरत है * * अचानक * /
ऋण काफी धीरे-धीरे काम करता है

आदर


एडोब फोटोशॉप स्क्रिप्टिंग - आधिकारिक संसाधन
फ़ोटोशॉपिंग स्क्रिप्टिंग - फ़ोटोशॉप में स्क्रैपिंग पर एक छोटा लेकिन उपयोगी ट्यूटोरियल
PS-Scripts - फोटोशॉप के लिए स्क्रिप्ट के बारे में एक मंच

सोचने के लिए


एक अभ्यास के रूप में, हम एक स्क्रिप्ट का प्रस्ताव रखते हैं जो वास्तव में काम में आ सकती है: सुनिश्चित करें कि फोटो पर लोगो को उसी रंग योजना में जोड़ा गया है जैसे कि फोटो - उदाहरण के लिए, नीले या पीले रंग के लिए पीले रंग का फोटो: यह लोगो को फोटो के समग्र रंग और मूड को खराब नहीं करेगा। । लोगो को रंग के साथ विलय नहीं करना चाहिए, अर्थात। नीले रंग पर नीला मत बनो। इसके अलावा, यह शांत होगा यदि लोगो घास की तरह सतह पर नहीं है, तो आप इसे दूसरे कोने या फिर से स्थानांतरित करने का प्रयास कर सकते हैं।

Source: https://habr.com/ru/post/In112907/


All Articles