Copy link to clipboard
Copied
hi every one
I need help to make ascript that select my spot channel by index then converting its mode to bitmab then copy it and past the new one in the same channel then check the next one and do the same action tell it finshed
i bost a screentshot for the steps thanks
thanks
Copy link to clipboard
Copied
Apart from what has been stated, 300ppi is low for a bitmap halftone.
What halftone settings would be required?
Each channel will require a different angle, historically shifted 15° 30° in offset/litho printing to avoid moiré.
Can you provide the sample file?
Can I presume that this will be required for images with the same number of spot channels but different names and or different numbers of channels?
Copy link to clipboard
Copied
Hello
Copy link to clipboard
Copied
Each channel will require a different angle, historically shifted 15° in offset/litho printing to avoid moiré.
Good point.
In some cases this could even lead to a light color »disappearing« behind a darker one.
@wael mohammedt42523860 , you have been asked to provide a sample file, please do so.
Copy link to clipboard
Copied
Copy link to clipboard
Copied
That’s not what was asked for.
Anyway … you can give this a try.
But as the Channels are grayscale I wonder if the ultimate file fits the output needs.
// 2022, use it at your own risk;
if (app.documents.length > 0) {
var myDocument = app.activeDocument;
var theRes = myDocument.resolution;
var theChannels = myDocument.channels;
for (var m = 3; m < theChannels.length; m++) {
var thisChannel = theChannels[m];
if (thisChannel.kind == "ChannelType.SPOTCOLOR") {
thisChannel.visible = true;
myDocument.activeChannels = [thisChannel];
someStuff(myDocument.name, thisChannel.name, theRes);
}
}
};
////// do stuff //////
function someStuff (docName, theChannelName, theRes) {
var idchannel = stringIDToTypeID( "channel" );
var idselection = stringIDToTypeID( "selection" );
var iddocument = stringIDToTypeID( "document" );
var idto = stringIDToTypeID( "to" );
var idset = stringIDToTypeID( "set" );
var idnull = stringIDToTypeID( "null" );
var idshape = stringIDToTypeID( "shape" );
var idmethod = stringIDToTypeID( "method" );
// =======================================================
var desc33 = new ActionDescriptor();
var ref9 = new ActionReference();
ref9.putProperty( idchannel, idselection );
desc33.putReference( idnull, ref9 );
var ref10 = new ActionReference();
ref10.putEnumerated( idchannel, stringIDToTypeID( "ordinal") , stringIDToTypeID( "targetEnum" ) );
desc33.putReference( idto, ref10 );
executeAction( idset, desc33, DialogModes.NO );
// =======================================================
var desc26 = new ActionDescriptor();
desc26.putClass( stringIDToTypeID( "new" ), iddocument );
var ref8 = new ActionReference();
ref8.putProperty( idchannel, idselection );
desc26.putReference( stringIDToTypeID( "using" ), ref8 );
executeAction( stringIDToTypeID( "make" ), desc26, DialogModes.NO );
// =======================================================
executeAction( stringIDToTypeID( "invert" ), undefined, DialogModes.NO );
// =======================================================
var desc5 = new ActionDescriptor();
var desc6 = new ActionDescriptor();
desc6.putUnitDouble( stringIDToTypeID( "resolution" ), stringIDToTypeID( "densityUnit" ), theRes );
desc6.putEnumerated( idmethod, idmethod, stringIDToTypeID( "halftoneScreen" ) );
desc6.putUnitDouble( stringIDToTypeID( "frequency" ), stringIDToTypeID( "densityUnit" ), 53.000000 );
desc6.putUnitDouble( stringIDToTypeID( "angle" ), stringIDToTypeID( "angleUnit" ), 22.500000 );
desc6.putEnumerated( idshape, idshape, stringIDToTypeID( "round" ) );
desc5.putObject( idto, stringIDToTypeID( "bitmapMode" ), desc6 );
executeAction( stringIDToTypeID( "convertMode" ), desc5, DialogModes.NO );
activeDocument.mode = DocumentMode.GRAYSCALE;
activeDocument.selection.load(activeDocument.channels[0], SelectionType.REPLACE, true);
// =======================================================
var desc19 = new ActionDescriptor();
var ref5 = new ActionReference();
ref5.putName( idchannel, theChannelName );
ref5.putName( iddocument, docName );
desc19.putReference( idnull, ref5 );
var ref6 = new ActionReference();
ref6.putProperty( idchannel, idselection );
desc19.putReference( idto, ref6 );
executeAction( idset, desc19, DialogModes.NO );
activeDocument.close(SaveOptions.DONOTSAVECHANGES)
};
Copy link to clipboard
Copied
Copy link to clipboard
Copied
I was expecting a spot channel PSD from your original request?
Copy link to clipboard
Copied
Copy link to clipboard
Copied
Thank you for the sample image, it really does help others to try to assist you!
Is the attached PSD what you are looking for? It is using a 60 lpi round dot at 45° angle for all channels...
The sample was created using an action automating 8 manual steps per spot channel, selecting each channel one at a time and then running the action.
A script could of course further automate this task.
Here is a JPEG preview of the multi-channel PSD:
Copy link to clipboard
Copied
@wael mohammedt42523860 – try the following script.
It uses hard-coded values for the halftone, which I have placed near the top of the script for "easy access". More code would be required for a GUI to enter the required values.
/*
Contone Spot Channels to Halftone.jsx
v1.0, 23rd July 2022, Stephen Marsh
https://community.adobe.com/t5/photoshop-ecosystem-discussions/select-the-channel-by-index-and-convert-the-mode/td-p/13077384
*/
// Doc variable
var doc = activeDocument;
// Halftone screen LPI variable
var freqValue = 80;
// Halftone screen angle
var angleValue = 22.5;
// Halftone shape
var shapeValue = "round";
// Save the current active channels
var savedChannelState = doc.activeChannels;
// For loop from the late Michael_L_Hale
for (var channelIndex = 0; channelIndex < doc.channels.length; channelIndex++) {
if (activeDocument.channels[channelIndex].kind == "ChannelType.SPOTCOLOR") {
doc.activeChannels = [doc.channels[channelIndex]];
contoneToHalftone();
}
}
// Restore the saved active channels
doc.activeChannels = savedChannelState;
// Loop over channels and set each to visible
for (var i = doc.channels.length - 1; i >= 0; i--) {
doc.channels[i].visible = true;
}
function contoneToHalftone() {
// Set the original doc variable
var origDoc = activeDocument;
// Dupe the active channel to a new doc
var docName = doc.channels[channelIndex].name;
var idmake = stringIDToTypeID("make");
var desc846 = new ActionDescriptor();
var idnew = stringIDToTypeID("new");
var desc847 = new ActionDescriptor();
var idname = stringIDToTypeID("name");
desc847.putString(idname, docName);
var iddocument = stringIDToTypeID("document");
desc846.putObject(idnew, iddocument, desc847);
var idusing = stringIDToTypeID("using");
var ref402 = new ActionReference();
var idchannel = stringIDToTypeID("channel");
var idordinal = stringIDToTypeID("ordinal");
var idtargetEnum = stringIDToTypeID("targetEnum");
ref402.putEnumerated(idchannel, idordinal, idtargetEnum);
desc846.putReference(idusing, ref402);
executeAction(idmake, desc846, DialogModes.NO);
// Convert to grayscale mode
activeDocument.changeMode(ChangeMode.GRAYSCALE);
// Convert to bitmap mode with halftone settings
var idconvertMode = stringIDToTypeID("convertMode");
var desc911 = new ActionDescriptor();
var idto = stringIDToTypeID("to");
var desc912 = new ActionDescriptor();
var idresolution = stringIDToTypeID("resolution");
var iddensityUnit = stringIDToTypeID("densityUnit");
desc912.putUnitDouble(idresolution, iddensityUnit, 300);
var idmethod = stringIDToTypeID("method");
var idmethod = stringIDToTypeID("method");
var idhalftoneScreen = stringIDToTypeID("halftoneScreen");
desc912.putEnumerated(idmethod, idmethod, idhalftoneScreen);
var idfrequency = stringIDToTypeID("frequency");
var iddensityUnit = stringIDToTypeID("densityUnit");
desc912.putUnitDouble(idfrequency, iddensityUnit, freqValue);
var idangle = stringIDToTypeID("angle");
var idangleUnit = stringIDToTypeID("angleUnit");
desc912.putUnitDouble(idangle, idangleUnit, angleValue);
var idshape = stringIDToTypeID("shape");
var idshape = stringIDToTypeID("shape");
var idround = stringIDToTypeID(shapeValue);
desc912.putEnumerated(idshape, idshape, idround);
var idbitmapMode = stringIDToTypeID("bitmapMode");
desc911.putObject(idto, idbitmapMode, desc912);
executeAction(idconvertMode, desc911, DialogModes.NO);
// Convert to grayscale mode
activeDocument.changeMode(ChangeMode.GRAYSCALE);
// Set the temp doc variable
var tempDoc = activeDocument;
// Return to the original document
activeDocument = origDoc;
// Apply image temp doc to active channel
var idapplyImageEvent = stringIDToTypeID("applyImageEvent");
var desc1208 = new ActionDescriptor();
var idwith = stringIDToTypeID("with");
var desc1209 = new ActionDescriptor();
var idto = stringIDToTypeID("to");
var ref519 = new ActionReference();
var idchannel = stringIDToTypeID("channel");
var idordinal = stringIDToTypeID("ordinal");
var idtargetEnum = stringIDToTypeID("targetEnum");
ref519.putEnumerated(idchannel, idordinal, idtargetEnum);
var idlayer = stringIDToTypeID("layer");
var idbackground = stringIDToTypeID("background");
ref519.putProperty(idlayer, idbackground);
var iddocument = stringIDToTypeID("document");
ref519.putName(iddocument, docName);
desc1209.putReference(idto, ref519);
var idpreserveTransparency = stringIDToTypeID("preserveTransparency");
desc1209.putBoolean(idpreserveTransparency, true);
var idcalculation = stringIDToTypeID("calculation");
desc1208.putObject(idwith, idcalculation, desc1209);
executeAction(idapplyImageEvent, desc1208, DialogModes.NO);
// Close the temp doc
tempDoc.close(SaveOptions.DONOTSAVECHANGES);
}
I am not well versed in screen printing, so I still have the following concerns:
* Is it OK to use the same screen angle for all channels? The default would usually be 45° in offset printing (is 22.5° a screenprint thing, perhaps to avoid moiré with the screen?).
* 300ppi resolution is low, a well-formed digital halftone may require a greater PPI value (600, 1200).
Copy link to clipboard
Copied
thank you so much
Copy link to clipboard
Copied
@wael mohammedt42523860 wrote:
thank you so much
You're welcome.
Is there any feedback, comment, does this do what you want etc?