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. 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 square 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
-
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 a number of Photoshop action sets, Poserframes2x3.atn, Poserframes4x3.atn, Poserframes4x5.atn, Poserframes6x7.atn, PoserframesSquare.atn, PoserframesAuto.atn and PoserframesAutoBurn.atn.
-
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.
-
Restart Photoshop and make sure Poserframes shows up in the menu File/Automate.
-
Install the Photoshop actions by double-clicking on the files Poserframes2x3.atn, Poserframes4x3.atn, Poserframes4x5.atn, Poserframes6x7.atn, PoserframesSquare.atn, PoserframesAuto.atn and PoserframesAutoBurn.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. It does this by sampling five random pixels in your image to check if they are greyscale or color. This is not a foolproof method (i.e. some black and white images actually contain a little color) and because of this, I recommend that you bypass this color check by adding the keyword color
or 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.
Style gallery
These are rendered frames in all the different aspect ratios, both in crop mode and fancy mode, with all the available scanner mask styles. For 4:3 and 1:1, all frames are rendered with the standard negative style, but additional negative styles are shown with one of the mask styles. By playing with border thickness (when fancy = false
) and movement you can create a wide range of looks.
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):
- fancy: If set to
true
, the script will simulate a scan with visible scan mask edges. If you like a cropped look, set this tofalse
. - halation: If set to
true
the script will render halation on the film rebate adjacent to bright border pixels. - burn_mask_edges: If set to
true
the edges of the scanner mask will be burned and the contrast increased. - transparent_matte: If set to
true
scanner artefacts will be omitted and the outside of the black scanner mask will be transparent. - 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 tofalse
for a crisper look. - mask_variant_35mm: The style of scanner mask to use with 2:3 images. The script comes with eight styles, numbered from
1
to8
. If set toauto
, a random style will be used. - mask_variant_645: The style of scanner mask to use with 4:3 images. The script comes with five styles, numbered from
1
to5
. If set toauto
, a random style will be used. - mask_variant_67: The style of scanner mask to use with 6:7 images. The script comes with three styles, numbered from
1
to3
. If set toauto
, a random style will be used. - mask_variant_45: The style of scanner mask to use with 4:5 images. The script comes with two styles, numbered from
1
to2
. If set toauto
, a random style will be used. - mask_variant_square: The style of scanner mask to use with square images. The script comes with three styles, numbered from
1
to3
. If set toauto
, a random style will be used. - negative_variant_square: The look of the negative, where
1
has a look drawn from Rolleiflex square formats and2
from Hasselblad square formats. - negative_variant_645: The look of the negative, where
1
has a look drawn from Pentax 645 negatives and2
from Contax 645 negatives. - matted_crop: If set to
true
the script will add a white border around a cropped frame. If set tofalse
no border will be added. - border_width_35mm: Border width (whole number/integer value) for 35mm format, when fancy =
false
. - border_width_645: Border width (whole number/integer value) for 645 format, when fancy =
false
. - border_width_67: Border width (whole number/integer value) for 6x7 format, when fancy =
false
. - border_width_45: Border width (whole number/integer value) for 4x5 format, when fancy =
false
. - border_width_square: Border width for square format, when fancy =
false
. - 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, from1
to400
. - 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
to100
. - 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
to100
. - 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
to100
. - 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
to100
. - 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 tobottomright
it will only move it towards the bottom right and when set totopleft
towards the top left. - filmburn: If set to
true
a film burn effect will be rendered, whilefalse
swithches the effect off. It can also take a third setting,monochrome
, which will render a more monochrome film burn. - jagged_filmburn: If set to
true
the rendered burn effect will have a jagged edge. If set tofalse
the burn edge will be smooth. - filmburn_min_reach: The minimum percentage of the image that the film burn effect may cover.
- filmburn_max_reach: The maximum percentage of the image that the film burn effect may cover.
- force_format: If set to one of the formats
35
,645
,67
,45
orsquare
the automatic format detection will be overridden and negative variant and a mask variant in that format will be stretched to fit your image. This setting is optional.
The full geeky syntax for a recipe looks like this:
[true|false]; [true|false]; [true|false]; [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]; [true|false|monochrome]; [true|false]; [1-100]; [1-100](; [35|645|45|67|square])
An actual recipe for the default settings, ready to copy-and-paste into Poserframes, looks like this:
true; true; true; false; true; 1; 1; 1; 1; 1; 1; 1; true; 20; 20; 20; 20; 20; 100; 0; 40; 0; 40; random; false; true; 10; 30
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.
How Poserframes uses aspect ratios
As a default, Poserframes calculates the aspect ratio of your image and matches that to the closest of the standard formats 2x3, 6x4.5 (645), 6x7, 4x5 or square. The shapes are drawn in those aspect ratios and the borders will look best if you keep your images close to those. However, Poserframes will stretch the shapes to accommodate whatever aspect ratio your image has. You can take advantage of this by bypassing the default format assignment (by adding the optional setting force_format, set to 35
, 645
, 45
, 67
or square
) and make Poserframes use the format you define. In this way, it’s possible to use a 6x7 scanner mask and negative style with a 645 image, for instance.
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:
- 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. - feather_factor_35mm: How much feathering of the border you like for 35mm. The lower value, the more feathering. Preset value is
1200
. - feather_factor_645: How much feathering of the border you like for 645. The lower value, the more feathering. Preset value is
1800
. - 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
. - feather_factor_45: How much feathering of the border you like for 4x5. The lower value, the more feathering. Preset value is
5400
. - mask_flip_probaility: The probability of the scanner mask being rotated 180 degrees. Initially set to
20
out of 100. - blue_artefacts_odds: The probability of rendering blue artefacts. Initially set to
20
out of 100. If set to100
, you’ll get blue artefacts on every run. - matted_border_size: The thickness of the white border in matted crop styles, given in percentages. Initially set to
10
.
These 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 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.
- 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 halation, burn mask edges, scanner artifacts and film burn 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 transparent_matte to
true
, you need to work with TIFF files for them to save with preserved transparency.
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.