Willkommen im #Neuland
Login wie bei quake.ingame.de zuvor, die Passwörter aus der alten Datenbank wurden aber gelöscht - einmal hier neu anfordern.
Wer seine E-Mail-Adresse nicht mehr hat oder kennt, bitte eine Nachricht mit Infos schicken o. im Discord melden.

PQ Discord Server: #planetquake                                                                                                                                         Spenden? Hier entlang!

commandline colorpicker tool

GNU/Linux-, *BSD- und Fricklerforum
Antworten
R0Y2

commandline colorpicker tool

Beitrag 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
edgewalker

Beitrag von edgewalker »

Wie genau soll das funktionieren? Koordinaten per Kommandozeile angeben?
R0Y2

Beitrag von R0Y2 »

genau, z.b. so:

Code: Alles auswählen

$ colorpick -x 100 -y 100 image.jpg
#FFFFFF
ist dir fad? willst du sowas coden? :)
edgewalker

Beitrag 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.
R0Y2

Beitrag 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! :)
R0Y2

Beitrag 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.
edgewalker

Beitrag 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 }'
R0Y2

Beitrag 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?
edgewalker

Beitrag 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.
R0Y2

Beitrag 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:

Code: Alles auswählen

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 :) )
edgewalker

Beitrag 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"
-diggity-

Beitrag von -diggity- »

[yellow]o[/yellow]_[red]O[/red]
R0Y2

Beitrag 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?
Antworten