User guide

Introduction

Poserframes is script plugin for Photoshop that draws black borders, inspired by film negatives scanned with visible rebate. It’s fueled by serendipity and randomly combines shapes, colors and movement in near infinite ways, making sure each rendered frame is unique.

Poserframes is designed and written by Joakim Hertze and made available “as is”, meaning I’m happy to receive feedback and comments, but I can’t promise to provide support. I’ve included common issues and workarounds at the end of this page. E-mail me at poserframes@hertze.se.

Overview of how to use Poserframes

If you install the script file and Photoshop actions as instructed below, it should work out of the box with images with a minimum short side of 1500 px. It is meant to be run by using one of the ready-made actions that comes with the script file, or by a droplet made from one of those actions. It will automatically apply a border, the style of which depends on whether it’s a 2:3 image, a 4:3 image, a 6:7 image, a 4:5 image or a 1:1 image.

If you want to, you can stop reading after the installation instructions below and start playing with the actions, or you can read on and learn how to create your own actions, batching folders of images and troubleshooting.

Installing and updating Poserframes

  1. Download and unzip the software, if the latter isn’t done automatically. The resulting folder contains the main script Poserframes.jsx, the companion script ExtractPath.jsx and a folder with five Photoshop action sets, Poserframes2x3.atn, Poserframes4x3.atn, Poserframes4x5.atn, Poserframes6x7.atn and Poserframes1x1x.atn.

  2. Quit Photoshop.

  3. Copy the script Poserframes.jsx to Photoshop’s scripts folder. On Mac it’s in /Applications/Photoshop 202x/Presets/Scripts and on Windows 10 it’s in C:\Program Files\Adobe\Adobe Photoshop 202x\Presets\Scripts. You may have to change the permissions of this folder to copy the script there.

  4. Start Photoshop and make sure Poserframes shows up in the menu File/Automate.

  5. Install the Photoshop actions by double-clicking on the files Poserframes2x3.atn, Poserframes4x3.atn, Poserframes4x5.atn, Poserframes6x7.atn and Poserframes1x1x.atn, or by loading them in the Actions palette.

If you want to update to a newer version of Poserframes you simply replace Poserframes.jsx in Photoshop’s scripts folder with a newer version. This will not affect your script settings if you use actions or droplets to run Poserframes. However, if you opt to use the script in legacy mode (see below), your settings will be lost when you update to a new script file.

Color or black and white?

The script tries to determine if your image is in color or in black and white, and then generates scanner artifacts in color or grey scale accordingly. Sometimes this fails (some black and white images actually contain a little color and some color images happen to have greyscale pixels at the center). Because of this, I recommend that you bypass this color check by adding the keyword color or the keyword bw to the file meta data of your image. This is easily done in Adobe Lightroom CC or Adobe Bridge and those keywords are passed on to exported images.

Using and editing the ready-made actions

The script comes with a number of ready-made starter actions, grouped by aspect ratios. Open an image in Photoshop and explore them! The actions contain recipes (script settings), that determines the look of the rendered border. As a default, the images won’t be saved after the script runs, leaving them intact. Because of this, the actions won’t work for automation (such as droplets) just yet. If you make a droplet at this stage you’ll be prompted to save the image on every droplet run.

When you’re ready to have an action save the resulting image, or when you want to edit the recipe of an action, expand the action (click on the right bracket) to show the recorded script name, Poserframes. When you double-click on this, a dialog will open where you can edit the saved recipe. Click the button labeled Use this recipe to save your changes. Sometimes Photoshop acts a little finicky and does not save the updated recipe, especially if you edit many actions one after another. If that happens, try closing the image you have open, open it again and then edit the action.

If you check Save and close when done the script will start saving and closing the image after it runs, so leave this unchecked while you’re still trying out different recipes.

Making droplets

Make sure to check Save and close when done in the dialog when you edit the script, when you’re ready to make a droplet from an action (such as for batch processing). Please refer to the Photoshop instructions for how to make a droplet.

Making your own actions

Make your own recipe actions by duplicating an existing action (click on the small hamburger menu in the upper right corner of the Actions palette and choose Duplicate) and change the name (by double-clicking on it) and edit the recipe as outlined above.

You can also record your own actions from scratch by having an image open and then click on the plus icon in the Actions palette, name the action and start recording. Choose Poserframes from the File/Automate menu, paste the recipe you want, make sure Save and close when done isn’t checked (otherwise the image will close and you can’t stop the recording) and click Use this recipe to run the script. When it’s finished, open the recipe again as outlined above, check Save and close when done and save the recipe, if you’re ready for the script to start saving your images.

You can make as many actions with different settings as you like.

How to build a recipe

A recipe is a text string with script settings that follows a specific syntax. It contains a number of settings, separated by a ; (semicolon) and an optional blank space for readability. All settings must always be specified and in the following order (the name of the setting in bold isn’t written in the recipe, only the value):

  1. fancy: If set to true, the script will simulate a scan with visible scan mask edges. If you like a cropped look, set this to false.
  2. artifacts: If set to true the script will add artifacts at the outside of the mask border, often seen with real film as a consequence of the scanning and editing process. Set it to false for a crisper look.
  3. mask_variant_35mm: The style of scanner mask to use with 2:3 images. The script comes with eight styles, numbered from 1 to 8.
  4. mask_variant_645: The style of scanner mask to use with 4:3 images. The script comes with five styles, numbered from 1 to 5.
  5. mask_variant_67: The style of scanner mask to use with 6:7 images. The script comes with three styles, numbered from 1 to 3.
  6. mask_variant_45: The style of scanner mask to use with 4:5 images. The script comes with two styles, numbered from 1 to 2.
  7. mask_variant_square: The style of scanner mask to use with square images. The script comes with three styles, numbered from 1 to 3.
  8. negative_variant_square: The look of the negative, where 1 has a look drawn from Rolleiflex square formats and 2 from Hasselblad square formats.
  9. negative_variant_645: The look of the negative, where 1 has a look drawn from Pentax 645 negatives and 2 from Contax 645 negatives.
  10. matted_crop: If set to true the script will add a white border around a cropped frame. If set to false no border will be added.
  11. border_width_35mm: Border width (whole number/integer value) for 35mm format, when fancy = false.
  12. border_width_645: Border width (whole number/integer value) for 645 format, when fancy = false.
  13. border_width_67: Border width (whole number/integer value) for 6x7 format, when fancy = false.
  14. border_width_45: Border width (whole number/integer value) for 4x5 format, when fancy = false.
  15. border_width_square: Border width for square format, when fancy = false.
  16. short_side_factor: Factor that changes the thickness of the short side of 2:3, 6:7 and square formats, when fancy = false. Given as a percentage, from 1 to 400.
  17. movement_min_long: Defines the floor (lowest value) for all possible image movements of the long edge from a centered position, given as a whole number from 0 to 100.
  18. movement_max_long: Defines the ceiling (highest value) for all possible image movements of the long edge from a centered position, given as a whole number from 0 to 100.
  19. movement_min_short: Defines the floor (lowest value) for all possible image movements of the short edge from a centered position, given as a whole number from 0 to 100.
  20. movement_max_short: Defines the ceiling (highest value) for all possible image movements of the short edge from a centered position, given as a whole number from 0 to 100.
  21. movement_direction: When set to random the script may move the image relative to the mask in all four directions (up/down/left/right). When set to bottomright it will only move it towards the bottom right and when set to topleft towards the top left.

The full geeky syntax for a recipe looks like this:

[true|false]; [true|false]; [1-8]; [1-4]; [1-3]; [1-2]; [1-3]; [1-2]; [1-2]; [true|false]; [1-300]; [1-99]; [1-99]; [1-99]; [1-99]; [0-100]; [0-100]; [0-100]; [0-100]; [random|bottomright|topleft]

An actual recipe for the default settings, ready to copy-and-paste into Poserframes, looks like this:

true; true; 1; 1; 1; 1; 1; 1; 1; true; 20; 20; 20; 20; 20; 100; 10; 100; 10; 100; random

How Poserframes uses movement

Poserframes always starts with your image centered in the frame and all movements are relative to this origin position. The extreme position is the furthest the image can move from that position (left, right, up and down) and this is hard coded in the script. Available movement is the difference between the extreme position and the origin position and how the script uses this is something you can control with script settings.

The settings movement_min_long and movement_max_long defines how much of that available movement that may be used on the axis perpendicular to the long side of the image, while the settings movement_min_short and movement_max_short defines how much of that available movement that may be used on the axis perpendicular to the short side of the image. The setting movement_direction controls if the image should be moved towards the bottom right, the top left or at random. In this way, you define a range of movement and a direction of movement.

All four movement settings are effectively percentages of the available movement. You define them pair-wise: movement_min_long and movement_max_long together, movement_min_short and movement_max_short together. By setting a pair to the same value, the image will always move to that percentage of the available movement. More useful is to set a pair to a floor and a ceiling value, so the script can move the image to a random percentage between the two.

EXAMPLE ONE: movement_min_long = 50; movement_max_long = 50. The script will always move the image 50% of the available movement along the axis perpendicular to the long side.

EXAMPLE TWO: movement_min_long = 10; movement_max_long = 80. The script will randomly move the image from 10% to 80% of the available movement along the axis perpendicular to the long side.

EXAMPLE THREE: movement_min_long = 0; movement_max_long = 0. The image will never move (and thus stays centered) along the axis perpendicular to the long side.

EXAMPLE FOUR: movement_min_long = 100; movement_max_long = 100. The image will always move to the extreme position along the axis perpendicular to the long side.

Using Poserframes without recipes (legacy mode) and hard-coded settings

The settings are hard coded at the top of the script file and are written as Javascript variable declarations, like this:

var fancy = true;

It’s important to keep this format when you make changes. Make sure the = or the ; doesn’t accidentally get deleted when you change a value. All variables must be declared, so make sure you don’t accidentally delete any lines.

To begin using the script without recipes you need to change the setting legacy to this:

var legacy = true;

If you want the script to save the images after it’s run change the setting save to this:

var save = true;

The hard coded settings are the same as the ones used in a recipe above. There are also a number of additional settings available in the script file:

  1. force_8_bit: When set to true, the script converts a 16 bit image to 8 bits, before running the spatter filter to dirty up outer mask edges. If set to false, no bit conversion takes place and the spatter filter is skipped.
  2. feather_factor_35mm: How much feathering of the border you like for 35mm. The lower value, the more feathering. Preset value is 1200.
  3. feather_factor_645: How much feathering of the border you like for 645. The lower value, the more feathering. Preset value is 1800.
  4. feather_factor_67_square: How much feathering of the border you like for square and 67. The lower value, the more feathering. Preset value is 2400.
  5. feather_factor_45: How much feathering of the border you like for 4x5. The lower value, the more feathering. Preset value is 5400.
  6. mask_flip_probaility: The probability of the scanner mask being rotated 180 degrees. Initially set to 20 out of 100.
  7. blue_artefacts_odds: The probability of rendering blue artefacts. Initially set to 20out of 100. If set to 100, you’ll get blue artefacts on every run.
  8. matted_border_size: The thickness of the white border in matted crop styles, given in percentages. Initially set to 10.
  9. var halation: If set to truethe script will render halation on the film rebate adjacent to bright border pixels.

These five settings are always active, even when the script is run in recipe mode.

Note that the setting movement_direction, also used in recipes, must be enclosed with quotation marks in the script file, like this:

var movement_direction = "random";

Troubleshooting and general tips

  • The error message “The document does not contain a selection” means the image dimensions are too small. For technical reasons your image needs to be at least 1500px on its shortest side for the script to run.
  • The error message “The command Play is not currently available” means actions or scripts are missing when Photoshop tries to run Poserframes from a droplet or other means of automation. Make sure you’ve followed the installation instructions above. Also, if you have several versions of Photoshop installed, make sure your droplet launches the correct version (the one with Poserframes installed). A workaround is to manually launch the correct version of Photoshop before you run your droplet.
  • After having updated to a new major Photoshop version, it seems you need to install the script PoserFrames.jsx in the new /Applications/Photoshop 202x/Presets/Scripts folder, or just move it over from the old folder. Remember to restart Photoshop afterwards and make sure Poserframes shows up in the menu File/Automate.
  • The script is designed to work with images in true 2:3, 4:3, 4:5, 6:7 or 1:1 formats. If your image has a crop that deviate from these aspects ratios it might still run, but the results will look odd.
  • If you feel the script is too slow, I’m sorry. I have just not found way to make JavaScript and Photoshop efficient together. The script is written with a progressive disclosure structure, however, which means it will run att different speeds depending on your settings. It will be fastest in crop mode with no added matte and slowest in fancy mode with scanner artifacts turned on.
  • Use the settings feather_factor_35mm, feather_factor_645, feather_factor_67_square and feather_factor_45 to control how fuzzy the mask edges and rebate edges appear for each aspect ratio. For most tastes, these settings should be left with their preset values.
  • If you set all movement variables to 100, I think it looks best to set artefacts to false.
  • I like to run the Film Grain, from the Archetype Process, on my images after I’ve run Poserframes. That way, the borders blend in nicely with the images. If you have Poserframes in fancy mode, you may want to remove the grain added to the white areas outside of the border. I use the magic wand in Photoshop, and fill the selection with white.

Using ExtractPath.jsx

Install this companion Photoshop script the same way as Poserframes. This script takes a path named Frame in your active Photoshop document, extracts all the path points and saves them to the desktop in the text file poserframes-path.txt in a format used in the Poserframes path library. I built this as a tool to save vectors in a textual format I could store inline in a script. If you feel adventurous, you can use this to add your own borders to Poserframes.

Credits

Thanks to Marc Holstein and Andreas Georgiou for providing me with scanned negatives. Also, many thanks to Tom Wright for his creative input.

License

Poserframes is made available under a Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.