• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Foto Panorama

Hallo Leute :eek: ,
ich hoffe das ihr mir helfen könnt. Ich gebe zu ich habe nicht viel Ahnung von Programmiersprachen und Scripten aber ich habe schon so viel versucht und gegoogelt das ich es jetzt mal so versuche. Also:
Das Problem ist wie folgt:
Wir Scannen jeden Tag um die 120 Fotos, und zwar Vorderseite und Rückseite.
Die Vorder und Rückseite müssen dann zu einem Foto zusammengeführt werden untereinander.
Derzeit muss das alles von Hand gemacht werden mit der Software IrfanView (weil gratis) und zwar Foto für Foto... und das dauert ewig.
Ich wollte nun eine Batch schreiben oder etwas in der Art die das ganze Automatisiert. Es muss nur ein Programm oder ein Script sein der die zusammengehörigen Fotos erkennt und diese untereinander Setzt und sie in einen Ordner Packt. Die Dateien schreiben sich so:
2006-07-13-001.jpg (Vorderseite)
2006-07-13-001R.jpg (Rückseite)
usw...
manchmal sind es auch mehrere Fotos die Untereinander müssen das sieht dann so aus:
2006-07-13-002a.jpg (Vorderseite)
2006-07-13-002b.jpg (Vorderseite)
2006-07-13-002c.jpg (Vorderseite)
2006-07-13-002aR.jpg (Rückseite)
2006-07-13-002bR.jpg (Rückseite)
2006-07-13-002cR.jpg (Rückseite)

Kann man so was Scripten? Ich meine das muss doch gehen?

Ich bin für jede Hilfe und Ratschläge dankbar. :cry:
 
... klang irgendwie interessant, und da es heute Nacht ohnehin zu Warm zum Schlafen war hab ich mal etwas zusammengestümpert: :?
Code:
#!/bin/sh

FORM="YYYY-MM-DD-NNN";
DIR="/pfad/zu/den/bildern/";

echo "Suche Bilder ...";
(find -H "$DIR" ! -name "*R.jpg" -type f | grep ".jpg$" | grep -ve "-New.jpg$" | sort) > /tmp/imges_listF;
(find -H "$DIR" -name "*R.jpg" -type f | sort) > /tmp/imges_listB;
(for i in `cat /tmp/imges_listF`; do echo "$(basename "$i" .jpg | cut -c -"${#FORM}")"; done;) | sort -u > /tmp/imges_listFa;

for i in `cat /tmp/imges_listFa`;
 do c="0";
  echo -n "Füge Bild zusammen ...";
  montage `
    for x in $(grep "$i" /tmp/imges_listF);
      do c=$(( $c + 1 )); echo "$x";
     done;
    for y in $(grep "$i" /tmp/imges_listB);
      do c=$(( $c + 1 )); echo "$y";
     done;` -geometry +0+0 -tile 1x$c "$DIR/$(basename $i .jpg)-New.jpg";
  echo "               =>  $DIR/$(basename $i .jpg)-New.jpg";
done;

rm -f /tmp/imges_listFa;
rm -f /tmp/imges_listF;
rm -f /tmp/imges_listB;
Viel Spass beim testen :D
 
OP
C

chrisibook

Newbie
Es funktiniert wirklich sehr sehr gut. Richtig unerwartet wenn ich ehrlich bin :oops:
Wie gesagt kenne mich unter Linux nicht so aus aber es wird :wink:

Könnte man nicht die Fertigen Bilder in einen neuen Ordner verschieben anstatt sie mit der Endung -New.jpg im gleichen Ordner zu erstellen?

Und könnte man außerdem noch die Bilder vor dem Zusammenschneiden noch auf eine Breite von 800 Pixel verkleiner oder vergrößern damit man nach dem zusammen fügen keine Weißen Stellen hat?

auf jeden Fall schon mal 1000x Danke damit hast du mir das Leben schon mal wesentlich leichter gemacht :lol:
 
chrisibook schrieb:
Es funktiniert wirklich sehr sehr gut. Richtig unerwartet wenn ich ehrlich bin :oops:
:shock: ... und dann noch Ansprüche stellen ... :lol:

Spass beiseite:
Das Verschieben, und Skalieren der Bilder sollte kein Problem sein.

Ich müsste das Script dann noch ein wenig überarbeiten - könnte allerdings bis zum WE dauern.
(Muss mich u.a. erst noch in ImageMagick einlesen, :wink:
und außerdem kann ich das ganze dann noch um einige sinnvolle Tests/Abfragen erweitern ...)
 
Soooo ... and here it is: 8)

Changelog:
2006-Jul-22, 16:05
Hilfe erweitert - Keine Leerzeichen in Datei-/Verzeichnisnamen
2006-Jul-22, 04:19
Wasserzeichen hinzufügen incl. div. Optionen
2006-Jul-21, 21:38
Einstellungen werden als Optionen direkt ans Script übergeben.
Dateien -> Zielverzeichnis
Abfragen/Tests:
- Quellverzeichnis: lesbar?
- Zielverzeichnis: existiert / schreibbar / erstellen ?
- Dateien existieren / überschreiben ?
Hilfe


Bitte mal ausgiebig testen!! :wink:
Code:
#!/bin/sh
# image_montage.sh
# b3ll3roph0n@gmx.net
# Shellscript zum Zusammenzufügen einzelner Bilder
##########################################################################
ARGV="$@"
PRGNAME=$(basename $0)

readonly SHORTHELP="Verwendung: $PRGNAME [Optionen] ...";
readonly LONGHELP="
Verwendung: $PRGNAME [Optionen] ...

Optionen:
                ACHTUNG: Verzeichnisse und Dateinamen dürfen KEINE Leerzeichen enthalten.
                Die üblichen Escapecharacters der Shell (\"\", \\) haben in diesem Fall keine Wirkung.
                Grund: Script verwendet \"getopt\" und interpretiert Leerzeichen als Trennzeichen. => \"man getopt\"
                Alle anderen Sonderzeichen können wie üblich mit \\ maskiert werden.

 --in                  Quellverzeichnis

 --out                 Zielverzeichnis

 --wm                  Wasserzeichen (Bild-Datei)

 -n --noask            Verzeichnisse die nicht existieren, werden ohne Nachfragen angelegt,
                       bereits existierende Verzeichnisse und dateien werden ohne Rückfragen benutzt / überschrieben.

 -x --width            Einzelbilder VOR beim Zusammenfügen skalieren:
 -y --height           Falls beide Optionen (\"width\" UND \"height\") gegeben sind, wird das Seitenverhältnis entsprechend erzwungen.
                       Bei der Verwendung von \"width\" ODER \"height\" wird das Seitenverhältnis beibehalten.
                       Bei keiner Angabe werden größe und Seitenverhältnis der Originalbilder beibehalten.

 -f --form             Form der Dateinamen
                       Default: \"YYYY-MM-DD-NNN\"

 --wro                 Rotation des Wasserzeichens
                       Default: \"0\"

 --wwidth		        Wasserzeichen skalieren
 --wheight	          ACHTUNG: Rotation erfolgt zuerst - Werte beziehen sich also auf das bereits rotierte Wasserzeichen!
                       Falls beide Optionen (\"wwidth\" UND \"hheight\") gegeben sind, wird das Seitenverhältnis entsprechend erzwungen.
                       Bei der Verwendung von \"width\" ODER \"height\" wird das Seitenverhältnis beibehalten.
                       Bei keiner Angabe werden größe und Seitenverhältnis der Originalbilder beibehalten.

 --wtr                 Transparenz des Wasserzeichens (zusätzlich zu einer evtl. Trasparenz des Wasserzeichenbildes)
                       Default: \"100\" => keine 

 --wpos                Position des Wasserzeichens
                       Mögliche Werte => \"NorthWest\", \"North\", \"NorthEast\", \"West\", \"Center\", \"East\", \"SouthWest\", \"South\", \"SouthEast\".
                       ACHTUNG: Wenn die Option \"wpos\" verwendet wird, entfallen \"wx\" und \"wy\"!

 --wx                  Geziehlte Positionierung des Wasserzeichens auf dem Ausgangsbild.
 --wy                  ACHTUNG: Die Option \"wpos\" hat eine höhere Priortät, sollte in diesem Fall also NICHT benutzt werden!

 -h --help      	    Dieser Hilfetext
";

##########################################################################

function usage { 
  ( if [ ! -z "$1" ]; then
      case $1 in
        1) echo -e "$LONGHELP";;
        *) echo -e "$SHORTHELP";;
      esac;
     else echo -e "$SHORTHELP";
    fi; ) >&2; };

##########################################################################
if [ $# -eq 0 ]; then CMD=usage;
 else while [ $# -gt 0 ]; do
  case $1 in
    -t|--test) CMD=test;;
    -h|--h|--he|--hel|--help) CMD=usage; break;;
    *) CMD=do;;
  esac;
  shift;
done; fi;

set -- $ARGV

case $CMD in
  do)
    OPT="test,noask,form:,width:,height:";
    OPTL="in:,out:,wm:,wro:,wtr:,wwidth:,wheight:,wx:,wy:,wpos:,test";
    FORCE="0"; FORM="YYYY-MM-DD-NNN"; POS_X="0"; POS_Y="0"; POS=""; TRANS="100"; ROTATE="0";
    TEMP=$(getopt --options=tnf:x:y: --long $OPTL,$OPT -n $PRGNAME -- "$@");
    if [ $? -ne 0 ]; then
      ( echo -n "Beende ...  "; usage; ) >&2;
      exit 100;
    fi;

    eval set -- "$TEMP"
    while true; do
      case $1 in
        --form|-f) FORM="$2"; shift;;
        --noask|-n) FORCE="1";;
        --width|-x) WIDTH="$2"; shift;;
        --height|-y) HEIGHT="$2"; shift;;
        --in) IN="$2"; shift;;
        --out) OUT="$2"; shift;;
        --wm) WATER="$2"; shift;;
        --wro) ROTATE="$2"; shift;;
        --wtr) TRANS="$2"; shift;;
        --wwidth) WIDTH_W="$2"; shift;;
        --wheight) HEIGHT_W="$2"; shift;;
        --wx) POS_X="$2"; shift;;
        --wy) POS_Y="$2"; shift;;
        --wpos) POS="$2"; shift;;
        --) break;;
        *) echo "Unbekanntes Argument \"$1\""; exit 100;;
      esac;
      shift;
    done;
    
    if [ -z "$IN" -o ! -d "$IN" ]; then
      echo -e "Benötige ein Quellverzeichnis"; usage; exit 100;
     elif [ -d "$IN" -a -r "$IN" -a -x "$IN" ]; then
       IMG_F=`find "$IN" -maxdepth 1 ! -name "*R.jpg" -type f | grep ".jpg$" | sort`;
       IMG_B=`find "$IN" -maxdepth 1 -name "*R.jpg" -type f | sort`;
       IMG_A=$(for i in `echo "$IMG_F"`; do echo "$(basename "$i" .jpg | cut -c -"${#FORM}")"; done | sort -u);
      else echo -e "Verzeichnis \"$IN\" kann NICHT gelesen werden"; exit 100;
    fi;
    
    if [ -z "$OUT" ]; then
      echo -e "Benötige ein Zielverzeichnis"; usage; exit 100;
     elif [ ! -d "$OUT" ]; then
       if [ $FORCE -eq 0 ]; then
         echo -n "Verzeichnis \"$OUT\" existiert nicht. Erstellen(y/n)!" > /dev/tty; read ans;
         case $ans in
           y)
             mkdir -p "$OUT" 2> /dev/null; if [ $? != 0 ]; then echo "Abbruch! - Verzeichnis \"$OUT\" konnte NICHT erstellt werden."; exit 100; fi;;
           *) echo "Abbruch! - Verzeichnis \"$OUT\" wird NICHT erstellt."; exit 100;;
         esac;
        else
          mkdir -p "$OUT" 2> /dev/null; if [ $? != 0 ]; then echo "Abbruch! - Verzeichnis \"$OUT\" konnte NICHT erstellt werden."; exit 100; fi;
       fi;
      elif [ -w "$OUT" ]; then
        if [ $FORCE -eq 0 ]; then
          echo -n "Verzeichnis \"$OUT\" existiert. Trotzdem verwenden(y/n)!" > /dev/tty; read ans;
          case $ans in
            y) ;;
            *) echo "Abbruch! - Verzeichnis \"$OUT\" wird NICHT verwendet."; exit 100;;
          esac;
         fi;
       elif [ ! -w "$OUT" ]; then echo "Abbruch! - Verzeichnis \"$OUT\" existiert, ist aber NICHT schreibbar."; exit 100;
    fi;

    for i in `echo "$IMG_A"`; do c="0"; new_name="$OUT/$(basename $i .jpg).jpg";tmp_name="$OUT/$(basename $i .jpg)_tmp.jpg";
        if [ -w "$new_name" ] && [ ! $FORCE -eq "1" ]; then
          echo -n "Datei \"$new_name\" existiert bereits. Überschreiben(y/n)!" > /dev/tty; read ans;
          case $ans in
            y) echo -n "Füge Bild zusammen (Überschreibe existierende Datei) ..."; owrite="0";;
            *) echo -e "Überspringe Bild \"$new_name\"!"; owrite="1";;
          esac;
         elif [ -w "$new_name" ] && [ $FORCE -eq "1" ]; then echo -n "Füge Bild zusammen (Überschreibe existierende Datei) ..."; owrite="0";
          elif [ -e "$new_name" ] && [ ! -w "$new_name" ]; then
            echo -e "Datei \"$new_name\" existiert bereits, und kann nicht überschrieben werden!"; owrite="1";
           else echo -n "Füge Bild zusammen ..."; owrite="0";
        fi;
        if [ $owrite -eq "0" ]; then
          montage $(
            for x in $(echo "$IMG_F" | grep "$i"); do c=$(( $c + 1 )); if [ -r "$x" ]; then
              if [ "$(basename $x .jpg)" = "$(basename $i .jpg)" ];then
                composite "$WATER" -dissolve "$TRANS" -rotate "$ROTATE" $(
                  if [ -z "$HEIGHT_W" -a -z "$WIDTH_W" -a -z "$POS" ]; then  echo -n " -geometry";fi;
                  if [ ! -z "$HEIGHT_W" -o ! -z "$WIDTH_W" ]; then echo -n " -geometry $WIDTH_W""x""$HEIGHT_W";fi;
                  if [ -z "$POS" ]; then echo -n "+$POS_X+$POS_X"; fi;
                  if [ ! -z "$HEIGHT_W" -a ! -z "$WIDTH_W" ]; then echo -n "!";fi;
                ) $(if [ ! -z "$POS" ]; then echo -n " -gravity $POS"; fi;) "$x" "$tmp_name";
                echo "-tile 1x$c $tmp_name";
               else echo "-tile 1x$c $x";
              fi;
             fi; done;
            for y in $(echo "$IMG_B" | grep "$i"); do c=$(( $c + 1 )); if [ -r "$y" ]; then echo "-tile 1x$c $y"; fi; done;
          if [ ! -z "$HEIGHT" -o ! -z "$WIDTH" ]; then echo -n "-resize $WIDTH""x""$HEIGHT";fi;
          if [ ! -z "$HEIGHT" -a ! -z "$WIDTH" ]; then echo -n "!";fi;
          ) -geometry +0+0 "$new_name";
          echo -e "               =>  $new_name";
        fi;rm -f "$tmp_name";
      done;
    echo -e "\nFertig!\n";
    ;;
  test)
    echo -e "Nur zu Testzwecken!\n\n";
    ;;
  usage)
    usage "1";
    ;;
esac;

#EOF
Weitere Änderungen / Verbesserungen falls gewünscht und bei entsprechendem Feedback!
 
OP
C

chrisibook

Newbie
OK ich konnte es nicht abwarte und habe mich noch mal ins Büro begeben um es zu Testen...

GEIL!!! :p :p :p :lol: :lol: :lol: :lol: :D :D :D :D :D

Ich kann es nicht mal in Worte Fassen

und ich darf mir wirklich noch was wünschen? Mh... Wasserzeichen Setzung wäre auch noch toll das macht immer noch nen Windows Programm zwar auch Automatisch aber Linux kann das sicherlich doch auch :)

Allerdings gibt es bein Wasserzeichen ein paar sehr komplizierte Regeln:
1. Nur die Vordederseite muss ein Wasserzeichen haben.
2. Nur Einzelaufnahmen sollten es haben (Könnte man ja über den Datei Namen Regeln)
3. Es muss vor dem kleiner Scalieren der Fotos gesetzt werden
4. Die Rohdateien müssen unangetastet sein

Wenn das noch gehen würde wäre es perfekt, die Eingabe passt die Augabe geht 100% und der Rest ist einfach nur Geil ;-)
 

Grothesk

Ultimate Guru
Jungs, ich find den Thread genial!
Zu Wasserzeichen hat Cero mal was gemacht:


http://www.linux-club.de/viewtopic.php?t=49091
Das lässt sich bestimmt da noch irgendwie unterbringen!
 
OP
C

chrisibook

Newbie
MH der hat das aber mit Text gemacht bei uns wird ein Bild über das Bild gelegt, mittig so wie hier:

http://www.auction-factory.de/ebay/2006-01-19-124.jpg

ach das hatte ich gar nicht erwänt durchsichtigkeit muss es auch noch haben, also wenn das zu schwierig ist kann es auch das Windoof Proggie weiter machen das ist zwar sehr nervig aber es würde gehn. Ich weiß ja nicht wie schwer es ist so was in einem Script umzusetzten. :oops:
 

Grothesk

Ultimate Guru
Weiter unten kommt auch, wie man ein Bild als Wasserzeichen macht. Und Transparenz sollte eigentlich auch kein Thema sein.
 

oc2pus

Ultimate Guru
chrisibook schrieb:
..., also wenn das zu schwierig ist kann es auch das Windoof Proggie weiter machen das ist zwar sehr nervig aber es würde gehn.
das heisst Windows .. nochmal windoof und der Thread geht in die Tonne :mrgreen:

Und natürlich würde das geniale Skript in der downloadarea einen Ehrenplatz bekommen :)
 
Update!

Soo ... hab das mit den Wasserzeichen mal eingebaut.
Works for me ... getestet mit einem halbtransparenten *.png.

So langsam lohnt es sich für die Optionen eine Extra Config-Datei anzulegen ... :mrgreen:

PS: Danke für die Blumen :oops:

PPS: Hier gibt es einen Downloadbereich? :shock:
 

oc2pus

Ultimate Guru
b3ll3roph0n schrieb:
PS: Danke für die Blumen :oops:

PPS: Hier gibt es einen Downloadbereich? :shock:
noch nicht offiziell, wird gerade dran gearbeitet :)

wir wollen da "schöne" Scripte, Musterkonfigurationen, etc hinstellen, damit das leidige "cut&copy, Zeilenumbruch, Zeilenende"-Problem endlich mal eine Ende hat und diese Dinge einfacher zu verwalten sind.
 
OP
C

chrisibook

Newbie
Ich hatte mit der neuen Überarbeitung ja beim ersten Mal so meine Probleme da habe ich ihn so benutzt :oops:
./Textdatei --in /home/christian/Desktop/Rohdaten/ --out /home/christian/Desktop/test --wm /home/christian/Desktop/auction-factory\ TRANSPARENT.gif -n -x 800 --wtr 80 --wpos Center
Nachdem ich es etwas umgestellt hatte ging es aber 100% :D

Jetzt brauche ich mich mit dem Thema Fotos nachbearbeiten auf der Arbeit auf jeden Fall nicht mehr befassen, es geht ja nun alles automatisch :) :D :lol:

Ich weiß gar nicht wie ich dir Danken soll :oops:
 
chrisibook schrieb:
Ich hatte mit der neuen Überarbeitung ja beim ersten Mal so meine Probleme da habe ich ihn so benutzt [...]
Gesehen ... Verzeichnisse mit Leerzeichen führen zu Fehlern. :?
- Werde mich da gleich mal dran setzen ...

