Function plugins
cPicture supports function plug-ins to process/display selected pictures.
The Plug-In is a DLL-File located in the same folder as cPicture and starts with 'cpp_'. For example 'cpp_fp1.dll'.
Click the function plug-ins button in the menu ribbon to display all installed plug-ins.
Sample 1
Sample 2
Sample 3
Script plugin
The script plugins for batch files and powershell files are consolidated into one script plugin, which also adds python script files.
The new plugin is available from the plugins option in cPicture.
Note: The old plugins are still valid, but should be removed as they cause duplicate entries (delete cpp_bat_script.dll and cpp_ps1_script.dll in the plugins folder).
Example batch script
@echo OFF
echo file=%1
echo name=%2
echo dir=%3
echo width=%4
echo height=%5
echo sequence number=%6
echo number of files=%7
REM wait for user to close the console
pause
Example PowerShell script
<#
.DESCRIPTION
Example PowerShell script to print the picture data
.NOTES
This example is using the default cPicture custom data template
for the $picture_data.cdata value.
This value can be changed in the Settings (F9).
The .DESCRIPTION text is used for the menu tooltip.
#>
# plugin variables
# Do not remove the leading # of the variable #[...]:
# console=true (default) displays a console, use this option for scripts with text output.
#[console=true]
# noexit=true keeps the console open, set to 'false' (default) to have the console closed when processing is done. This variable is only used when #[console=true].
#[noexit=false]
param
(
[Parameter(Mandatory=$true)]
[string]$picture_data_json
)
# Get the picture data.
$picture_data_set = ConvertFrom-Json -InputObject $picture_data_json
# Print the number of pictures.
[int]$size = $picture_data_set.length
Write-Host "$size picture(s):" -ForegroundColor White
Write-Host ("-" * 15)
Write-Host
# Print the picture data.
[int]$i = 1
foreach ($picture_data in $picture_data_set) {
# Example:
# $picture_data.file : c:\Bilder\bild1.jpg
# $picture_data.name : bild1.jpg
# $picture_data.dir : c:\Bilder\
# $picture_data.width : 3712
# $picture_data.height : 5568
# $picture_data.audio : false
# $picture_data.video : false
# $picture_data.colorprofile : false
# $picture_data.gps : N 47° 37' 0,872498" W 122° 19' 32,021484"
# $picture_data.aperture : 5.6 # f/5.6
# $picture_data.shutterspeed : 1250 # 1/1250s
# $picture_data.iso : 100
# $picture_data.exifdate : 133553225690000000
# $picture_data.exifdate_str : 19.03.2024 11:49:29
# $picture_data.model : NIKON Z 30
# $picture_data.lens : 16-50mm f/3,5-6,3 VR f=44mm/66mm
# $picture_data.cdata : # Configurable with F9
# name : Pike-Place-Market-Kreuzung-360x180.jpg
# dir : C:\Bilder\
# size : 1624x812 Bildpunkte
# model : [NIKON Z 30]
# settings : 1/1250s ISO 100/21°
# contains : Kommentar, XMP, Farbprofil,
# gps : N 47° 37' 0,872498" W 122° 19' 32,021484"
# file_size : 835 KB (855189 Bytes)
# file_create_date : Dienstag, 19. März 2024 um 11:49:29 Uhr
# file_modified_date : Dienstag, 19. März 2024 um 11:49:29 Uhr
# exif_date : Dienstag, 19. März 2024 um 11:49:29 Uhr
[int]$MP = $picture_data.width * $picture_data.height / 1000000
"Picture '{0}' ({4} of {5}) with {1}x{2} pixel ({3}MP)" -f $picture_data.file, $picture_data.width, $picture_data.height, $MP, $i, $size
" name='$($picture_data.name)', dir='$($picture_data.dir)'`n"
# Enumerate all data fields.
foreach ($data in $picture_data.PSObject.Properties) {
Write-Host " $($data.Name)" -ForegroundColor Green -NoNewline
Write-Host ": " -NoNewline
Write-Host "$($data.Value)" -ForegroundColor Blue
}
<#
Use ConvertFrom-Json when cdata is a json array to access the data elements.
Otherwise cdata is arbitrary text and use $picture_data.cdata as a string, for example: Write-Host $picture_data.cdata
#>
# The default setting for the data is a JSON array matching the tooltip data in cPicture.
$cdata = ConvertFrom-Json -InputObject $picture_data.cdata
# Example usage:
# Use specific data field.
Write-Host $cdata.model -ForegroundColor Yellow
# Enumerate all data fields.
Write-Host "$($cdata.psobject.properties.Value.Count) elements in `$picture_data.cdata:"
foreach ($data in $cdata.psobject.properties) {
Write-Host " $($data.Name)" -ForegroundColor Green -NoNewline
Write-Host ": " -NoNewline
Write-Host "$($data.Value)" -ForegroundColor Blue
}
"-" * 70
$i++
}
# Use this to pause the console when using the #[console=true] option.
# Do not use when #[console=false] as the console is not displayed.
Write-Host "Press any key to continue ..."
[void]$host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
Example Python script
"""
Description: Example python script to print the picture data
"""
# plugin variables
# Do not remove the leading # of the variable #[...]:
# console=true (default) displays a console, use this option for scripts with text output.
#[console=true]
# noexit=true keeps the console open, set to 'false' (default) to have the console closed when processing is done. This variable is only used when #[console=true].
#[noexit=true]
import json
import sys
import base64
COLORS = {
"red": "\033[31m",
"green": "\033[32m",
"yellow": "\033[33m",
"blue": "\033[34m",
"magenta": "\033[35m",
"cyan": "\033[36m",
"white": "\033[37m",
"reset": "\033[0m"
}
def colored_text(text, color):
return f"{COLORS.get(color, COLORS['reset'])}{text}{COLORS['reset']}"
# Get the picture data.
def picture_data(base64_string):
# Decode base64 string
json_string = base64.b64decode(base64_string).decode('utf-8').rstrip('\0')
# Parse JSON string
data = json.loads(json_string)
# Print the number of pictures.
print(f"{len(data)} picture(s): {"-" * 15}")
print()
# Print the picture data for each selected picture.
for i, item in enumerate(data):
# Example:
# item["file"] : c:\Bilder\bild1.jpg
# item["name"] : bild1.jpg
# item["dir"] : c:\Bilder\
# item["width"] : 3712
# item["height"] : 5568
# item["audio"] : false
# item["video"] : false
# item["colorprofile"] : false
# item["gps"] : N 47° 37' 0,872498" W 122° 19' 32,021484"
# item["aperture"] : 5.6 # f/5.6
# item["shutterspeed"] : 1250 # 1/1250s
# item["iso"] : 100
# item["exifdate"] : 133553225690000000
# item["exifdate_str"] : 19.03.2024 11:49:29
# item["model"] : NIKON Z 30
# item["lens"] : 16-50mm f/3,5-6,3 VR f=44mm/66mm
# item["cdata"] : # Configurable with F9
print(colored_text(f"Picture {i+1}:", "yellow"))
mp = int(item["width"] * item["height"] / 1000000)
print(f"Picture '{item["file"]}' ({i+1} of {len(data)}) with {item["width"]}x{item["height"]} pixel ({mp}MP)")
print(f" name='{item["name"]}', dir='{item["dir"]}'")
print()
for key, value in item.items():
print(colored_text(f" {key}", "green"), end="")
print(": ", end="")
print(colored_text(f"{value}", "cyan"))
print()
# Use specific cdata field.
element_name = "Modell"
if 'cdata' in item and len(item['cdata']) > 0:
element_value = item['cdata'][0].get(element_name, None)
print(f"Value of cdata element '{element_name}': {element_value}")
else:
print(f"cdata element '{element_name}' not found.")
# Print cdata elements if they exist.
if 'cdata' in item:
print(f"{len(item['cdata'][0])} elements in cdata")
for i, cdata_item in enumerate(item['cdata']):
for key, value in cdata_item.items():
print(colored_text(f" {key}", "green"), end="")
print(": ", end="")
print(colored_text(f"{value}", "cyan"))
print("-" * 70)
if __name__ == "__main__":
if len(sys.argv) == 2:
picture_data(sys.argv[1])
HDR enfuse
This plugin uses the enfuse tool to create a HDR picture from at least 2 pictures.
QR-Code
Overlays a QR code onto your pictures. Enter any text or URL, choose the corner position, and adjust size and margin with sliders.
Time Capsule
This function plugin creates a story poster from multiple selected pictures with title, route strip, location clusters, summary and thumbnails. The dialog lets you configure the sorting mode, location radius and thumbnail size.
The route is built from available GPS data and linked to the picture thumbnails, creating a visual summary of a trip, series or shoot.

Created with cPicture's map view:
X-Ray
This function plugin creates an analysis board for each selected picture with the original view, an edge map, an 8x8 block analysis and a combined heat map. Scale, sensitivity and the optional 8x8 grid can be configured in the dialog.
The output helps highlight structures, compression artifacts and visually suspicious image regions.

Motion Composer
This function plugin combines multiple pictures into a single composition with motion and trail effects. Output size, threshold and optional trail colorization are configured in the dialog.
It is especially useful for sequences with movement, such as people, vehicles or repeated actions.

Composed from these two pictures:
Created with the Sample plugin #5
Download the plugin from Function plug-ins menu and select Manage in cPicture.
Postage
This function plugin turns selected pictures into postage stamps with a perforated border.
The dialog lets you configure the paper style, border spacing, text, text corner, font and text color.


Index print created with cPicture
(Perforation 4, Distance 8, Offwhite paper with default font, Standard Index print with no border)
Structure and details
A function plug-ins will be executed in 3 steps. The following example displays a message box for each step.
Step 1
The function start(...) will be called with a list of all selected pictures. In this first sample, all picture names will displayed in the message box:
Step 2
The function process_picture(...) will be called for each selected picture:
Step 3
The funktion end() will be called last:
The return value determines which pictures were modified/deleted or added. cPicture adjusts the display accordingly.
cPicture can supply each picture with additional picture data. This is controlled by the return value of start(...). With this you can easily create external display applications (example above) or simply call a script or an external program. The execution stops if the return value is set to 'false'.
Download
Download the plugin from Function plug-ins menu and select Manage in cPicture.
C++ plugin source code on github