• Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
Exit
0

convert layer to smart obj, save layer as png

Explorer ,
Aug 30, 2021 Aug 30, 2021

Copy link to clipboard

Copied

Hi~

I want to make a script that could read layer data,convert to smart obj, save layer as png,but now i have no idea how to convert a single layer to smart obj, and save image failed.

Could someone tell me how to do this, or give me some document, Thanks So Much.

 

Best regards.

 

function exportDataAndPng() {
var curGroups = []
var allnames = []

function _exportUIData()
{
var startRulerUnits = app.preferences.rulerUnits;
var startTypeUnits = app.preferences.typeUnits;

app.preferences.rulerUnits = Units.PIXELS;
app.preferences.typeUnits = TypeUnits.PIXELS;

var layers = app.activeDocument.layers;
var message = "";

var psdName = app.activeDocument.name.replace (".psd", "");
var file = new File (destPath + "/" + psdName + "_UIData.txt");
file.open ("w");
file.encoding = "UTF-8"

_loadpngNames()
curGroups.push( 'Root' )
_checkLayers(layers, file);

app.preferences.rulerUnits = startRulerUnits;
app.preferences.typeUnits = startTypeUnits;
}

function _loadpngNames()
{
//allnames.push(...)//load png names from target folder
}

function _getUniquePngName( nameIn )
{
var idx = 1
var origName = nameIn.replace(/^\s+|\s+$/gm, '');
origName = origName.replace(/[_%d+]$/,'')
var name = origName
while ( name in allnames ) {
name = origName + "_" + idx.toString()
idx += 1
}
return name
}

function _checkLayers(layers, expFile)
{
for(var i = 0 ; i < layers.length ; i++)
{
var layer = layers[i];

if(layer.visible == false)
{
continue;
}

if(layer.typename == 'ArtLayer')
{
app.activeDocument.activeLayer = layer
if ( layer.kind != LayerKind.TEXT ) {
//how to convert to smart object
//***********************

//save png
var filename = _getUniquePngName(decodeURI(layer.name),allnames)//create unique png name
if (_saveImage( filename ))
{
allnames.push( filename )
}
}
_writeData(layer, filename, expFile, curGroups);//export layer data
}
else
{
curGroups.push( decodeURI(layer.name) )
_checkLayers(layer.layers, expFile);
curGroups.pop()
}
}
}

function _saveImage( filename )
{
var desc = new ActionDescriptor(),
desc2 = new ActionDescriptor();
desc2.putEnumerated(app.charIDToTypeID("Op "), app.charIDToTypeID("SWOp"), app.charIDToTypeID("OpSa"));
desc2.putEnumerated(app.charIDToTypeID("Fmt "), app.charIDToTypeID("IRFm"), app.charIDToTypeID("PN24"));
desc2.putBoolean(app.charIDToTypeID("Intr"), false);
desc2.putBoolean(app.charIDToTypeID("Trns"), true);
desc2.putBoolean(app.charIDToTypeID("Mtt "), true);
desc2.putInteger(app.charIDToTypeID("MttR"), 255);
desc2.putInteger(app.charIDToTypeID("MttG"), 255);
desc2.putInteger(app.charIDToTypeID("MttB"), 255);
desc2.putBoolean(app.charIDToTypeID("SHTM"), false);
desc2.putBoolean(app.charIDToTypeID("SImg"), true);
desc2.putBoolean(app.charIDToTypeID("SSSO"), false);
desc2.putList(app.charIDToTypeID("SSLt"), new ActionList());
desc2.putBoolean(app.charIDToTypeID("DIDr"), false);
desc2.putPath(app.charIDToTypeID("In "), new File(filename));
desc.putObject(app.charIDToTypeID("Usng"), app.stringIDToTypeID("SaveForWeb"), desc2);
app.executeAction(app.charIDToTypeID("Expr"), desc, DialogModes.NO);
}

function _writeData( layer, filename, expFile, curGroups ) {
//export layer data, code is to large to post
}

_exportUIData()
}

