Contact us
Leave a message

Mitglied bei

Logo "Bündnis '90/Die Grünen"
B'90/Grüne, OV Lehrte
Logo "Gospelchor 'Swing Low', Markus-Gemeinde, Lehrte"
Gospelchor "Swing Low", Markus-Gemeinde, Lehrte
Logo "Verein zum Erhalt klassischer Computer"
Verein zum Erhalt klassischer Computer

Automatismus

Realisiert wurden die Verarbeitungsketten mittels der Kommandozeilen-Bildbearbeitung ImageMagick. Hier Shellskript, das die eine bequeme Cartoonisierung einer beliebigen Anzahl Bilder erlaubt:

cartoonize

#!/bin/sh

VERSION=1.0.0

black=          # -b
colors=12       # -c
dither=+dither  # -d
format=         # -f
tmpmap=         # -m
outline=1       # -o
prefix=toon_    # -p
quality=100     # -q
resize_to=      # -r
saturation=200  # -s
threshold=80    # -t
suffix=         # -u
white=          # -w
colorspace=srgb # -y

function printUsage() {
  echo
  echo "cartoonize - Convert photos into cartoon-style images."
  echo "Version $VERSION"
  echo "-----------------------------------------------------------------------"
  echo "Usage: cartoonize [options] <file_pattern> [<file_pattern>...]"
  echo "with possible options:"
  echo "-?              : Display this message and exit."
  echo "-b              : Definitely include pure black into the color map"
  echo "                  finally applied to the image."
  echo "-c <colors>     : Use image file specified by path <colors> as palette,"
  echo "                  if exsists; else <colors> specifies the max. number"
  echo "                  of colors to be used. In the latter case, 0 means no"
  echo "                  color reduction. [$colors]"
  echo "-d              : Allow dithering."
  echo "-f <format>     : Convert cartoonized images to <format>."
  echo "-m              : Create on-the-fly and use a colormap of the original"
  echo "                  image for color reduction."
  echo "-o <outline>    : Outline width in pixels. [$outline]"
  echo "-p <prefix>     : String to be prepended to file name. [$prefix]"
  echo "-q <quality>    : Compression quality in percent. [$quality]"
  echo "-r <resize_to>  : Width/height of cartoonized image as imagemagick"
  echo "                  geometry specification [$resize_to]"
  echo "-s <saturation> : Percent by which to change color saturation. [$saturation]"
  echo "-t <threshold>  : Defines which lightness level (in percent) separates"
  echo "                  black from white; increase to emphasize outlines."
  echo "                  [$threshold]"
  echo "-u <suffix>     : String to be appended to filename, but before"
  echo "                  extension. [$suffix]"
  echo "-w              : Definitely include pure white into the color map"
  echo "                  finally applied to the image."
  echo "-y <color_space>: Color space to be used for color reduction. Good"
  echo "                  results are obtained with lab, srgb, yiq and yuv."
  echo "                  [$colorspace]"
  echo "Requires ImageMagick to be installed and in PATH."
}

while getopts ": b c: d f: m o: p: q: r: s: t: u: w y:" option; do
  case $option in
    b ) black=1;;
    c ) colors=$OPTARG;;
    d ) dither=-dither;;
    f ) format=$OPTARG;;
    m ) tmpmap=1;;
    o ) outline=$OPTARG;;
    p ) prefix=$OPTARG;;
    q ) quality=$OPTARG;;
    r ) resize_to=$OPTARG;;
    s ) saturation=$OPTARG;;
    t ) threshold=$OPTARG;;
    u ) suffix=$OPTARG;;
    w ) white=1;;
    y ) colorspace=$OPTARG;;
    \?) printUsage
        exit 1;;
    * ) printUsage
        exit 1;;
  esac
done

threshold="$threshold%"

resize=
if [ $resize_to ]; then resize="-resize ${resize_to}"; fi

sigma1=$outline
if [ $sigma1 -eq 1 ]; then sigma1=2; fi
radius1=$(($sigma1*2))

radius2=$outline
if [ $radius2 -eq 1 ]; then radius2=2; fi
sigma2=$(($radius2/2))

shift $((OPTIND-1))
OPTIND=1

if [ ! "$@" ]; then printUsage; exit 1; fi

for path in "$@"; do

  name=${path%.*}
  name=${name##*/}
  dir=${path%$name*}

  if [ $format ]; then
    ext=$format
  else
    ext=${path#*.}
  fi

  echo Cartoonizing $path \=\> $dir$prefix$name$suffix.$ext...

  if [ -f "$colors" ]; then
    convert $resize "$path" -modulate 100,$saturation,100 -blur ${radius1}x$sigma1 \
      -quantize $colorspace $dither -map "$colors" "${dir}color_$name.png"
  else
    if [ $colors -eq 0 ]; then
      convert $resize "$path" -modulate 100,$saturation,100 -blur ${radius1}x$sigma1 \
        "${dir}color_$name.png"
    else
      if [ $tmpmap ]; then
        addcols=""
        if [ $black ]; then
          addcols="( -size 1x1 xc:black ) +append"
        fi
        if [ $white ]; then
          addcols="$addcols ( -size 1x1 xc:white ) +append"
        fi
        convert "$path" -quantize $colorspace -colors $colors -unique-colors \
          -modulate 100,$saturation,100 $addcols -filter point -resize 1600% "${dir}map_$name.png"
        convert $resize "$path" -modulate 100,$saturation,100 -blur ${radius1}x$sigma1 \
          $dither -quantize $colorspace -map "${dir}map_$name.png" "${dir}color_$name.png"
        rm "${dir}map_$name.png"
      else
        convert $resize "$path" -modulate 100,$saturation,100 -blur ${radius1}x$sigma1 \
          $dither -quantize $colorspace -colors $colors "${dir}color_$name.png"
      fi
    fi
  fi

  convert $resize "$path" -negate -blur $radius2x$sigma2 -edge $outline -type Grayscale \
    -negate -normalize -sigmoidal-contrast 20x$threshold "${dir}outline_$name.png"
  composite -compose Multiply "${dir}color_$name.png" "${dir}outline_$name.png" \
    -quality $quality -depth 8 "$dir$prefix$name$suffix.$ext"

  rm "${dir}color_$name.png"
  rm "${dir}outline_$name.png"

done

Findige ImageMagicker werden natürlich ohne temporäre Dateien auskommen und alle Verarbeitungsschritte in einer einzigen Kommandozeile erledigen, die bis zum Mond reicht. ;-)