Buttons mit Imagemagick generieren

April 08, 2008

Ok. viele hassen bereits diese Buzzwords wie Web 2.0 und eigentlich wollte ich es immer vermeiden :) Wie auch immer, hier ein Script das Buttons generiert wie man Sie auf vielen sogenannten Web 2.0 Seiten findet.

web2butt.sh

Anschließend findet man die generierten Buttons im Verzeichnis out.

So funktioniert es …

In der Datei buttons.txt ist die Beschriftung der generieren Buttons zu finden. Jede Zeile entspricht einem Button! Es ist somit ganz einfach mehre Text Dateien für Buttons mit unterschiedlichen Sprachen anzulegen.

Buttons Styles

Damit man einfach und schnell experimentieren kann habe ich die wichtigsten Variablen für das verändern der Buttons in einer externen Datei gespeichert. Diese sind im Verzeichnis styles zu finden.

# Autor:    Werner Hartnagel
# Date:     2008/04/01
# Button Style Green-yellow
# License:  Attribution-Share Alike 2.0
#           http://creativecommons.org/licenses/by-sa/2.0/

WIDTH=0
HEIGHT=30
COLOR1=green
COLOR2=yellow
TEXT_COLOR=black
TEXT_SHADOW=#eeeeee
TEXT_SIZE=14
TEXT_FONT='DejaVu-Sans-Bold-Oblique'
BORDER_SIZE=1
BORDER_ROUND=12
BORDER_COLOR=$COLOR2
GRADIENT=${COLOR1}-${COLOR2}
</pre>
<p>&nbsp;</p>
<p>Am besten einfach eine der Dateien öffnen und unter einen neuen Namen speichern, z.B.styles/mybuttons.sh&nbsp;Nun das Script&nbsp;web2butt.sh&nbsp;mit einem Text Editor öffnen, die Zeile mit&nbsp;# === Load Button Style ===&nbsp;suchen und den vorhanden Pfad ändern zu&nbsp;styles/mybuttons.sh.</p>
<p>Hier gibt es das&nbsp;<a href="http://www.dotmagic.de/static/img/blog/magickbuttons/web2button2-0.2.tar.gz" title="Download now!">Imagemagick Web 2.0 Button Script zum Download</a>.</p>
<pre class="brush: bash;">#!/bin/bash

# Autor:    Werner Hartnagel
# Date:     2008/04/01
# License:  Attribution-Share Alike 2.0
#           http://creativecommons.org/licenses/by-sa/2.0/

# === Default Settings ===
DEBUG=0
TEMP_DIR=tmp
OUT_DIR=out

# === Load Button Style ===
#. style/greenyellow.sh
. style/lightorange.sh
#. style/orangered.sh

# === Lets do the Magick :) ===
BORDER_MARGIN=0$(echo "scale=1; $BORDER_SIZE/2" | bc)
i=1

while read LINE; do

    BUTT="$OUT_DIR/butt${i}.png"

    # Temp Image to get width of text
    convert -strokewidth 6 -background none -fill $TEXT_COLOR -font $TEXT_FONT -pointsize $TEXT_SIZE \
            label:"$LINE" \
            $TEMP_DIR/font-test.png

    if [ "$WIDTH" -eq "0" ]; then
        BUTTON_WIDTH=`convert $TEMP_DIR/font-test.png -format '%w'   info:`
        BUTTON_WIDTH=$(expr $BUTTON_WIDTH + 20)
    else
        BUTTON_WIDTH=$WIDTH
    fi

    if [ "$HEIGHT" -eq "0" ]; then
        BUTTON_HEIGHT=`convert $TEMP_DIR/font-test.png -format '%h'   info:`
        BUTTON_HEIGHT=$(expr $BUTTON_HEIGHT + 8)
    else
        BUTTON_HEIGHT=$HEIGHT
    fi

    echo "$BUTTON_WIDTH x $BUTTON_HEIGHT"

    # Create Gradient
    convert -size $(expr $BUTTON_WIDTH - 2)x$(expr $BUTTON_HEIGHT - 2) gradient:$GRADIENT      $TEMP_DIR/gradient_$GRADIENT.miff

    # Create the round corners and store as Magick Vector Graphics
    convert $TEMP_DIR/gradient_$GRADIENT.miff -border 1 \
            -format "roundrectangle $BORDER_MARGIN,$BORDER_MARGIN %[fx:w-$BORDER_MARGIN-1], %[fx:h-$BORDER_MARGIN-1] $BORDER_ROUND, $BORDER_ROUND" \
            info: &gt; $TEMP_DIR/rounded_border.mvg

    # Button Border
    convert $TEMP_DIR/gradient_$GRADIENT.miff -border 1 -matte -channel RGBA -threshold -1 \
            -background none -fill none -stroke $BORDER_COLOR -strokewidth $BORDER_SIZE \
            -draw "@$TEMP_DIR/rounded_border.mvg"    $TEMP_DIR/button_overlay.miff

    # Add Text to Overlay
    convert $TEMP_DIR/button_overlay.miff -font $TEXT_FONT -pointsize $TEXT_SIZE \
            -fill $TEXT_SHADOW -draw "gravity Center text 1,1 '$LINE'" \
            -fill $TEXT_COLOR -draw "gravity Center text 0,0 '$LINE'" \
            $TEMP_DIR/button_overlay2.miff

    # Mask for the Button
    convert $TEMP_DIR/gradient_$GRADIENT.miff -border 1 -matte -channel RGBA -threshold -1 \
            -background none -fill white -stroke none -strokewidth 0 \
            -draw "@$TEMP_DIR/rounded_border.mvg"    $TEMP_DIR/button_mask.miff

    # Join the images
    convert $TEMP_DIR/gradient_$GRADIENT.miff -matte -bordercolor none -border 1 \
            $TEMP_DIR/button_mask.miff -compose DstIn -composite \
            $TEMP_DIR/button_overlay2.miff -compose Over -composite \
            -quality 95 PNG32:$BUTT

    (( i ++ ))

done &lt; buttons.txt

if [ "$DEBUG" -ne "1" ]; then
    rm $TEMP_DIR/rounded_border.mvg
    rm $TEMP_DIR/gradient_$GRADIENT.miff
    rm $TEMP_DIR/button_overlay.miff
    rm $TEMP_DIR/button_overlay2.miff
    rm $TEMP_DIR/button_mask.miff
    rm $TEMP_DIR/font-test.png
fi

exit 0

Warner HardnailerWritten by Warner Hardnailer who lives and works in Schwabenland and building useful things for the Web? You should follow him on Twitter & Github