TOPICS
Actions and scripting

Views

648

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 1 Correct answer

Community Expert , Aug 30, 2021 Aug 30, 2021

There are at least two ways to convert an active/targeted layer to a SO:

 

var idnewPlacedLayer = stringIDToTypeID( "newPlacedLayer" );
executeAction( idnewPlacedLayer, undefined, DialogModes.NO );

// or

app.runMenuItem(stringIDToTypeID('newPlacedLayer'));

 

Votes

Translate

Translate
Adobe
Explorer ,
Aug 30, 2021 Aug 30, 2021

Copy link to clipboard

Copied

var layers = app.activeDocument.layers;

for(var i = 0 ; i < layers.length ; i++)
{

       app.activeDocument.activeLayer = layer

       //convert to smart obj

       //save as png

 

1. How to convert current activeLayer to smart object.

2. How to save current activeLayer as png

 

Thanks a lot

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Aug 30, 2021 Aug 30, 2021

Copy link to clipboard

Copied

There are at least two ways to convert an active/targeted layer to a SO:

 

var idnewPlacedLayer = stringIDToTypeID( "newPlacedLayer" );
executeAction( idnewPlacedLayer, undefined, DialogModes.NO );

// or

app.runMenuItem(stringIDToTypeID('newPlacedLayer'));

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Aug 30, 2021 Aug 30, 2021

Copy link to clipboard

Copied

save activelayer as png?

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Aug 30, 2021 Aug 30, 2021

Copy link to clipboard

Copied

quote

save activelayer as png?


By @hui5C21

 

I haven't looked at your code. Have you searched these forums: Export layer to a folder: or web: LayerPNG24.jsx? You should get multiple results with working code examples etc.

 

A couple of common examples are turning off layer visibility for all layers except the active layer and save/export... Or you can dupe the active layer to a new temp doc and save/export from there and close the temp file without saving.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Aug 31, 2021 Aug 31, 2021

Copy link to clipboard

Copied

Yes,I have done this successfully on the way 'dupe the active layer to a new temp doc and save/export from there and close the temp file without saving', and i just want to known if there is a easier way to do this. I'm going to search and try make it it easier.

Thank you very much, best wish!

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Aug 31, 2021 Aug 31, 2021

Copy link to clipboard

Copied

I haven't tested, however I'm guessing that turning off visibility of all layers except the active layer would be more efficient/faster... But then you may need to capture and restore the visibility of all layers.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Aug 31, 2021 Aug 31, 2021

Copy link to clipboard

Copied

I will try it this way, Thanks

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Aug 31, 2021 Aug 31, 2021

Copy link to clipboard

Copied

I believe that it is possible, however, I can't find an example to capture the current layer panel visibility, then restore after changing the current visibility... Or perhaps what I was thinking of is storing/restoring the selected layers and not visibility, as...

 

Anyway, what you can do is call the following function once before saving/exporting, then call the function a second time, after exporting to return to the previous visibility (which appears to be "silently" stored without explicitly setting it so):

 

toggleActiveLayerVisibility(true);

function toggleActiveLayerVisibility(toggleOptionsPalette) {
	var s2t = function (s) {
		return app.stringIDToTypeID(s);
	};
	var descriptor = new ActionDescriptor();
	var list = new ActionList();
	var reference = new ActionReference();
	reference.putEnumerated( s2t( "layer" ), s2t( "ordinal" ), s2t( "targetEnum" ));
	list.putReference( reference );
	descriptor.putList( s2t( "null" ), list );
	descriptor.putBoolean( s2t( "toggleOptionsPalette" ), toggleOptionsPalette );
	executeAction( s2t( "show" ), descriptor, DialogModes.NO );
}

 

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Aug 31, 2021 Aug 31, 2021

Copy link to clipboard

Copied

LATEST

To avoid wiped spaces in 4-char ID's ("Op " & "In ") next time insert code by using </> icon.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines