Skip to main content
bebez71
Known Participant
August 2, 2021
Question

Cut the same image multiple times with batch

  • August 2, 2021
  • 1 reply
  • 3654 views

Hi, I have a problem with a batch in Photoshop, I have been looking around for a while, but I have not found a real solution.

 

I have to cut images into several parts. From a single image I have to get two or four by cutting them in half or cross.

I made an action and if I manually activate it, it works fine (I set a stop at each save and manually put a different name each time to the file I save, 01, 02 etc ..).

However, if I automate the action with the batch by giving a source folder, a destination folder and activating "Ignore Save As commands", setting the saving with only two-digit serial number and extension, in the end I only get 4 files instead of 8 (choosing the action that cuts the image in half).

 

  

I also tried to create two distinct actions (one for the upper half and one for the lower half) and to use Image Processo Pro, but also in this case I get 4 files instead of 8.

   

What I would like to obtain is an automated action / batch that in one shot (possibly without closing and reopening the original image, because each file I have to cut is about 1GB) creates and saves two or four portions from a single image.

 

At the following link a zip with the actions and 4 small images to be cut in half (as an example)

Archivio-test.zip

This topic has been closed for replies.

1 reply

bebez71
bebez71Author
Known Participant
August 2, 2021

Maybe I understand where I'm wrong.
In the action I have to put only the cutting of the image, without the action of saving and closing it, then Image processor Pro will take care of saving inside the various sets folder and closing the image.
Right?

JJMack
Community Expert
Community Expert
August 2, 2021

First of all if you want to batch an action the action  should not have any interactive steps. Batch should be a fully automated process.

 

Second if you want to have multiple image files saved out. You need to realize that Actions have limited saving capabilities. They can only save the current document. If the want to batch the action no file name should be recorded in the Save As step. So Photoshop will use the current document File Name its default operation.  Therefor you need to save each output image file into a different folder for they will have the same file names.

 

Third in you action set I saw no actions that cut images into parts and save each part as an image file.

 

 

So I create a CutUpImage action set and recorded a batch action the  doe the Top Button cutup. Output image file will be save o sub folders "Top" and "Bottom" in a folder name "ImageSave" which is on your desktop.  You need to create thees folders before you use the action.

 

CutUpImage.atn  I use Photoshop's 22.4.3 "Enable legacy "Save As"" preference for Photoshop 22.4.2  "Save As" brakes too many actions.

 

 

JJMack
JJMack
Community Expert
Community Expert
August 4, 2021

For now I will use the method I found with "Actions + Image Processor Pro" because it easily achieves the goal.
Yours is a great method in case I need something different.

Thanks again for the answers.


The image processor pro is the way to do it with simple crop actions.  The Image Processor  Pro Script did not always exists. Adobe Image Processor script can only save three different image for each image file processed  So we needed to record complex batachable actions to cut up Images. 

 

In 2015 c.pfaffenbichler posted a script the can cut up an image using guidelines  you set. So it is easy record an interactive action to use menu view new guideline layouts. Dice up and image for the layout with a script step then delete the the backgrounds layer align all layer to the top left trim the user export layers to files.  Image Processor pro is limited to 10 output file. What it  you want 16 a 4x4 cutout...

 

// Dice layer with according to guides;
// 2015, use it at your own risk;
#target photoshop

if (app.documents.length > 0) {
	var myDocument = app.activeDocument;
	var myResolution = myDocument.resolution;
	var theLayer = myDocument.activeLayer;
	var layerID = getLayerId(theLayer);
	var originalRulerUnits = app.preferences.rulerUnits;
	app.preferences.rulerUnits = Units.POINTS;
	// check guides;
	var theVer = new Array;
	var theHor = new Array;
	var theNumber = myDocument.guides.length;
	for (var m = 0; m < theNumber; m++) {
		if (myDocument.guides[m].direction == Direction.HORIZONTAL) {theHor.push(myDocument.guides[m].coordinate)};
		if (myDocument.guides[m].direction == Direction.VERTICAL) {theVer.push(myDocument.guides[m].coordinate)};
	};
	// sort and add beginning and end;
	theHor = treatGuideArray (theHor, app.activeDocument.height);
	theVer = treatGuideArray (theVer, app.activeDocument.width);
	$.writeln(theHor.join("\n")+"\n\n\n"+theVer.join("\n"));
	// create selections;
	for (var y = 0; y < theHor.length - 1; y++) {
		var Y1 = theHor[y];
		var Y2 = theHor[y+1];
		for (var x = 0; x < theVer.length - 1; x++) {
			try {
				var X1 = theVer[x];
				var X2 = theVer[x+1];
				rectangularSelection([Y1, X1, Y2, X2], false);
				// layer via copy;
				var id14 = charIDToTypeID( "CpTL" );
				executeAction( id14, undefined, DialogModes.NO );
				// add mask;
				intersectedLayerMask (layerID)
			} catch (e) {};
		// reselct layer;
		myDocument.activeLayer = theLayer;
		};
	};
	activeDocument.selection.deselect();
	// reset the ruler units;
	app.preferences.rulerUnits = originalRulerUnits
};
////////////////// the functions //////////////////
////// treat array //////
function treatGuideArray (theArray, theExtreme) {
	theArray.sort(function(a,b){return a - b});
	if (Number (theArray[theArray.length - 1]) != theExtreme) {theArray.push(theExtreme)};
	if (Number (theArray[0]) != 0) {theArray.unshift(new UnitValue(0, "pt"))};
	theArray.sort(function(a,b){return a - b});
	return theArray;
};
////// rectangular selection //////
function rectangularSelection (theBounds, add) {
	// =======================================================
	if (add == false ||  add == undefined) {var idsetd = charIDToTypeID( "setd" )}
	else {var idsetd = charIDToTypeID( "AddT" )};
		var desc55 = new ActionDescriptor();
		var idnull = charIDToTypeID( "null" );
			var ref11 = new ActionReference();
			var idChnl = charIDToTypeID( "Chnl" );
			var idfsel = charIDToTypeID( "fsel" );
			ref11.putProperty( idChnl, idfsel );
		desc55.putReference( idnull, ref11 );
		var idT = charIDToTypeID( "T   " );
			var desc56 = new ActionDescriptor();
			var idTop = charIDToTypeID( "Top " );
			var idRlt = charIDToTypeID( "#Rlt" );
			desc56.putUnitDouble( idTop, idRlt, theBounds[0] );
			var idLeft = charIDToTypeID( "Left" );
			var idRlt = charIDToTypeID( "#Rlt" );
			desc56.putUnitDouble( idLeft, idRlt, theBounds[1] );
			var idBtom = charIDToTypeID( "Btom" );
			var idRlt = charIDToTypeID( "#Rlt" );
			desc56.putUnitDouble( idBtom, idRlt, theBounds[2] );
			var idRght = charIDToTypeID( "Rght" );
			var idRlt = charIDToTypeID( "#Rlt" );
			desc56.putUnitDouble( idRght, idRlt, theBounds[3] );
		var idRctn = charIDToTypeID( "Rctn" );
		desc55.putObject( idT, idRctn, desc56 );
	executeAction( idsetd, desc55, DialogModes.NO );
};
// by mike hale, via paul riggott;
function getLayerId(theLayer){
	// http://forums.adobe.com/message/1944754#1944754
	app.activeDocument.activeLayer = theLayer;
	//Assumes activeDocument and activeLayer
		var ref = new ActionReference();
		ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
		d = executeActionGet(ref);
	return d.getInteger(charIDToTypeID('LyrI'));
};
////// load transparency, ontersect with layer mask ofd another layer, add layer mask //////
function intersectedLayerMask (layerID) {
	var idChnl = charIDToTypeID( "Chnl" );
	// =======================================================
	var idsetd = charIDToTypeID( "setd" );
		var desc2 = new ActionDescriptor();
		var idnull = charIDToTypeID( "null" );
			var ref1 = new ActionReference();
			var idfsel = charIDToTypeID( "fsel" );
			ref1.putProperty( idChnl, idfsel );
		desc2.putReference( idnull, ref1 );
		var idT = charIDToTypeID( "T   " );
			var ref2 = new ActionReference();
			var idTrsp = charIDToTypeID( "Trsp" );
			ref2.putEnumerated( idChnl, idChnl, idTrsp );
		desc2.putReference( idT, ref2 );
	executeAction( idsetd, desc2, DialogModes.NO );
	// =======================================================
	var idIntr = charIDToTypeID( "Intr" );
		var desc3 = new ActionDescriptor();
		var idnull = charIDToTypeID( "null" );
			var ref3 = new ActionReference();
			var idMsk = charIDToTypeID( "Msk " );
			ref3.putEnumerated( idChnl, idChnl, idMsk );
			var idLyr = charIDToTypeID( "Lyr " );
			ref3.putIdentifier( idLyr, layerID );
		desc3.putReference( idnull, ref3 );
		var idWith = charIDToTypeID( "With" );
			var ref4 = new ActionReference();
			var idfsel = charIDToTypeID( "fsel" );
			ref4.putProperty( idChnl, idfsel );
		desc3.putReference( idWith, ref4 );
	executeAction( idIntr, desc3, DialogModes.NO );
	// =======================================================
	var idMk = charIDToTypeID( "Mk  " );
		var desc4 = new ActionDescriptor();
		var idNw = charIDToTypeID( "Nw  " );
		desc4.putClass( idNw, idChnl );
		var idAt = charIDToTypeID( "At  " );
			var ref5 = new ActionReference();
			var idMsk = charIDToTypeID( "Msk " );
			ref5.putEnumerated( idChnl, idChnl, idMsk );
		desc4.putReference( idAt, ref5 );
		var idUsng = charIDToTypeID( "Usng" );
		var idUsrM = charIDToTypeID( "UsrM" );
		var idRvlS = charIDToTypeID( "RvlS" );
		desc4.putEnumerated( idUsng, idUsrM, idRvlS );
	executeAction( idMk, desc4, DialogModes.NO );
};

 

JJMack