Seite 1 von 1
commandline colorpicker tool
Verfasst: 02.10.2004, 18:39
von R0Y2
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
Verfasst: 02.10.2004, 20:20
von edgewalker
Wie genau soll das funktionieren? Koordinaten per Kommandozeile angeben?
Verfasst: 02.10.2004, 20:51
von R0Y2
genau, z.b. so:
ist dir fad? willst du sowas coden?
Verfasst: 02.10.2004, 21:04
von edgewalker
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: Alles auswählen
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.
Verfasst: 02.10.2004, 21:57
von R0Y2
wow! danke sehr, das scheint meinen wunsch zu erfüllen. ich hab selber auch ein bisschen herumgespielt und bin zu folgendem ansatz gekommen:
Code: Alles auswählen
$ 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!
Verfasst: 02.10.2004, 22:01
von R0Y2
taddaaaaaa! dank meiner abschreibkünste hab ichs geschafft
Code: Alles auswählen
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.
Verfasst: 03.10.2004, 02:27
von edgewalker
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: Alles auswählen
jpegtopnm --quiet unix.jpg | pamslice -column 100 | awk '/^100 /{ printf "%02x%02x%02x\n", $2, $3, $4 }'
Verfasst: 03.10.2004, 21:02
von R0Y2
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?
Verfasst: 04.10.2004, 04:15
von edgewalker
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.
Verfasst: 04.10.2004, 10:12
von R0Y2
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:
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
)
Verfasst: 04.10.2004, 19:24
von edgewalker
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: Alles auswählen
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: Alles auswählen
perl -le'opendir $_, $ARGV[0] ||= "." or die "Failed opening directory $ARGV[0]: $!\n"; @_ = readdir $_; print @_[ rand @_ ]' "$dir"
Bzw
Code: Alles auswählen
#!/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"
Verfasst: 04.10.2004, 21:42
von -diggity-
[yellow]o[/yellow]_[red]O[/red]
Verfasst: 06.10.2004, 00:49
von R0Y2
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: Alles auswählen
#!/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?