Bash in Windows

timelapse videót készítek házépítésről egy rpi zeroval, de nem ez a fontos, hanem rá akartam rakni a képekre a készítés dátumát. Tudtam, hogy imagemagick lesz a barátom, de nem tudtam volna sima batch fileba összerakni a cimkézést. Illetve biztos összeguglizom, de tovább tartott volna, mint elővenni a bash-t windowson és a következő kis scripttel minden képkockára ráraktam a készítés időpontját. Utána összefűzni VirtualDubbal már gyerekjáték volt.
800x600 -as képekkel dolgoztam. Lehetne még persze optimalizálni... A lényeg, mennyire örülök a bash-nak :)


# !/bin/bash
i=1

until [ $NOTFOUND ] ; do
FILE="$i.jpg"
if [ -f $FILE ]; then
CDATE=$(exiftool -s -s -s -CreateDate $FILE)
CDATE=${CDATE::-3} # nem kell a másodperc
CDATE=$(echo $CDATE | awk 'NR==1,/:/{sub(/:/, ".")} 1') # dátumban az első kettőspont cseréje pontra
CDATE=$(echo $CDATE | awk 'NR==1,/:/{sub(/:/, ".")} 1') # második csere
TFILE=${FILE::-3}png # png lesz az output, ne legyen veszteség a jpg újratömörítés miatt
convert "$FILE" -rotate 180 -fill '#0008' -draw 'rectangle 4,570,208,595' -fill white -gravity southwest -pointsize 20 -font Nimbus-Mono-Regular -annotate +10+5 "$CDATE" "$TFILE"
let i=i+1
else
NOTFOUND=1
fi
done
let i=i-1
echo "Labeled $i files"

Hozzászólások

Vagy ott van a PowerShell. Konkrétan így lehet kinyerni a készítés dátumát egy JPG-ből:


$file = Get-ChildItem 'itt/van/a/kep.jpg'

Add-Type -AssemblyName 'System.Drawing'
$image = [System.Drawing.Image]::FromFile($file)

$ExifOriginalDateTime=0x9003 # innen: http://forensicswiki.org/wiki/Exif
$dateAsBytes = $image.GetPropertyItem($ExifOriginalDateTime).Value

# ha stringként kell:
$encoding = New-Object 'System.Text.ASCIIEncoding'
$dateAsString = $encoding.GetString($dateAsBytes)

# ha DateTime objektumként kell:
$format = "yyyy:MM:dd HH:mm:ss`0"
$dateAsDateTime=[DateTime]::ParseExact($dateAsString, $format, $null)

Innen már könnyű összerakni, a DateTime objektum ToString-jének adhatsz egy másik format stringet, a convert hívás meg ugyanaz.

exiftool -s -s -s -CreateDate -dateFormat '%Y.%m.%d %H:%M' "$FILE"

Köszi a tippeket.
Lehet kiváncsiságból csinálok egy összehasonlítást, melyik mennyi idő alatt fut le kb 3000 kockára