Skip to content

Examples

Save As Tga

"""Example of saving documents as TGA files in Photoshop.

This example demonstrates how to:
1. Save documents in TGA format
2. Configure TGA save options
3. Handle alpha channels
4. Set compression options

Key concepts:
- TGA export
- Save options
- Alpha channel handling
- Resolution settings
"""

# Import built-in modules
import os

# Import local modules
from photoshop import Session


with Session() as ps:
    doc = ps.active_document

    # Configure TGA save options
    tga_options = ps.TargaSaveOptions()
    tga_options.alphaChannels = True
    tga_options.resolution = ps.TargaBitsPerPixels.TWENTYFOUR
    tga_options.rleCompression = True

    # Generate output path
    output_path = os.path.join(os.path.dirname(__file__), "output.tga")

    # Save document as TGA
    doc.saveAs(output_path, tga_options, True)

    # Save another version with different settings
    tga_options.resolution = ps.TargaBitsPerPixels.THIRTYTWO
    output_path_32 = os.path.join(os.path.dirname(__file__), "output_32bit.tga")
    doc.saveAs(output_path_32, tga_options, True)

Do Photoshop Action

"""Example of executing Photoshop actions.

This example demonstrates how to:
1. Play recorded Photoshop actions
2. Work with action sets
3. Handle action execution
4. Manage action parameters

Key concepts:
- Action playback
- Action sets
- Action execution
- Automation
"""

# Import local modules
from photoshop import Session


with Session() as ps:
    # Play default Photoshop action
    ps.app.doAction("action_name", "set_name")

Get Layer By Name

"""Example of retrieving a layer by its name in Photoshop.

This example demonstrates how to:
1. Access layers in the active document
2. Find a specific layer by its name
3. Handle layer search in the document hierarchy

Key concepts:
- Layer navigation
- Name-based layer lookup
- Active document context
"""

# Import local modules
from photoshop import Session


with Session() as ps:
    # Access active document's layers
    doc = ps.app.activeDocument
    for layer in doc.layers:
        if layer.name == "example layer":
            ps.echo(layer.name)
            break

Convert Smartobject To Layer

"""Example of converting between smart objects and regular layers.

This example demonstrates how to:
1. Convert layers to smart objects
2. Convert smart objects back to regular layers
3. Manage smart object properties
4. Handle smart object conversions

Key concepts:
- Smart Objects
- Layer conversion
- Smart Object properties
- Layer types
"""

# Import local modules
from photoshop import Session


with Session() as ps:
    doc = ps.active_document

    # Create a new layer
    layer = doc.artLayers.add()
    layer.name = "Test Layer"

    # Convert to smart object
    layer.convertToSmartObject()
    ps.echo("Layer converted to Smart Object")

    # Check if it's a smart object
    if layer.kind == ps.LayerKind.SmartObjectLayer:
        ps.echo("Layer is now a Smart Object")

        # Convert back to regular layer
        layer.rasterize(ps.RasterizeType.EntireLayer)
        ps.echo("Smart Object converted back to regular layer")

Eval Javascript

"""Example of executing JavaScript code in Photoshop.

This example demonstrates how to:
1. Execute JavaScript commands
2. Interact with Photoshop's scripting engine
3. Handle JavaScript results
4. Pass data between Python and JavaScript

Key concepts:
- JavaScript execution
- Script integration
- Data exchange
- Command execution
"""

# Import local modules
from photoshop import Session


with Session() as ps:
    # Execute JavaScript command
    js_code = "app.documents.length"
    result = ps.app.eval_javascript(js_code)
    ps.echo(f"Number of open documents: {result}")

New Document

# Create a new Photoshop document with diminsions 4 inches by 4 inches.
# Import local modules
import photoshop.api as ps


# Start up Photoshop application
app = ps.Application()

start_ruler_units = app.preferences.rulerUnits

app.preferences.rulerUnits = ps.Units.Pixels

# Create the document
docRef = app.documents.add(1920, 1080, 72.0, "My New Document")

# Make sure to set the ruler units prior to creating the document.
app.preferences.rulerUnits = start_ruler_units

Create New Document

"""Example of creating a new document in Photoshop.

This example demonstrates how to:
1. Create a new document with specific dimensions
2. Set document properties like name and mode
3. Work with document units and resolution

Key concepts:
- Document creation
- Document properties
- Color mode settings
"""

# Import local modules
from photoshop import Session


with Session() as ps:
    # Create a new document with specific dimensions
    doc = ps.app.documents.add(
        width=1920,
        height=1080,
        resolution=72,
        name="New Document Example"
    )

Trim

"""A trim example."""

# Import third-party modules
import examples._psd_files as psd  # Import from examples.

# Import local modules
from photoshop import Session


PSD_FILE = psd.get_psd_files()
example_file = PSD_FILE["trim.psd"]
with Session(example_file, action="open") as ps:
    ps.active_document.trim(ps.TrimType.TopLeftPixel, True, True, True, True)

Copy And Paste

"""
References:
    https://github.com/lohriialo/photoshop-scripting-python/blob/master/CopyAndPaste.py

"""

# Import local modules
import photoshop.api as ps


app = ps.Application()

startRulerUnits = app.preferences.rulerUnits

app.preferences.rulerUnits = ps.Units.Inches

doc = app.documents.add(7, 5, 72, None, ps.NewDocumentMode.NewRGB, ps.DocumentFill.White)

# Make sure the active layer is not a text layer, which cannot be copied to the
# clipboard.
if doc.activeLayer.kind != ps.LayerKind.TextLayer:
    # Select the left half of the document. Selections are always expressed
    # in pixels regardless of the current ruler unit type, so we're computing
    # the selection corner points based on the inch unit width and height
    # of the document
    x2 = (doc.width * doc.resolution) / 2
    y2 = doc.height * doc.resolution

    sel_area = ((0, 0), (x2, 0), (x2, y2), (0, y2))
    doc.selection.select(sel_area, ps.SelectionType.ReplaceSelection, 0, False)

    doc.selection.copy()

    # The new doc is created
    # need to change ruler units to pixels because x2 and y2 are pixel units.
    app.preferences.rulerUnits = ps.Units.Pixels
    pasteDoc = app.documents.add(x2, y2, doc.resolution, "Paste Target")
    pasteDoc.paste()
else:
    print("You cannot copy from a text layer")

if startRulerUnits != app.preferences.rulerUnits:
    app.preferences.rulerUnits = startRulerUnits

Get Document By Name

"""Example of retrieving a Photoshop document by its name.

This example demonstrates how to:
1. Access documents in the Photoshop application
2. Find a specific document by its name
3. Handle cases when the document doesn't exist

Key concepts:
- Using the documents collection
- Document name comparison
- Error handling for missing documents
"""

# Import local modules
from photoshop import Session


with Session() as ps:
    # Try to get document named 'test.psd'
    for doc in ps.app.documents:
        if doc.name == "test.psd":
            ps.echo(doc.name)
            break
    else:
        ps.echo("Document not found!")

Load Selection

"""Example of loading and working with selections in Photoshop.

This example demonstrates how to:
1. Create and save selections
2. Load saved selections
3. Modify selection channels
4. Combine multiple selections

Key concepts:
- Selection channels
- Channel operations
- Selection saving/loading
- Selection modification
"""

# Import local modules
from photoshop import Session


with Session() as ps:
    doc = ps.active_document

    # Create initial selection
    doc.selection.select([
        [100, 100],
        [300, 100],
        [300, 300],
        [100, 300]
    ])

    # Save selection to channel
    doc.channels.add()
    doc.selection.store(doc.channels[-1])

    # Deselect everything
    doc.selection.deselect()

    # Create another selection
    doc.selection.select([
        [200, 200],
        [400, 200],
        [400, 400],
        [200, 400]
    ])

    # Save to another channel
    doc.channels.add()
    doc.selection.store(doc.channels[-1])

    # Load first selection
    doc.selection.load(doc.channels[-2])

    # Combine with second selection
    doc.selection.combine(doc.channels[-1], ps.SelectionType.ExtendSelection)

    # Clean up - delete added channels
    doc.channels[-1].remove()
    doc.channels[-1].remove()

Import Image As Layer

"""Import a image as a artLayer."""

# Import local modules
from photoshop import Session


with Session(action="new_document") as ps:
    desc = ps.ActionDescriptor
    desc.putPath(ps.app.charIDToTypeID("null"), "your/image/path")
    event_id = ps.app.charIDToTypeID("Plc ")  # `Plc` need one space in here.
    ps.app.executeAction(ps.app.charIDToTypeID("Plc "), desc)

Color

"""Example of working with colors in Photoshop.

This example demonstrates how to:
1. Create and modify solid colors
2. Work with different color models (RGB, CMYK, HSB)
3. Set foreground and background colors
4. Compare color values

Key concepts:
- Color models
- Color manipulation
- Color space conversion
- Color comparison
"""

# Import local modules
from photoshop import Session


with Session() as ps:
    # Create a new RGB color
    rgb_color = ps.SolidColor()
    rgb_color.rgb.red = 255
    rgb_color.rgb.green = 0
    rgb_color.rgb.blue = 0

    # Create a new CMYK color
    cmyk_color = ps.SolidColor()
    cmyk_color.cmyk.cyan = 0
    cmyk_color.cmyk.magenta = 100
    cmyk_color.cmyk.yellow = 100
    cmyk_color.cmyk.black = 0

    # Set as foreground color
    ps.app.foregroundColor = rgb_color

    # Create HSB color
    hsb_color = ps.SolidColor()
    hsb_color.hsb.hue = 360
    hsb_color.hsb.saturation = 100
    hsb_color.hsb.brightness = 100

    # Set as background color
    ps.app.backgroundColor = hsb_color

Create Thumbnail

"""Create a thumbnail image for currently active document.

You can use the thumbnail image to upload to Shotgun or Ftrack.

"""

# Import built-in modules
import os
from tempfile import mkdtemp

# Import local modules
from photoshop import Session


def create_thumbnail(output_path=None, max_resolution=512):
    """Create a thumbnail image for currently active document.

    Args:
        output_path (str): The absolute output path of the thumbnail image.
            The default is to output to a temporary folder.
        max_resolution (int): The max resolution of the thumbnail. The default
            is `512`.

    Returns:
        str: The absolute output path of the thumbnail image.

    """
    output_path = output_path or os.path.join(mkdtemp(), "thumb.jpg")

    with Session(auto_close=True) as ps:
        orig_name = ps.active_document.name
        width_str = ps.active_document.width
        height_str = ps.active_document.height
        thumb_name = f"{orig_name}_thumb"

        max_resolution = width_str / max_resolution
        thumb_width = int(width_str / max_resolution)
        thumb_height = int(height_str / max_resolution)

        thumb_doc = ps.active_document.duplicate(thumb_name)
        thumb_doc.resizeImage(thumb_width, thumb_height - 100)
        thumb_doc.saveAs(output_path, ps.JPEGSaveOptions(), asCopy=True)
        thumb_doc.close()
        return output_path


if __name__ == "__main__":
    thumb_file = create_thumbnail()
    print(f"Save thumbnail file to {thumb_file}.")

Export Layers Use Export Options Saveforweb

"""Export every layer as a .png file use `ExportOptionsSaveForWeb`."""
# Import built-in modules
import os

# Import third-party modules
import examples._psd_files as psd  # Import from examples.

# Import local modules
from photoshop import Session


PSD_FILE = psd.get_psd_files()


def hide_all_layers(layers):
    for layer in layers:
        layer.visible = False


def main():
    psd_file = PSD_FILE["export_layers_as_png.psd"]
    with Session(psd_file, action="open") as ps:
        doc = ps.active_document
        options = ps.ExportOptionsSaveForWeb()
        layers = doc.artLayers
        for layer in layers:
            hide_all_layers(layers)
            layer.visible = True
            layer_path = os.path.join(doc.path, layer.name)
            print(layer_path)
            if not os.path.exists(layer_path):
                os.makedirs(layer_path)
            image_path = os.path.join(layer_path, f"{layer.name}.png")
            doc.exportDocument(image_path, exportAs=ps.ExportType.SaveForWeb, options=options)
        ps.alert("Task done!")
        ps.echo(doc.activeLayer)


if __name__ == "__main__":
    main()

Replace Images

"""Replace the image of the current active layer with a new image."""

# Import third-party modules
import examples._psd_files as psd  # Import from examples.

# Import local modules
from photoshop import Session


PSD_FILE = psd.get_psd_files()


with Session(PSD_FILE["replace_images.psd"], action="open") as ps:
    active_layer = ps.active_document.activeLayer
    bounds = active_layer.bounds
    print(f"current layer {active_layer.name}: {bounds}")
    input_file = PSD_FILE["red_100x200.png"]
    replace_contents = ps.app.stringIDToTypeID("placedLayerReplaceContents")
    desc = ps.ActionDescriptor
    idnull = ps.app.charIDToTypeID("null")
    desc.putPath(idnull, input_file)
    ps.app.executeAction(replace_contents, desc)

    # replaced image.
    active_layer = ps.active_document.activeLayer
    current_bounds = active_layer.bounds
    width = bounds[2] - bounds[0]
    height = bounds[3] - bounds[1]

    current_width = current_bounds[2] - current_bounds[0]
    current_height = current_bounds[3] - current_bounds[1]
    new_size = width / current_width * 100
    active_layer.resize(new_size, new_size, ps.AnchorPosition.MiddleCenter)
    print(f"current layer {active_layer.name}: {current_bounds}")

Add Metadata

"""Add metadata to current active document."""

# Import built-in modules
import os

# Import local modules
from photoshop import Session


with Session(action="new_document") as ps:
    doc = ps.active_document
    doc.info.author = os.getenv("USERNAME")
    doc.info.provinceState = "Beijing"
    doc.info.title = "My Demo"
    print("Print all metadata of current active document.")
    ps.echo(doc.info)

Change Color Of Background And Foreground

"""Example of changing background and foreground colors in Photoshop.

This example demonstrates how to:
1. Set foreground and background colors
2. Work with color swatches
3. Switch between foreground and background colors
4. Reset colors to default values

Key concepts:
- Color management
- Foreground/background colors
- Color swatches
- Default colors
"""

# Import local modules
from photoshop import Session


with Session() as ps:
    # Create new colors
    fg_color = ps.SolidColor()
    fg_color.rgb.red = 255
    fg_color.rgb.green = 0
    fg_color.rgb.blue = 0

    bg_color = ps.SolidColor()
    bg_color.rgb.red = 0
    bg_color.rgb.green = 0
    bg_color.rgb.blue = 255

    # Set foreground and background colors
    ps.app.foregroundColor = fg_color
    ps.app.backgroundColor = bg_color

    # Print current colors
    ps.echo(f"Foreground RGB: {ps.app.foregroundColor.rgb.red}, "
            f"{ps.app.foregroundColor.rgb.green}, "
            f"{ps.app.foregroundColor.rgb.blue}")

    ps.echo(f"Background RGB: {ps.app.backgroundColor.rgb.red}, "
            f"{ps.app.backgroundColor.rgb.green}, "
            f"{ps.app.backgroundColor.rgb.blue}")

Delete And Fill Selection

"""This script demonstrates how to delete and fill a selection in one operation."""

# Import built-in modules
import os

# Import third-party modules
from photoshop import Session
from photoshop.api import SolidColor
import photoshop.api as ps

# Import local modules
from _psd_files import get_psd_files

def delete_and_fill_selection(doc, fill_type, mode=None, opacity=None, preserve_transparency=None):
    """Delete current selection and fill it with specified color.

    Args:
        doc: The active document.
        fill_type (SolidColor): The color to fill the selection with.
        mode (ColorBlendMode, optional): The color blend mode.
        opacity (int, optional): The opacity value.
        preserve_transparency (bool, optional): If true, preserves transparency.
    """
    # First fill the selection
    doc.selection.fill(fill_type, mode, opacity, preserve_transparency)
    # Then deselect
    doc.selection.deselect()

def main():
    """Create a selection and fill it with a solid color."""
    psd_file = get_psd_files()["export_layers_as_png.psd"]

    # Initialize Photoshop application
    app = ps.Application()

    # Open the test file
    if not os.path.exists(psd_file):
        raise FileNotFoundError(f"Test file not found: {psd_file}")
    app.load(psd_file)

    # Get the active document
    doc = app.activeDocument

    # Create a rectangular selection
    doc.selection.select(((100, 100), (400, 100), (400, 300), (100, 300)))

    # Create a solid color (red in this case)
    red_color = SolidColor()
    red_color.rgb.red = 255
    red_color.rgb.green = 0
    red_color.rgb.blue = 0

    # Delete and fill the selection
    delete_and_fill_selection(doc, red_color, opacity=80)

    # Save the changes
    doc.save()

    print("Selection has been filled with red color.")

if __name__ == "__main__":
    main()

Creating A Layer

"""Example of creating and manipulating layers in Photoshop.

This example demonstrates how to:
1. Create different types of layers
2. Set layer properties and attributes
3. Organize layers in the document
4. Apply basic layer effects

Key concepts:
- Layer creation
- Layer types (art layers, text layers)
- Layer properties
- Layer organization
"""

# Import local modules
from photoshop import Session


with Session() as ps:
    doc = ps.active_document

    # Create a new art layer
    new_layer = doc.artLayers.add()

    # Set layer properties
    new_layer.name = "New Art Layer"
    new_layer.opacity = 75
    new_layer.visible = True

    # Create a text layer
    text_layer = doc.artLayers.add()
    text_layer.kind = ps.LayerKind.TextLayer

    # Configure text properties
    text_item = text_layer.textItem
    text_item.contents = "Sample Text"
    text_item.size = 72
    text_item.position = [100, 100]

    # Move layers in stack
    new_layer.move(text_layer, ps.ElementPlacement.PlaceAfter)

Set Active Layer

"""
References:
    https://github.com/lohriialo/photoshop-scripting-python/blob/master/ActiveLayer.py

"""
# Import local modules
import photoshop.api as ps


app = ps.Application()

if app.documents.length < 1:
    docRef = app.documents.add()
else:
    docRef = app.activeDocument

if docRef.layers.length < 2:
    docRef.artLayers.add()

activeLayerName = docRef.activeLayer.name
if docRef.activeLayer.name != docRef.layers.item(docRef.layers.length).name:
    docRef.activeLayer = docRef.layers.item(docRef.layers.length)
else:
    docRef.activeLayer = docRef.layers.item(1)

Enable Generator

"""Enable Generator features."""
# Import local modules
from photoshop import Session


with Session() as ps:
    plugin_name = "generator-assets-dummy-menu"
    generatorDesc = ps.ActionDescriptor
    generatorDesc.putString(ps.app.stringIDToTypeID("name"), plugin_name)
    ps.app.executeAction(ps.app.stringIDToTypeID("generateAssets"), generatorDesc)

Apply Filters

"""Example of applying various filters to layers in Photoshop.

This example demonstrates how to:
1. Apply different types of Photoshop filters
2. Configure filter parameters
3. Work with filter options
4. Handle filter application to different layer types

Key concepts:
- Filter types and options
- Layer filtering
- Parameter configuration
- Filter effects management
"""

# Import local modules
from photoshop import Session


with Session() as ps:
    doc = ps.active_document
    layer = doc.activeLayer

    # Apply Gaussian Blur filter
    filter_options = ps.GaussianBlurOptions()
    filter_options.radius = 10.0
    layer.applyGaussianBlur(filter_options)

    # Create new layer for other filters
    new_layer = doc.artLayers.add()

    # Apply Motion Blur
    motion_options = ps.MotionBlurOptions()
    motion_options.angle = 45
    motion_options.distance = 20
    new_layer.applyMotionBlur(motion_options)

    # Apply Smart Sharpen
    sharpen_options = ps.SmartSharpenOptions()
    sharpen_options.amount = 100
    sharpen_options.radius = 3.0
    sharpen_options.noiseReduction = 20
    new_layer.applySmartSharpen(sharpen_options)

    # Apply Unsharp Mask
    unsharp_options = ps.UnsharpMaskOptions()
    unsharp_options.amount = 50
    unsharp_options.radius = 2.0
    unsharp_options.threshold = 0
    new_layer.applyUnsharpMask(unsharp_options)

Export Layers As Png

"""Example of exporting individual layers as PNG files.

This example demonstrates how to:
1. Export each layer of a document as a separate PNG file
2. Handle layer visibility during export
3. Manage layer selection and activation
4. Configure export settings for PNG format

Key concepts:
- Layer iteration
- Visibility management
- PNG export settings
- File naming conventions
- Layer selection
"""

# Import built-in modules
import os

# Import local modules
from photoshop import Session


with Session() as ps:
    doc = ps.active_document

    # Store original layer visibilities
    layer_visibilities = []
    for layer in doc.layers:
        layer_visibilities.append(layer.visible)
        layer.visible = False

    try:
        # Export each layer individually
        for i, layer in enumerate(doc.layers):
            # Show only current layer
            layer.visible = True

            # Configure PNG save options
            options = ps.PNGSaveOptions()
            options.interlaced = False

            # Generate unique filename for each layer
            file_path = os.path.join(
                os.path.dirname(__file__),
                f"layer_{i}_{layer.name}.png"
            )

            # Save the file
            doc.saveAs(file_path, options, True)

            # Hide the layer again
            layer.visible = False

    finally:
        # Restore original layer visibilities
        for layer, visibility in zip(doc.layers, layer_visibilities):
            layer.visible = visibility

Run Batch

# Import built-in modules
import os

# Import local modules
from photoshop import Session


root = "your/images/root"
files = []
for name in os.listdir(root):
    files.append(os.path.join(root, name))
with Session() as api:
    options = api.BatchOptions()
    options.destination = 3
    options.destinationFolder = "c:\\test"
    api.app.batch(files=files, actionName="Quadrant Colors", actionSet="Default Actions", options=options)

Current Tool

"""Example of working with Photoshop tools.

This example demonstrates how to:
1. Get the current active tool
2. Change tools programmatically
3. Configure tool options
4. Work with tool presets

Key concepts:
- Tool selection
- Tool properties
- Tool management
- Active tool state
"""

# Import local modules
from photoshop import Session


with Session() as ps:
    # Get current tool
    current = ps.app.currentTool

    # Print current tool name
    ps.echo(f"Current tool: {current}")

Save As Pdf

"""Example of saving documents as PDF files in Photoshop.

This example demonstrates how to:
1. Save documents in PDF format
2. Configure PDF save options
3. Handle PDF compression settings
4. Set PDF compatibility options

Key concepts:
- PDF export
- Save options
- File compression
- PDF settings
"""

# Import built-in modules
import os

# Import local modules
from photoshop import Session


with Session() as ps:
    doc = ps.active_document

    # Configure PDF save options
    pdf_options = ps.PDFSaveOptions()
    pdf_options.alphaChannels = True
    pdf_options.embedColorProfile = True
    pdf_options.embedFonts = True
    pdf_options.layers = False
    pdf_options.optimizeForWeb = True
    pdf_options.view = False

    # Generate output path
    output_path = os.path.join(os.path.dirname(__file__), "output.pdf")

    # Save document as PDF
    doc.saveAs(output_path, pdf_options, True)

Session Smart Sharpen

"""This script demonstrates how you can use the action manager to execute the
Emboss filter.

References:
    https://github.com/lohriialo/photoshop-scripting-python/blob/master/SmartSharpen.py

"""

# Import third-party modules
import examples._psd_files as psd  # Import from examples.

# Import local modules
from photoshop import Session


PSD_FILE = psd.get_psd_files()
file_path = PSD_FILE["layer_comps.psd"]

with Session(file_path, action="open") as ps:

    def SmartSharpen(inAmount, inRadius, inNoise):
        idsmart_sharpen_id = ps.app.stringIDToTypeID(ps.EventID.SmartSharpen)
        desc37 = ps.ActionDescriptor()

        idpresetKind = ps.app.stringIDToTypeID(ps.EventID.PresetKind)
        idpresetKindType = ps.app.stringIDToTypeID(ps.EventID.PresetKindType)
        idpresetKindCustom = ps.app.stringIDToTypeID(ps.EventID.PresetKindCustom)
        desc37.putEnumerated(idpresetKind, idpresetKindType, idpresetKindCustom)
        idAmnt = ps.app.charIDToTypeID("Amnt")
        idPrc = ps.app.charIDToTypeID("Rds ")
        desc37.putUnitDouble(idAmnt, idPrc, inAmount)

        idRds = ps.app.charIDToTypeID("Rds ")
        idPxl = ps.app.charIDToTypeID("#Pxl")
        desc37.putUnitDouble(idRds, idPxl, inRadius)

        idnoiseReduction = ps.app.stringIDToTypeID("noiseReduction")
        idPrc = ps.app.charIDToTypeID("#Prc")
        desc37.putUnitDouble(idnoiseReduction, idPrc, inNoise)

        idblur = ps.app.charIDToTypeID("blur")
        idblurType = ps.app.stringIDToTypeID("blurType")
        idGsnB = ps.app.charIDToTypeID("GsnB")
        desc37.putEnumerated(idblur, idblurType, idGsnB)

        ps.app.ExecuteAction(idsmart_sharpen_id, desc37)

    docRef = ps.active_document
    nlayerSets = docRef.layerSets
    nArtLayers = docRef.layerSets.item(nlayerSets.length)
    docRef.activeLayer = nArtLayers.artLayers.item(nArtLayers.artLayers.length)

    SmartSharpen(300, 2.0, 20)

Operate Layer Set

"""Example of working with layer sets (groups) in Photoshop.

This example demonstrates how to:
1. Create and manage layer groups
2. Add layers to groups
3. Organize layer hierarchy
4. Handle group properties

Key concepts:
- Layer groups
- Layer organization
- Group properties
- Layer hierarchy
"""

# Import local modules
from photoshop import Session


with Session() as ps:
    doc = ps.active_document

    # Create a new layer group
    main_group = doc.layerSets.add()
    main_group.name = "Main Group"

    # Create a nested group
    sub_group = main_group.layerSets.add()
    sub_group.name = "Sub Group"

    # Add layers to groups
    layer1 = main_group.artLayers.add()
    layer1.name = "Layer in Main"

    layer2 = sub_group.artLayers.add()
    layer2.name = "Layer in Sub"

    # Set group properties
    main_group.visible = True
    main_group.opacity = 80

    # List layers in groups
    for layer in main_group.layers:
        ps.echo(f"Layer in main group: {layer.name}")

    for layer in sub_group.layers:
        ps.echo(f"Layer in sub group: {layer.name}")

    # Move a layer between groups
    layer1.move(sub_group, ps.ElementPlacement.INSIDE)

Hello World

"""Basic example demonstrating Photoshop automation with python-photoshop-api.

This example demonstrates how to:
1. Connect to Photoshop application
2. Create a new document
3. Add text content to the document
4. Save the document as PSD file

Key concepts:
- Application connection
- Document creation
- Text layer manipulation
- File saving
"""

# Import built-in modules
import os

# Import local modules
from photoshop import Session


with Session() as ps:
    # Create a new document
    doc = ps.app.documents.add()

    # Create text layer with "Hello, World!"
    text_color = ps.SolidColor()
    text_color.rgb.red = 255
    text_color.rgb.green = 0
    text_color.rgb.blue = 0

    new_text_layer = doc.artLayers.add()
    new_text_layer.kind = ps.LayerKind.TextLayer
    new_text_layer.textItem.contents = "Hello, World!"
    new_text_layer.textItem.position = [160, 167]
    new_text_layer.textItem.size = 40
    new_text_layer.textItem.color = text_color

    # Save the document
    jpg_file = os.path.join(os.path.dirname(__file__), "hello_world.jpg")
    ps.JPEGSaveOptions(quality=12)
    doc.saveAs(jpg_file)

Photoshop Session

"""Add slate information dynamically."""

# Import built-in modules
from datetime import datetime
import os
from tempfile import mkdtemp

# Import third-party modules
import examples._psd_files as psd  # Import from examples.

# Import local modules
from photoshop import Session


PSD_FILE = psd.get_psd_files()
file_path = PSD_FILE["slate_template.psd"]

with Session(file_path, action="open", auto_close=True) as ps:
    layer_set = ps.active_document.layerSets.getByName("template")
    data = {
        "project name": "test_project",
        "datetime": datetime.today().strftime("%Y-%m-%d"),
    }
    for layer in layer_set.layers:
        if layer.kind == ps.LayerKind.TextLayer:
            layer.textItem.contents = data[layer.textItem.contents.strip()]

    jpg_file = os.path.join(mkdtemp("photoshop-python-api"), "slate.jpg")
    ps.active_document.saveAs(jpg_file, ps.JPEGSaveOptions())
    os.startfile(jpg_file)

Export Document

"""Example of exporting a Photoshop document to different formats.

This example demonstrates how to:
1. Save documents in different formats (JPG, PNG)
2. Configure export quality settings
3. Handle file paths and naming
4. Use save options for different formats

Key concepts:
- File format conversion
- Export quality control
- Save options configuration
- File path handling
"""

# Import built-in modules
import os

# Import local modules
from photoshop import Session


with Session() as ps:
    doc = ps.active_document

    # Get the directory of current script
    current_dir = os.path.dirname(__file__)

    # Save as JPG with high quality
    jpg_opt = ps.JPEGSaveOptions(quality=12)
    jpg_path = os.path.join(current_dir, "output.jpg")
    doc.saveAs(jpg_path, jpg_opt)

    # Save as PNG with transparency
    png_opt = ps.PhotoshopSaveOptions()
    png_path = os.path.join(current_dir, "output.png")
    doc.saveAs(png_path, png_opt)

Rotate Layer

"""Example of rotating layers in Photoshop.

This example demonstrates how to:
1. Rotate layers by specific angles
2. Apply different rotation methods
3. Handle layer transformations
4. Preserve layer properties during rotation

Key concepts:
- Layer rotation
- Transform operations
- Angle calculations
- Layer positioning
"""

# Import local modules
from photoshop import Session


with Session() as ps:
    doc = ps.active_document
    layer = doc.activeLayer

    # Store original bounds
    bounds = layer.bounds

    # Calculate center point
    center_x = (bounds[0] + bounds[2]) / 2
    center_y = (bounds[1] + bounds[3]) / 2

    # Rotate layer by 45 degrees
    layer.rotate(45.0, ps.AnchorPosition.MiddleCenter)

    # Create new layer and rotate it
    new_layer = doc.artLayers.add()
    new_layer.name = "Rotated Layer"

    # Rotate new layer by 90 degrees
    new_layer.rotate(90.0, ps.AnchorPosition.MiddleCenter)

    # Move layer to original center
    new_layer.translate(center_x - new_layer.bounds[0],
                       center_y - new_layer.bounds[1])

Apply Crystallize Filter Action

""" This script demonstrates how you can use the action manager

to execute the Crystallize filter.
In order to find all the IDs, see https://helpx.adobe.com/photoshop/kb/downloadable-plugins-and-content.html#ScriptingListenerplugin # noqa: E501
This blog here explains what a script listener is http://blogs.adobe.com/crawlspace/2006/05/installing_and_1.html

References:
    https://github.com/lohriialo/photoshop-scripting-python/blob/master/ApplyCrystallizeFilterAction.py

"""

# Import third-party modules
import examples._psd_files as psd  # Import from examples.

# Import local modules
from photoshop import Session


PSD_FILE = psd.get_psd_files()

with Session(PSD_FILE["layer_comps.psd"], "open") as ps:
    active_document = ps.active_document
    nLayerSets = active_document.layerSets
    print(f"The total amount of current layerSet (Group) is " f"{len(nLayerSets)}.")
    nArtLayers = active_document.layerSets.item(len(nLayerSets)).artLayers

    # get the last layer in LayerSets
    active_document.activeLayer = active_document.layerSets.item(len(nLayerSets)).artLayers.item(len(nArtLayers))

    def applyCrystallize(cellSize):
        cellSizeID = ps.app.CharIDToTypeID("ClSz")
        eventCrystallizeID = ps.app.CharIDToTypeID("Crst")

        filterDescriptor = ps.ActionDescriptor
        filterDescriptor.putInteger(cellSizeID, cellSize)

        ps.app.executeAction(eventCrystallizeID, filterDescriptor)

    applyCrystallize(25)
    print("Apply crystallize done.")

List Documents

"""List current photoshop all documents."""

# Import local modules
import photoshop.api as ps


app = ps.Application()

doc = app.documents[0]
print(doc.name)

for doc in app.documents:
    print(doc.name)

Active Layer

"""Example of working with active layers in Photoshop.

This example demonstrates how to:
1. Get and set the active layer in a document
2. Create new art layers
3. Manage layer names and properties

The script will:
- Create a new document if none exists
- Add a new art layer if document has less than 2 layers
- Display the current active layer name
- Create a new layer and rename it
"""

# Import local modules
from photoshop import Session


with Session() as ps:
    # Get or create a document
    if len(ps.app.documents) < 1:
        docRef = ps.app.documents.add()
    else:
        docRef = ps.app.activeDocument

    # Ensure we have at least 2 layers
    if len(docRef.layers) < 2:
        docRef.artLayers.add()

    # Display current active layer name
    ps.echo(docRef.activeLayer.name)

    # Create and rename a new layer
    new_layer = docRef.artLayers.add()
    ps.echo(new_layer.name)
    new_layer.name = "test"

Open Psd

# Import local modules
from photoshop import Session
import photoshop.api as ps


# style 1
app = ps.Application()
app.load("your/psd/or/psb/file_path.psd")

# style 2
with Session("your/psd/or/psb/file_path.psd", action="open") as ps:
    ps.echo(ps.active_document.name)

Session Document Duplicate

"""Example of duplicating documents within a Photoshop session.

This example demonstrates how to:
1. Duplicate existing documents
2. Configure duplication options
3. Handle document copies
4. Manage document references

Key concepts:
- Document duplication
- Session management
- Document handling
- Copy options
"""

# Import local modules
from photoshop import Session


with Session() as ps:
    if len(ps.app.documents) > 0:
        # Duplicate active document
        doc = ps.active_document.duplicate()

Add Start Application Event

"""Add event for Photoshop start application.

In the current example, every time we start photoshop it will
alert "Start Application Event".

Just like you manually in Script> Script Events Manager to enable the event.

"""

# Import built-in modules
import os
from tempfile import mkdtemp

# Import local modules
from photoshop import Session


with Session() as ps:
    root = mkdtemp()
    jsx_file = os.path.join(root, "event.jsx")
    with open(jsx_file, "w") as f:
        f.write('alert("Start Application event.")')
    ps.app.notifiers.add(ps.EventID.Notify, jsx_file)
    print("Add event done.")

Session Hello World

"""Add slate information dynamically."""

# Import built-in modules
import os
from tempfile import mkdtemp

# Import local modules
from photoshop import Session


with Session() as adobe:
    doc = adobe.app.documents.add(2000, 2000)
    text_color = adobe.SolidColor()
    text_color.rgb.red = 255
    new_text_layer = doc.artLayers.add()
    new_text_layer.kind = adobe.LayerKind.TextLayer
    new_text_layer.textItem.contents = "Hello, World!"
    new_text_layer.textItem.position = [160, 167]
    new_text_layer.textItem.size = 40
    new_text_layer.textItem.color = text_color
    options = adobe.JPEGSaveOptions(quality=1)
    jpg_file = os.path.join(mkdtemp("photoshop-python-api"), "hello_world.jpg")
    doc.saveAs(jpg_file, options, asCopy=True)
    adobe.app.doJavaScript(f'alert("save to jpg: {jpg_file}")')

Smart Sharpen

"""Example of applying Smart Sharpen filter in Photoshop.

This example demonstrates how to:
1. Apply Smart Sharpen filter with various settings
2. Configure sharpening parameters
3. Handle different sharpening methods
4. Process multiple layers

Key concepts:
- Smart Sharpen filter
- Filter parameters
- Image enhancement
- Layer processing
"""

# Import local modules
from photoshop import Session


with Session() as ps:
    doc = ps.active_document
    layer = doc.activeLayer

    # Configure Smart Sharpen options
    options = ps.SmartSharpenOptions()
    options.amount = 100.0
    options.radius = 3.0
    options.noiseReduction = 20
    options.removeMotionBlur = False
    options.angle = 0
    options.moreAccurate = True

    # Apply Smart Sharpen
    layer.applySmartSharpen(
        amount=options.amount,
        radius=options.radius,
        noiseReduction=options.noiseReduction,
        removeMotionBlur=options.removeMotionBlur,
        angle=options.angle,
        moreAccurate=options.moreAccurate
    )

    # Create a copy with different settings
    new_layer = layer.duplicate()
    new_layer.name = "Sharp Copy"

    # Apply stronger sharpening
    options.amount = 150.0
    options.radius = 4.0
    new_layer.applySmartSharpen(
        amount=options.amount,
        radius=options.radius,
        noiseReduction=options.noiseReduction,
        removeMotionBlur=options.removeMotionBlur,
        angle=options.angle,
        moreAccurate=options.moreAccurate
    )

Fill Selection

"""Example of filling selections in Photoshop.

This example demonstrates how to:
1. Create and modify selections
2. Fill selections with colors
3. Work with selection options
4. Apply different fill methods

Key concepts:
- Selection tools
- Fill operations
- Color fills
- Selection modification
- Fill opacity and blending
"""

# Import local modules
from photoshop import Session


with Session() as ps:
    doc = ps.active_document

    # Create a rectangular selection
    doc.selection.select([
        [100, 100],
        [300, 100],
        [300, 200],
        [100, 200]
    ])

    # Create fill color
    fill_color = ps.SolidColor()
    fill_color.rgb.red = 255
    fill_color.rgb.green = 0
    fill_color.rgb.blue = 0

    # Fill the selection
    doc.selection.fill(fill_color)

    # Deselect
    doc.selection.deselect()

    # Create another selection and fill with opacity
    doc.selection.select([
        [150, 150],
        [350, 150],
        [350, 250],
        [150, 250]
    ])

    fill_color.rgb.blue = 255
    doc.selection.fill(fill_color, ps.ColorBlendMode.Normal, 50)

    # Clear selection
    doc.selection.deselect()

Session Callback

"""Example of using callbacks with Photoshop sessions.

This example demonstrates how to:
1. Set up session callbacks
2. Handle Photoshop events
3. Manage callback execution
4. Process event data

Key concepts:
- Event handling
- Callbacks
- Session management
- Event processing
"""

# Import local modules
from photoshop import Session


def on_close():
    """Callback function for session close event."""
    print("Session is closing")


with Session(callback=on_close) as ps:
    ps.echo("Working in session...")
"""Example of linking layers in Photoshop.

This example demonstrates how to:
1. Link multiple layers together
2. Manage linked layers
3. Check layer link status
4. Modify linked layer properties

Key concepts:
- Layer linking
- Group operations
- Layer management
- Link status
"""

# Import local modules
from photoshop import Session


with Session() as ps:
    doc = ps.active_document

    # Create test layers
    layer1 = doc.artLayers.add()
    layer1.name = "Layer 1"

    layer2 = doc.artLayers.add()
    layer2.name = "Layer 2"

    layer3 = doc.artLayers.add()
    layer3.name = "Layer 3"

    # Link layers
    layer1.link(layer2)
    layer2.link(layer3)

    # Check link status
    ps.echo(f"Layer 1 linked: {layer1.linked}")
    ps.echo(f"Layer 2 linked: {layer2.linked}")
    ps.echo(f"Layer 3 linked: {layer3.linked}")

    # Move linked layers together
    layer1.translate(100, 100)

Export Artboards

"""Example of how to export artboards from a PSD file.

This script demonstrates how to:
1. Identify artboard layers in a PSD file
2. Export each artboard as a separate image
"""
# Import built-in modules
import os.path
from pathlib import Path
from typing import List
from typing import Union

# Import local modules
from photoshop import Session
from photoshop.api._artlayer import ArtLayer
from photoshop.api._layerSet import LayerSet
from photoshop.api.enumerations import LayerKind


def is_artboard(layer: Union[ArtLayer, LayerSet], ps) -> bool:
    """Check if a layer is an artboard.

    Args:
        layer: Photoshop layer object (ArtLayer or LayerSet)
        ps: Photoshop session object

    Returns:
        bool: True if the layer is an artboard, False otherwise
    """
    try:
        return layer.kind == LayerKind.ArtboardLayer
    except Exception as e:
        print(f"Error checking layer {layer.name}: {str(e)}")
        # Fallback to checking layer name
        return "Artboard" in layer.name


def get_all_layers(doc) -> List[Union[ArtLayer, LayerSet]]:
    """Recursively get all layers from document, including nested layers.

    Args:
        doc: Photoshop document object

    Returns:
        List[Union[ArtLayer, LayerSet]]: List of all layers
    """
    def _get_layers(layer_container) -> List[Union[ArtLayer, LayerSet]]:
        layers = []

        # Get art layers
        for layer in layer_container.artLayers:
            layers.append(layer)

        # Get layer sets and their children
        for layer_set in layer_container.layerSets:
            layers.append(layer_set)
            layers.extend(_get_layers(layer_set))

        return layers

    return _get_layers(doc)


def get_artboard_layers(doc, artboard_name: str) -> List[Union[ArtLayer, LayerSet]]:
    """Get all layers that belong to an artboard.

    Args:
        doc: Photoshop document object
        artboard_name: Name of the artboard

    Returns:
        List[Union[ArtLayer, LayerSet]]: List of layers that belong to this artboard
    """
    try:
        # Get all layers in the document
        all_layers = []
        for layer in doc.artLayers:
            all_layers.append(layer)
        for layer in doc.layerSets:
            all_layers.append(layer)

        # Get the artboard layer
        artboard = None
        for layer in all_layers:
            if layer.name == artboard_name:
                artboard = layer
                break

        if not artboard:
            return []

        # Get all layers that belong to this artboard
        artboard_layers = []
        for layer in all_layers:
            if layer.name != artboard_name:
                try:
                    # Check if layer is visible and within artboard bounds
                    if layer.visible and isinstance(layer, ArtLayer):
                        artboard_layers.append(layer)
                except Exception as e:
                    print(f"Error checking layer {layer.name}: {str(e)}")
                    continue

        return artboard_layers
    except Exception as e:
        print(f"Error getting artboard layers: {str(e)}")
        return []


def export_artboards(psd_path: str, output_dir: str) -> None:
    """Export all artboards in a PSD file as separate images.

    Args:
        psd_path (str): Path to the PSD file
        output_dir (str): Directory to save the exported images
    """
    with Session() as ps:
        try:
            # Open the PSD file
            ps.app.open(os.path.abspath(psd_path))
            doc = ps.active_document

            # Create output directory if it doesn't exist
            Path(output_dir).mkdir(parents=True, exist_ok=True)

            # Get all layers including nested ones
            all_layers = get_all_layers(doc)
            print(f"Found {len(all_layers)} total layers:")
            for layer in all_layers:
                layer_type = "LayerSet" if isinstance(layer, LayerSet) else "ArtLayer"
                is_ab = "Artboard" if is_artboard(layer, ps) else "Regular Layer"
                print(f"Layer: {layer.name} ({layer_type} - {is_ab})")

            # Iterate through all layers
            for layer in all_layers:
                if is_artboard(layer, ps):
                    print(f"\nProcessing artboard: {layer.name}")

                    # Export artboard using JavaScript
                    output_path = os.path.abspath(str(Path(output_dir) / f"{layer.name}.png"))
                    # Convert Windows path to JavaScript path format
                    js_path = output_path.replace("\\", "/")

                    js_code = """
                    function exportArtboard(filePath, artboardName) {
                        var doc = app.activeDocument;
                        var artboard = null;

                        // Find the artboard
                        for (var i = 0; i < doc.layers.length; i++) {
                            if (doc.layers[i].name === '%s') {
                                artboard = doc.layers[i];
                                break;
                            }
                        }

                        if (!artboard) return;

                        // Save the current state
                        var docState = doc.activeHistoryState;

                        try {
                            // Hide all layers
                            for (var i = 0; i < doc.layers.length; i++) {
                                doc.layers[i].visible = false;
                            }

                            // Show only the artboard and its contents
                            artboard.visible = true;

                            // Save as PNG
                            var pngFile = new File('%s');
                            var pngOptions = new PNGSaveOptions();
                            pngOptions.interlaced = false;
                            pngOptions.compression = 9;
                            pngOptions.transparency = true;

                            doc.saveAs(pngFile, pngOptions, true, Extension.LOWERCASE);

                            // Restore the document state
                            doc.activeHistoryState = docState;
                        } catch (e) {
                            // Restore the document state in case of error
                            doc.activeHistoryState = docState;
                            throw e;
                        }
                    }

                    exportArtboard('%s', '%s');
                    """ % (layer.name, js_path, js_path, layer.name)

                    ps.app.eval_javascript(js_code)
                    print(f"Exported {layer.name} to {output_path}")

        except Exception as e:
            print(f"Error processing PSD file: {str(e)}")
            raise


if __name__ == "__main__":
    # Example usage
    current_dir = os.path.dirname(os.path.abspath(__file__))
    psd_path = os.path.join(current_dir, "files", "artboard_example.psd")  # Use absolute path
    output_dir = os.path.join(current_dir, "output", "artboards")  # Use absolute path
    export_artboards(psd_path, output_dir)

Move To End

"""Example of moving layers to different positions in the layer stack.

This example demonstrates how to:
1. Move layers within the layer stack
2. Change layer order
3. Handle layer positioning
4. Work with layer groups

Key concepts:
- Layer ordering
- Layer movement
- Stack manipulation
- Layer hierarchy
"""

# Import local modules
from photoshop import Session


with Session() as ps:
    doc = ps.active_document

    # Create some test layers
    layer1 = doc.artLayers.add()
    layer1.name = "Layer 1"

    layer2 = doc.artLayers.add()
    layer2.name = "Layer 2"

    layer3 = doc.artLayers.add()
    layer3.name = "Layer 3"

    # Move layer1 to the end (bottom) of the stack
    layer1.move(doc.layers[-1], ps.ElementPlacement.PlaceAfter)

    # Move layer3 to the beginning (top) of the stack
    layer3.move(doc.layers[0], ps.ElementPlacement.PlaceBefore)

    # Move layer2 between layer1 and layer3
    layer2.move(layer1, ps.ElementPlacement.PlaceBefore)

Cropping

"""A cropping example."""

# Import local modules
from photoshop import Session


with Session(action="new_document") as ps:
    ps.active_document.crop(bounds=[100, 12, 354, 246], width=1920, height=1080)

Toggle Proof Colors

"""Toggle the proof color.

Like operating in the menu:
**View** > **Proof Colors** (Ctrl + Y)

"""
# Import local modules
from photoshop import Session


with Session() as ps:
    ps.app.runMenuItem(ps.app.stringIDToTypeID("toggleProofColors"))

Session New Document

"""Action for create new document and print new document name."""
# Import local modules
from photoshop import Session


with Session(action="new_document") as ps:
    ps.echo(ps.active_document.name)

Compare Colors

"""Example of comparing colors in Photoshop.

This example demonstrates how to:
1. Compare colors across different color models
2. Convert between color spaces
3. Check color equality
4. Work with color tolerances

Key concepts:
- Color comparison
- Color space conversion
- Color equality testing
- Color model differences
"""

# Import local modules
from photoshop import Session


with Session() as ps:
    # Create two colors for comparison
    color1 = ps.SolidColor()
    color1.rgb.red = 255
    color1.rgb.green = 0
    color1.rgb.blue = 0

    color2 = ps.SolidColor()
    color2.rgb.red = 255
    color2.rgb.green = 0
    color2.rgb.blue = 0

    # Compare colors
    is_same = (color1.rgb.red == color2.rgb.red and
               color1.rgb.green == color2.rgb.green and
               color1.rgb.blue == color2.rgb.blue)

    ps.echo(f"Colors are {'same' if is_same else 'different'}")

Operate Channels

"""Example of working with channels in Photoshop.

This example demonstrates how to:
1. Access and manipulate color channels
2. Create and modify alpha channels
3. Work with channel visibility
4. Handle channel operations

Key concepts:
- Channel management
- Alpha channels
- Channel visibility
- Color separation
"""

# Import local modules
from photoshop import Session


with Session() as ps:
    doc = ps.active_document

    # List all channels
    for channel in doc.channels:
        ps.echo(f"Channel: {channel.name}")

    # Create a new alpha channel
    new_channel = doc.channels.add()
    new_channel.name = "Custom Alpha"

    # Duplicate a channel
    if len(doc.channels) > 0:
        duplicate = doc.channels[0].duplicate()
        duplicate.name = "Channel Copy"

    # Toggle channel visibility
    for channel in doc.channels:
        channel.visible = True

Add Slate

"""Add slate information dynamically.

- Open template.
- Update info.
- Save as jpg.
- Close current document.

"""

# Import built-in modules
from datetime import datetime
import os
from tempfile import mkdtemp

# Import third-party modules
import examples._psd_files as psd  # Import from examples.

# Import local modules
from photoshop import Session


PSD_FILE = psd.get_psd_files()
slate_template = PSD_FILE["slate_template.psd"]
with Session(slate_template, action="open", auto_close=True) as ps:
    layer_set = ps.active_document.layerSets.getByName("template")

    data = {
        "project name": "test_project",
        "datetime": datetime.today().strftime("%Y-%m-%d"),
    }
    for layer in layer_set.layers:
        if layer.kind == ps.LayerKind.TextLayer:
            layer.textItem.contents = data[layer.textItem.contents.strip()]

    jpg_file = os.path.join(mkdtemp("photoshop-python-api"), "slate.jpg")
    ps.active_document.saveAs(jpg_file, ps.JPEGSaveOptions())
    print(f"Save jpg to {jpg_file}")
    os.startfile(jpg_file)

Save To Psd

"""Example of saving documents as PSD files in Photoshop.

This example demonstrates how to:
1. Save documents in PSD format
2. Configure PSD save options
3. Preserve layer information
4. Handle compatibility settings

Key concepts:
- PSD format
- Layer preservation
- Save options
- File compatibility
"""

# Import built-in modules
import os

# Import local modules
from photoshop import Session


with Session() as ps:
    doc = ps.active_document

    # Configure PSD save options
    psd_options = ps.PhotoshopSaveOptions()
    psd_options.alphaChannels = True
    psd_options.annotations = True
    psd_options.layers = True
    psd_options.spotColors = True

    # Generate output path
    output_path = os.path.join(os.path.dirname(__file__), "output.psd")

    # Save document as PSD
    doc.saveAs(output_path, psd_options, True)

Selection Stroke

"""Example of creating and modifying selection strokes in Photoshop.

This example demonstrates how to:
1. Create selections with specific shapes
2. Apply strokes to selections
3. Configure stroke options
4. Work with stroke colors and widths

Key concepts:
- Selection creation
- Stroke application
- Stroke customization
- Color management
"""

