Skip to content

Instantly share code, notes, and snippets.

@laryn
Last active May 28, 2024 15:53
Show Gist options
  • Save laryn/0a1f6bf0dab5b713395a835f9bfa805c to your computer and use it in GitHub Desktop.
Save laryn/0a1f6bf0dab5b713395a835f9bfa805c to your computer and use it in GitHub Desktop.
Photoshop script to replace a smart object within a PSD with selected image(s) and save result as a JPG. (Transformations to the smart object will be applied to new images).
// Replace SmartObject’s Content and Save as JPG
// 2017, use it at your own risk
// Via @Circle B: https://graphicdesign.stackexchange.com/questions/92796/replacing-a-smart-object-in-bulk-with-photoshops-variable-data-or-scripts/93359
// JPG code from here: https://forums.adobe.com/thread/737789
#target photoshop
if (app.documents.length > 0) {
var myDocument = app.activeDocument;
var theName = myDocument.name.match(/(.*)\.[^\.]+$/)[1];
var thePath = myDocument.path;
var theLayer = myDocument.activeLayer;
// JPG Options;
jpgSaveOptions = new JPEGSaveOptions();
jpgSaveOptions.embedColorProfile = true;
jpgSaveOptions.formatOptions = FormatOptions.STANDARDBASELINE;
jpgSaveOptions.matte = MatteType.NONE;
jpgSaveOptions.quality = 8;
// Check if layer is SmartObject;
if (theLayer.kind != "LayerKind.SMARTOBJECT") {
alert("selected layer is not a smart object")
} else {
// Select Files;
if ($.os.search(/windows/i) != -1) {
var theFiles = File.openDialog("please select files", "*.psd;*.tif;*.jpg", true)
} else {
var theFiles = File.openDialog("please select files", getFiles, true)
};
if (theFiles) {
for (var m = 0; m < theFiles.length; m++) {
// Replace SmartObject
theLayer = replaceContents(theFiles[m], theLayer);
var theNewName = theFiles[m].name.match(/(.*)\.[^\.]+$/)[1];
// Save JPG. If you have need of saving different artboards into separate files,
// see https://gist.github.com/laryn/0a1f6bf0dab5b713395a835f9bfa805c#gistcomment-3996733
myDocument.saveAs((new File(thePath + "/" + theName + "_" + theNewName + ".jpg")), jpgSaveOptions, true,Extension.LOWERCASE);
}
}
}
};
// Get PSDs, TIFs and JPGs from files
function getFiles(theFile) {
if (theFile.name.match(/\.(psd|tif|jpg)$/i) != null || theFile.constructor.name == "Folder") {
return true
};
};
// Replace SmartObject Contents
function replaceContents(newFile, theSO) {
app.activeDocument.activeLayer = theSO;
// =======================================================
var idplacedLayerReplaceContents = stringIDToTypeID("placedLayerReplaceContents");
var desc3 = new ActionDescriptor();
var idnull = charIDToTypeID("null");
desc3.putPath(idnull, new File(newFile));
var idPgNm = charIDToTypeID("PgNm");
desc3.putInteger(idPgNm, 1);
executeAction(idplacedLayerReplaceContents, desc3, DialogModes.NO);
return app.activeDocument.activeLayer
};
@milqnomadu
Copy link

@schroef I tried the version above, however the output is the same I describe there. I don't really know how to cope with it.

@schroef
Copy link

schroef commented Dec 2, 2023

@milqnomadu
If you go to my GitHub link, I added it a couple posts above, it will show a layout in the layer panel. This is need to make it scale down the image to the mask dimensions. This will fix the issue I saw in that post you linked. I I understand correctly, your new linked image "design" is to big for the mockup, is that correct?

Edit
Here's the link to my repo
https://github.com/schroef/Photoshop-Scripts

Notice the layer panel and the order, this is very important for the resizing to work properly

@schroef
Copy link

schroef commented Jan 12, 2024

Ive been working on a new version of this script. After someone contacted me about a small issue with the current script. The original script did not resize the image. By adding the code from @magicsun and adding a mask, that work. But the image aspect ratio can cause an issue in that version. If the new images don't fit in terms of the image ratio, you would get blank spots. Ive also now have a version which replaces the content inside the linked SmartObject. This is a different approach and in some cases solves the issue.
I've also found a function on Adobe Community by Stephen A Marsh which allows the user to save as WebP.

I'm stilling testing out if this script can be one version or perhaps we keep both methods. Anyway, im working on adding a dialog window. The user can define settings and placement of the new image. This is for the version which edit the content of the SmartObject. The script also uses ObjectToDescriptor, this means when you reload the script it restores all last settings.

This is how it looks now, it already works with hard-coded save to WebP. Im now in the process of adding all other formats; BMP,JPG,PDF,PSD,TARGA,TIFF,WEBP,PNG-8,PNG-24.

dialog-design-v002

@shohidur333
Copy link

To replace a smart object within a PSD with selected image(s) and save the result as a JPG using a Photoshop script, you can refer to the detailed instructions provided in the article on BulkMockup. The article covers the use of scripts to automate the process and includes steps for replacing smart objects in bulk. The script mentioned in the article applies transformations to the smart objects and ensures that the changes are saved as JPG files.

@schroef
Copy link

schroef commented Jan 31, 2024

@shohidur333
My new versions actually does this, I've implemented 2 version now. One which edit the link itself, the other will edit the content inside the smartobject. The latter is slower however to the workflow need. But it's still a fraction of doing this all manually .

It's nice you have such expanded tutorials and writing. But it's a commercial product. $15 per month. Kinda steep price if you can get ir for free here

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment