哈苏 6x6 胶片画册感边框工具
289 7
[1 楼] xjames007 [泡菜]
1-11 11:49
全由gemeni写的代码
本工具专为 6x6 中画幅玩家设计,旨在模拟画册排版,自动为扫描件添加精致边框及 EXIF 参数。
智能参数:自动提取镜头、快门、光圈等 EXIF 信息并优雅排版。
专业胶卷库:内置 Portra, Ektar, Gold, Provia, Velvia, 160NS, HP5 等 20+ 款经典型号,支持自动标准化命名。
动态交互(新) 若扫描信息缺失,脚本会暂停弹出输入框,支持输入简称(如 v50, gold)自动匹配全称。
阴影质感:自带微阴影效果,提升照片立体感。
🛠️ 使用说明环境:需安装 ExifTool 和 ImageMagick。
运行:将照片直接拖拽到 .bat 脚本上即可。
交互:若遇到库外胶卷,按提示输入或直接回车。

示例




bat放在github上了:链接

(请将下方代码复制到记事本,另存为“hasselblad_border.bat”,编码选 UTF-8)
@echo off
rem --- Set environment for UTF-8 support / 设置环境支持UTF-8编码 ---
chcp 65001 >nul
setlocal enabledelayedexpansion

echo ======================================================
echo    6x6 Medium Format Border Tool - v18.1 (Pro Library)
echo ======================================================

:loop
rem --- Check if input files are remaining / 检查是否还有待处理的输入文件 ---
if "%~1" == "" goto end

set "t=%time: =0%"
set "timestamp=%t:~0,2%%t:~3,2%%t:~6,2%"

rem --- [1. Extract Metadata / 提取元数据] ---
for /f "delims=" %%a in ('exiftool -s -s -s -Make "%~1"') do set "Make=%%a"
for /f "delims=" %%a in ('exiftool -s -s -s -Model "%~1"') do set "Model=%%a"
for /f "delims=" %%a in ('exiftool -s -s -s -LensModel "%~1"') do set "Lens=%%a"
for /f "delims=" %%a in ('exiftool -s -s -s -ExposureTime "%~1"') do set "Shutter=%%a"
for /f "delims=" %%a in ('exiftool -s -s -s -FNumber "%~1"') do set "Aperture=%%a"
for /f "delims=" %%a in ('exiftool -s -s -s -ImageDescription "%~1"') do set "RawDesc=%%a"

rem --- [2. Film Stock Library Matching / 胶卷库标准化匹配] ---
set "FilmName="
set "TargetName=!RawDesc!"
if "!TargetName!"=="" set "TargetName=CUSTOM FILM"

:MatchLibrary
set "TN=!TargetName!"
rem --- Kodak Section / 柯达系列 ---
echo !TN! | findstr /I "Portra" | findstr "400" >nul && set "FilmName=KODAK PORTRA 400"
echo !TN! | findstr /I "Portra" | findstr "160" >nul && set "FilmName=KODAK PORTRA 160"
echo !TN! | findstr /I "Ektar" >nul && set "FilmName=KODAK EKTAR 100"
echo !TN! | findstr /I "Gold" >nul && set "FilmName=KODAK GOLD 200"
echo !TN! | findstr /I "Tri-X" >nul && set "FilmName=KODAK TRI-X 400"
echo !TN! | findstr /I "TMAX" | findstr "100" >nul && set "FilmName=KODAK T-MAX 100"
echo !TN! | findstr /I "TMAX" | findstr "400" >nul && set "FilmName=KODAK T-MAX 400"
echo !TN! | findstr /I "E100VS" >nul && set "FilmName=KODAK EKTACHROME 100VS"

rem --- Fuji Section / 富士系列 ---
echo !TN! | findstr /I "Provia" >nul && set "FilmName=FUJI PROVIA 100F"
echo !TN! | findstr /I "Velvia" | findstr "50" >nul && set "FilmName=FUJI VELVIA 50"
echo !TN! | findstr /I "Velvia" | findstr "100" >nul && set "FilmName=FUJI VELVIA 100"
echo !TN! | findstr /I "Astia" >nul && set "FilmName=FUJI ASTIA 100F"
echo !TN! | findstr /I "400H" >nul && set "FilmName=FUJI PRO 400H"
echo !TN! | findstr /I "160NS" >nul && set "FilmName=FUJI 160NS"

rem --- Ilford Section / 伊尔福系列 ---
echo !TN! | findstr /I "HP5" >nul && set "FilmName=ILFORD HP5 PLUS"
echo !TN! | findstr /I "FP4" >nul && set "FilmName=ILFORD FP4 PLUS"
echo !TN! | findstr /I "Delta" | findstr "100" >nul && set "FilmName=ILFORD DELTA 100"
echo !TN! | findstr /I "Delta" | findstr "400" >nul && set "FilmName=ILFORD DELTA 400"

rem --- Logic Flow: Skip if matched / 逻辑流:匹配成功则跳过 ---
if not "!FilmName!"=="" goto :ProcessRender
if "!Interacted!"=="YES" goto :ProcessRender

:UserInteraction
set "Interacted=YES"
echo.
echo ------------------------------------------------------
echo [UNRECOGNIZED] Raw Info: "!TargetName!"
echo [ACTION] Enter shorthand (e.g., gold200, 160ns, v50):
echo [提示] 输入简称 (如 gold200, 160ns, v50):
set "UserInput="
set /p "UserInput=> "
if "!UserInput!"=="" (set "FilmName=!TargetName!" & goto :ProcessRender)
set "TargetName=!UserInput!"
goto :MatchLibrary

:ProcessRender
set "Interacted="
echo [CONFIRMED] Film Stock: !FilmName!
echo ------------------------------------------------------

rem --- [3. Camera and Param Layout / 相机与参数排版] ---
set "CameraBrand=!Make! !Model!"
if /I "!Make!"=="Hasselblad" set "CameraBrand=HASSELBLAD !Model!"

set "InfoLine=!Lens!"
if not "!Shutter!"=="" (
    if not "!Aperture!"=="" (set "InfoLine=!Lens!  ^|  !Shutter!s f/!Aperture!  ^|  !FilmName!") else (set "InfoLine=!Lens!  ^|  !Shutter!s  ^|  !FilmName!")
) else (
    if not "!Aperture!"=="" (set "InfoLine=!Lens!  ^|  f/!Aperture!  ^|  !FilmName!") else (set "InfoLine=!Lens!  ^|  !FilmName!")
)

rem --- [4. ImageMagick Rendering / ImageMagick 渲染引擎] ---
echo [PROCESSING] %~n1 ...
magick "%~1" -resize 2400x2400 ^
-bordercolor white -border %%[fx:w*0.04] ^
-background white -gravity South -splice 0x%%[fx:h*0.13] ^
-font "Palatino-Linotype-Bold" -fill "#1a1a1a" -kerning 6 -pointsize %%[fx:w*0.032] ^
-annotate +0+%%[fx:h*0.078] "!CameraBrand!" ^
-font "Garamond" -fill "#555" -kerning 4 -pointsize %%[fx:w*0.024] ^
-annotate +0+%%[fx:h*0.040] "!InfoLine!" ^
-bordercolor "#eee" -border 1 ^
( +clone -background black -shadow 60x25+0+15 ) +swap ^
-background none -layers merge +repage ^
"%~dp1%~n1_Border_!timestamp!.png"

echo [SUCCESS] Task completed / 处理完成。
echo.
shift
goto loop

:end
echo.
echo ======================================================
echo    Batch Completed! / 批量处理已完成!
echo ======================================================
pause

xjames007 编辑于 2026-01-11 11:56
[8 楼] 易水铖 [陈年泡菜]
1-14 10:27
xjames007 发表于 2026-01-14 09:13
可以试下exiftool,一个命令行工具,以前需要自己翻手册写命令很蛋疼,现在有AI辅助就很好用了。我看老哥你也用500C/M,如果是手机测光的话,lightme app配合lightlog,最后将exif信息自动写入底扫文件还有一整套工作流,用的很爽

有空尝试一下这个exiftool工具。
[7 楼] xjames007 [泡菜]
1-14 09:15

继续开发,准备做个contact sheet(全卷缩略图)软件,模仿整卷胶片在观片器上的感觉
[6 楼] xjames007 [泡菜]
1-14 09:13
易水铖 发表于 2026-01-12 18:05
Photo Meta Editor
目前用过相对功能比较可靠的应用了,其它的exif修改工具也尝试过,现在基本用这个了,虽然也有需要改进的地方。

可以试下exiftool,一个命令行工具,以前需要自己翻手册写命令很蛋疼,现在有AI辅助就很好用了。我看老哥你也用500C/M,如果是手机测光的话,lightme app配合lightlog,最后将exif信息自动写入底扫文件还有一整套工作流,用的很爽
[4 楼] 易水铖 [陈年泡菜]
1-12 18:05
瞬间的震撼 发表于 2026-01-12 17:49
这个应用叫什么名字?

Photo Meta Editor

目前用过相对功能比较可靠的应用了,其它的exif修改工具也尝试过,现在基本用这个了,虽然也有需要改进的地方。
[3 楼] 瞬间的震撼 [资深泡菜]
1-12 17:49
易水铖 发表于 2026-01-12 13:50
不错的工具!
我是花钱买了一个MacOS应用来生成胶片的拍摄信息。

这个应用叫什么名字?
[2 楼] 易水铖 [陈年泡菜]
1-12 13:50
不错的工具!

我是花钱买了一个MacOS应用来生成胶片的拍摄信息。