Das nächste mal aber bitte hier die Fehlermeldung(en) posten.

chrisibook schrieb:
Ich weiß gar nicht wie ich dir Danken soll :oops:
Mit ausführlichen Tests!
Und wenn das mit dem Downloadbereich klappt, vielleicht eine kurze Beschreibung/Erklärung ...
 
Sorry, ich finde im Moment leider keine Möglichkeit dem Script beizubringen Leerzeichen in Datei-/Verzeichnisnamen zu akzeptieren. :?
Hab gerade die Hilfe entsprechend angepasst und einen entsprechenden Hinweis eingefügt.

Für alle die es Interessiert (und evtl. einen Tipp für mich haben :wink: ):
man getopt
[...]
QUOTING
In compatible mode, whitespace or ’special’ characters in arguments or non-option parameters are not handled correctly. As the output is fed to the
shell script, the script does not know how it is supposed to break the output into separate parameters. To circumvent this problem, this implementation
offers quoting. The idea is that output is generated with quotes around each parameter. When this output is once again fed to the shell (usually by a
shell eval command), it is split correctly into separate parameters.
[...]
 
OP
C

chrisibook

Newbie
So, wir haben den Skript nun ausgiebig getestet. Und ich konnte nur ein paar Dinge feststellen die nicht so toll sind.
Einmal hatten wir das Problem das der Skript die Fotos nicht zusammen setzen konnte das lag daran das wir bei den Dateinamen vergessen hatten den Tag anzugeben. (Also statt YYYY-MM-DD-NNN.jpg nur YYYY-MM-NNN.jpg, hatte sich ein Mitarbeiter vertippt und das ist nicht weiter aufgefallen) Da wäre eine Fehlermeldung wünschenswert. Weil ich 15 Minuten an mir und dann an dem Skript gezweifelt habe bis mir auffiel woran es lag.

Beim Wasserzeichen wäre noch wünschenswert das man die Größe des Wasserzeichens in Prozent angeben könnte also das in der Horizontalen des Fotos immer 75% mit dem Wasserzeichen bedeckt ist. Derzeit ist das Wasserzeichen bedingt durch die Verschiedenen Größen der Fotos immer unterschiedlich groß und mal abgeschnitten oder bediene ich es falsch?

Außerdem wäre ein automatischer FTP Upload noch toll. Also das er es nicht in einen Ordner legt sondern gleich Hoch läd. Und damit der Ordner Cache des FTP Servers nicht überlastet wird am besten so aufgedröselt:
aus YYYY-MM-DD-NNN.jpg müsste /YYYY/MM/DD/NNN.jpg werden.

Ansonsten ist der Skript aber schon 100% in Ordnung und bei uns 5 Tage die Woche mindestens 10x mal am Tag im Einsatz.

Noch mal vielen vielen Dank und ich werde mich auch so bald ich Urlaub habe (Ende des Monats) dran setzen und eine Anleitung schreiben.

:) :eek: :D
 
moin,
stimmt die Größenangabe für das Wasserzeichens ist bei unterschiedlichen Bildergrößen suboptimal - da lässt sich was machen.
FTP ist auch kein Problem - lässt sich mit 'wput' erledigen ... ich müsste das bloß geschickt einbauen (über Optionen), damit das Script auch weiterhin offline funktioniert.
Außerdem fehlt im Script eine Abfrage (für den Fall, dass man kein Wasserzeichen verwenden möchte) - werde ich bei der Gelegenheit auch korrigieren. :roll:
Was die Kontrolle der Dateinamen betrifft ... :?
... ich hatte eigentlich mal vor, das ganze mit regulären Ausdrücken zu machen (dann könnte man das Eingabeformat verändern) ...
... außerdem nach dem Einlesen der Bilder evtl. eine kleine Statistik ausgeben lassen :| ...

Mal schauen -> werde mich nächstes WE mal ransetzen :wink:

Auf jeden Fall Danke für das Feedback!
 
Oben