# Import local modules
from photoshop import Session


with Session() as ps:
    doc = ps.active_document

    # Create a rectangular selection
    doc.selection.select([
        [100, 100],
        [400, 100],
        [400, 300],
        [100, 300]
    ])

    # Create stroke color
    stroke_color = ps.SolidColor()
    stroke_color.rgb.red = 255
    stroke_color.rgb.green = 0
    stroke_color.rgb.blue = 0

    # Apply stroke to selection
    doc.selection.stroke(
        stroke_color,  # Color to use
        width=2,      # Stroke width in pixels
        location=ps.StrokeLocation.Inside,
        blendMode=ps.ColorBlendMode.Normal,
        opacity=100
    )

    # Create circular selection
    doc.selection.selectElliptical(
        left=200,
        top=200,
        width=200,
        height=200
    )

    # Change stroke color
    stroke_color.rgb.blue = 255

    # Apply different stroke
    doc.selection.stroke(
        stroke_color,
        width=5,
        location=ps.StrokeLocation.Center,
        blendMode=ps.ColorBlendMode.Normal,
        opacity=75
    )

    # Clear selection
    doc.selection.deselect()

Emboss Action

# Import local modules
from photoshop import Session


with Session() as ps:
    app = ps.app
    for index, x in enumerate(range(50)):
        # Execute an existing action from action palette.
        idPly = app.charIDToTypeID("Ply ")
        desc8 = ps.ActionDescriptor()
        idnull = app.charIDToTypeID("null")
        ref3 = ps.ActionReference()
        idActn = app.charIDToTypeID("Actn")
        ref3.putName(idActn, "Sepia Toning (layer)")
        idASet = app.charIDToTypeID("ASet")
        ref3.PutName(idASet, "Default Actions")
        desc8.putReference(idnull, ref3)
        app.executeAction(idPly, desc8, ps.DialogModes.DisplayNoDialogs)

        # Create solid color fill layer.
        idMk = app.charIDToTypeID("Mk  ")
        desc21 = ps.ActionDescriptor()
        idNull = app.charIDToTypeID("null")
        ref12 = ps.ActionReference()
        idContentLayer1 = app.stringIDToTypeID("contentLayer")
        ref12.putClass(idContentLayer1)
        desc21.putReference(idNull, ref12)
        idUsng = app.charIDToTypeID("Usng")
        desc22 = ps.ActionDescriptor()
        idType = app.charIDToTypeID("Type")
        desc23 = ps.ActionDescriptor()
        idClr = app.charIDToTypeID("Clr ")
        desc24 = ps.ActionDescriptor()
        idRd = app.charIDToTypeID("Rd  ")
        desc24.putDouble(idRd, index)
        idGrn = app.charIDToTypeID("Grn ")
        desc24.putDouble(idGrn, index)
        idBl = app.charIDToTypeID("Bl  ")
        desc24.putDouble(idBl, index)
        idRGBC = app.charIDToTypeID("RGBC")
        desc23.putObject(idClr, idRGBC, desc24)
        idSolidColorLayer = app.StringIDToTypeID("solidColorLayer")
        desc22.putObject(idType, idSolidColorLayer, desc23)
        idContentLayer2 = app.StringIDToTypeID("contentLayer")
        desc21.putObject(idUsng, idContentLayer2, desc22)
        app.executeAction(idMk, desc21, ps.DialogModes.DisplayNoDialogs)

        # Select mask.
        idSlct = app.charIDToTypeID("slct")
        desc38 = ps.ActionDescriptor()
        idNull1 = app.charIDToTypeID("null")
        ref20 = ps.ActionReference()
        idChnl1 = app.charIDToTypeID("Chnl")
        idChnl2 = app.charIDToTypeID("Chnl")
        idMsk = app.charIDToTypeID("Msk ")
        ref20.putEnumerated(idChnl1, idChnl2, idMsk)
        desc38.putReference(idNull1, ref20)
        idMkVs = app.charIDToTypeID("MkVs")
        desc38.putBoolean(idMkVs, False)
        app.executeAction(idSlct, desc38, ps.DialogModes.DisplayNoDialogs)

        app.activeDocument.activeLayer.invert()

Revert Changes

"""This example demonstrates how to roll back history."""

# Import local modules
from photoshop import Session


with Session() as ps:
    doc = ps.active_document
    old_state = doc.activeHistoryState
    print(old_state.name)
    doc.artLayers.add()
    last_state = doc.activeHistoryState
    print(last_state.name)
    doc.activeHistoryState = old_state
    print(doc.activeHistoryState.name)

Export Document With Options

"""This example demonstrates how to export a document with different formats.

References:
    https://github.com/loonghao/photoshop-python-api/issues/368
"""

# Import built-in modules
import os

# Import third-party modules
from photoshop import Session
from photoshop.api.enumerations import DitherType
from photoshop.api.enumerations import ExportType
from photoshop.api.enumerations import SaveDocumentType
from photoshop.api.save_options.png import PNGSaveOptions
from photoshop.api.save_options.jpg import JPEGSaveOptions
from photoshop.api.save_options.png import ExportOptionsSaveForWeb


def main():
    """Export document with different formats."""
    psd_file = os.path.join(os.path.dirname(__file__), "files", "export_layers_as_png.psd")
    if not os.path.exists(psd_file):
        raise FileNotFoundError(
            f"File not found: {psd_file}"
        )

    # Start a new photoshop session
    with Session(psd_file, "open") as ps:
        doc = ps.active_document

        # Export as PNG-24
        png_path = os.path.join(os.path.dirname(__file__), "exported_png24.png")
        png_options = PNGSaveOptions()
        png_options.interlaced = False  # Disable interlacing for better quality
        png_options.compression = 0  # Set compression to 0 for maximum quality
        doc.saveAs(png_path, png_options, True)  # True for saving as copy
        print(f"Exported PNG-24: {png_path}")

        # Export as JPEG with high quality
        jpg_path = os.path.join(os.path.dirname(__file__), "exported_jpeg.jpg")
        jpg_options = JPEGSaveOptions()
        jpg_options.quality = 12  # Set quality to maximum (12)
        jpg_options.embedColorProfile = True  # Preserve color profile
        jpg_options.formatOptions = 1  # Use standard baseline format
        jpg_options.scans = 3  # Enable progressive scanning
        jpg_options.matte = 1  # No background color (matte)
        doc.saveAs(jpg_path, jpg_options, True)  # True for saving as copy
        print(f"Exported JPEG: {jpg_path}")

        # Export as GIF using Save for Web
        gif_path = os.path.join(os.path.dirname(__file__), "exported_gif.gif")
        gif_options = ExportOptionsSaveForWeb()
        gif_options.format = SaveDocumentType.CompuServeGIFSave  # Set format to GIF
        gif_options.colors = 256  # Use maximum number of colors (256)
        gif_options.dither = DitherType.NoDither  # Disable dithering for sharper edges
        gif_options.transparency = True  # Preserve transparency in the GIF
        doc.exportDocument(gif_path, ExportType.SaveForWeb, gif_options)
        print(f"Exported GIF: {gif_path}")


if __name__ == "__main__":
    main()

Fit On Screen

"""Let the current document Fit on screen."""

# Import local modules
from photoshop import Session


with Session() as ps:
    ps.app.runMenuItem(ps.app.charIDToTypeID("FtOn"))

Last update: 2025-01-07
Created: 2025-01-07