Zeige Ergebnis 1 bis 13 von 13
  1. #1
    R0Y2
    Gast

    commandline colorpicker tool

    hi

    ich suche ein commandline-tool mit dem ich die farbe eines beliebigen pixels aus einer bilddatei (primär jpg, unterstützung für andere formate wäre auch fein) ermitteln kann. google konnte mir leider nicht wirklich helfen, gimp scheint mir overkill (und ich glaube nicht, dass das ohne herumklicken geht). vielleicht weiss ja von euch wer was...

    thx


  2. #2
    edgewalker
    Gast
    Wie genau soll das funktionieren? Koordinaten per Kommandozeile angeben?

  3. #3
    R0Y2
    Gast
    genau, z.b. so:
    Code:
    $ colorpick -x 100 -y 100 image.jpg
    #FFFFFF
    ist dir fad? willst du sowas coden?

  4. #4
    edgewalker
    Gast
    Ich denke, sowas könnte man mit den NetPBM-Tools leicht frickeln.. einfach nach PPM wandeln (man ppm beschreibt das Format) und die Ausgabe an awk pipen.

    Edit: oder mit pnmcut ein 1-Pixel-Rechteck rausschneiden und dann dessen RGB-Werte ausgeben.

    Edit: hmm.. die Pixel werden als Binärdaten repräsentiert.. das ist nicht schwer zu parsen aber auch nicht mehr komplett trivial..

    Edit: ah, es gibt also doch ein "plain PNM" Format das reines ASCII ist, wie ich schon dachte.. man pnmtoplainpnm

    Code:
    printf "%02x%02x%02x\n" $([br]    jpegtopnm unix.jpg 2> /dev/null |[br]    pnmcut -left [red]100[/red] -top [red]100[/red] -width 1 -height 1 |[br]    pnmtoplainpnm |[br]    tr -s '[[:space:]]' ' ' |[br]    cut -d' ' -f 5-7[br])
    Ich weiss nicht, wie das auf Grau- oder Schwarzweissbilder reagieren wird, aber das sollte so passen.

  5. #5
    R0Y2
    Gast
    wow! danke sehr, das scheint meinen wunsch zu erfüllen. ich hab selber auch ein bisschen herumgespielt und bin zu folgendem ansatz gekommen:
    Code:
    $ jpegtopnm --quiet unix.jpg|pamslice -column=100|egrep ^100
    100 235 244 251
    mit dem noch zu lösenden formatproblem. "100" repräsentiert die spalte, dann folgen die rgb werte in dezimal. wie ich die auf hex konvertieren soll weiss ich auf die schnelle nicht, aus man hexdump werde ich auch nicht ganz schlau.
    obwohls dank deiner hilfe nicht mehr nötig ist, würde es mich doch interessieren wie man meine ausgabezeile auf "ebf4fb" übersetzt...

    thx nochmal!

  6. #6
    R0Y2
    Gast
    taddaaaaaa! dank meiner abschreibkünste hab ichs geschafft

    Code:
    printf "%02x%02x%02x\n" $(jpegtopnm --quiet unix.jpg|pamslice -column=100 |egrep '^100 '|cut -d' ' -f 2-4)

    edit: beim egrep noch '' und leerzeichen nach 100 hinzugefügt, da sonst evtl. mehrfachmatches.

  7. #7
    edgewalker
    Gast
    Nett. Bei mir sind die Manpages nicht vollständig, deswegen habe ich pamslice nicht gefunden.

    Aber wenn's'd' schon grep nimmst, konnst glei' awk nehma.

    Code:
    jpegtopnm --quiet unix.jpg | pamslice -column 100 | awk '/^100 /{ printf "%02x%02x%02x\n", $2, $3, $4 }'

  8. #8
    R0Y2
    Gast
    schon? warum? bin da leider null informiert... und awk steht auch noch irgendwo auf der liste der sachen mit denen ich mich irgendwann einmal auseinandersetzen möchte...

    was bringt da z.B. $2, $3, $4?

  9. #9
    edgewalker
    Gast
    Es ist einfach oft simpler, grep+cut mit awk zu ersetzen.

    awk splittet jede Zeile an Leerzeichen auf und stellt die einzelnen Felder zur Verfügung. $1 ist das 1. Feld, $2 das 2., etc. In $0 steht die ganze Zeile drin.

  10. #10
    R0Y2
    Gast
    aha. danke für die erklärung.

    jetzt hab ich aber noch so eine frage: wie kann ich aus einem directory mit files eine random-file herauspicken? ich habe mir folgenden ansatz überlegt:
    Code:
    ls $dir| head -n $random|tail -n 1
    dabei fehlt mir aber die möglichkeit $random zu ermitteln, was ich so erledigen wollte:
    nimm ein/mehrere byte/s von /dev/urandom und wandle sie zu einer zahl um (vllt. mittels printf?) et voilà: die zeilennummer.

    bin ich da komplett falsch? printf "02d" $(head -c 1 /dev/urandom) funzt leider nicht (und ich gebe zu, dass ich keine ahnung von der printf syntax habe )

  11. #11
    edgewalker
    Gast
    Du musst auf jeden Fall die Daten komplett einlesen -- vorher weisst du nicht, wieviele Zeilen das sind. Für eine Lösung mit reinen Shell-Mitteln fällt mir dazu nur sort ein, das ist ziemlich umständlich:

    Code:
    ls "$dir" | while read LINE ; do[br]    echo "$RANDOM $LINE"[br]done | sort -sn | head -1 | cut -d' ' -f2-
    Ich würde das mit Perl lösen..

    Code:
    perl -le'opendir $_, $ARGV[0] ||= "." or die "Failed opening directory $ARGV[0]: $!\n"; @_ = readdir $_; print @_[ rand @_ ]' "$dir"
    Bzw

    Code:
    #!/usr/bin/perl[br]use strict;[br]use warnings;[br][br]my $dir = shift || ".";[br]my @file = do {[br]    opendir my $dh, $dir[br]        or die "Couldn't open directory $dir: $!\n"[br]    readdir $dh;[br]};[br][br]print $file[ rand @file ], "\n"

  12. #12
    -diggity-
    Gast
    [yellow]o[/yellow]_[red]O[/red]

  13. #13
    R0Y2
    Gast
    wow. ich komm ja aus dem staunen nicht mehr raus ich wäre ja nie draufgekommen, dass die bash eine variable $RANDOM anbietet... aber sehr gut zu wissen. vielleicht sollte ich mir doch einmal die ganze manpage durchlesen (ferien vorausgesetzt). von perl hab ich leider -0 plan, werds trotzdem mal probieren.

    thx

    p.s. hab mich jetzt doch für die umständliche sortvariante entschieden, da ich die verstehe und anpassen kann

    wenns wen interessiert für was ich das brauche: ich habe ein directory voll mit nichtlustig.de cartoons und dank meinem neuen script kann ich mir jetzt mittels stündlichem cronjob einen neuen desktop generieren lassen wo jeweils ein cartoon in der mitte ist und die hintergrundfarbe passend gesetzt wird.

    wenns jemand haben will, hier das script (benötigt netpbm (http://netpbm.sourceforge.net/) und hsetroot (http://thegraveyard.org/hsetroot.php)):
    Code:
    #!/bin/bash
    DIR="/mnt/Storage/Pictures/www.nichtlustig.de/"
    PIC=$DIR$(ls $DIR |while read LINE ; do echo "$RANDOM $LINE" ;  done | sort -sn | head -n 1 | cut -d' ' -f2-)
    COLOR=$(jpegtopnm --quiet $PIC | pamslice -column=2 | awk '/^2 /{ printf "%02x%02x%02x\n", $2, $3, $4 }')
    
    hsetroot -solid \#$COLOR -center $PIC
    p.p.s. irgendwie mag das forum (zumindest in der vorschau) nicht mehr als einen schönen link anzeigen... hat sonst noch wer das problem?

Forumregeln

  • Es ist dir nicht erlaubt, neue Themen zu verfassen.
  • Es ist dir nicht erlaubt, auf Beiträge zu antworten.
  • Es ist dir nicht erlaubt, Anhänge hochzuladen.
  • Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
  •