Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]12334[/thread]

Pixelfarbe von Display ermitteln...

Leser: 1


<< >> 8 Einträge, 1 Seite
rommi
 2008-08-10 22:27
#113293 #113293
User since
2005-03-03
54 Artikel
BenutzerIn
[default_avatar]
Hallo Perlfans,

suche noch andere Möglichkeiten um die Farbe eines
Pixels auf dem Desktop zu ermitteln. Bisher:

use Win32::GUI;
$screen = new Win32::GUI::DC("DISPLAY");
$pixfarb = $screen -> GetPixel (1, 1);
....

man bekommt hier ne ziemlich grosse zahl die man dann wieder in ne Hexzahl, und die Hexzahl dann nochmal drehen muss um dann die äquvalente RGB-Zahl zu bekommen. Mir ist dass ganze zu umständlich. Weiss jemand noch einen andere Möglichkeit die Farbe eines Desktop-Pixels zu ermitteln. Am Besten gleich in einem ordentlichen Hex-Wert oder noch besser RGB-Wert?

schöne grüsse
rommi
rommi
 2008-08-11 01:39
#113311 #113311
User since
2005-03-03
54 Artikel
BenutzerIn
[default_avatar]
Jetzt bin ich es nochmal :-)

Mir würde schon helfen wenn jemand weiss wie ich den Inhalt von $screen zuverlässig in den adäquaten RGB-Wert (z.B. 255,255,255) umwandeln kann!

Gruss
rommi
Struppi
 2008-08-11 11:32
#113316 #113316
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Was bekommst du, wenn du die Werte so abfragst:
Code (perl): (dl )
@pixfarb = $screen -> GetPixel (1, 1);
Linuxer
 2008-08-11 12:33
#113321 #113321
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
*grml* unmarkierter Crosspost:
http://perlboard.de/cgi-bin/perlboard.pl?action=sh...
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
GwenDragon
 2008-08-11 14:27
#113343 #113343
User since
2005-01-17
14757 Artikel
Admin1
[Homepage]
user image
Es wäre schon schön, zu schreiben, wo du noch um Hilfe ersuchst.
Crosspostings sind ok, aber manche hier posten auch in mehreren Foren und ärgern sich dann, dass im andere Forum die Lösung schon steht oder sie helfen, und hier noch weiter um Hilfe gebeten wird.
rommi
 2008-08-11 19:30
#113364 #113364
User since
2005-03-03
54 Artikel
BenutzerIn
[default_avatar]
Hallo Perlfans,

sorry habe gestern echt meinen Beitrag etwas schnell schnell reingeklopft
ohne genau zu erklären was ich will :-(

Das doppelte Posting sollte niemand verärgern aber man hat halt einfach mehr
Resonanz u. mehr Lösungen (gerade in Perl) und manchmal einen Zeitvorteil.
Aber nachdem ja viele Ratgeber in verschiedenen Perlforen tätig sind ist es
natürlich auch nicht unentdeckt geblieben. BB is watching u .. lol. Sollt
ich es wieder einmal übersehen (ich poste eher selten) dann nicht gleich Kopf-
abreiss (aua aua). Werd hoffentlich das nächstemal dran denken einen Hinweis
zu geben oder bis zu meiner nächsten Frage sind alle wichtigen Perlforen zu
einem ÜberMegaPerlHilfeForum (ÜMPHF) zusammen geschaltet :-))

Zu meinem Problem:
Ziel ist es den Farbwert eines beliebigen Pixels auf meinen Desktop zu
ermittlen und genau diesen Farbwert später als Pixel mit dem selben Farb-
wert in ein Bild einzufügen. Ich nehme mal als Beispiel die Pixelfarbe der
Koordinate 1,1 von meinem Desktop (Programmierstil habe ich jetzt nicht be-
achtet).

use Image::Magick;
use Win32::GUI;

$screen = new Win32::GUI::DC("DISPLAY");
$pixfarb = $screen -> GetPixel (1, 1);
## Inhalt von $pixfarb ist jetzt "10841658". Die Zahl "10841658" ist
## das Äquivalent zum Hex-Wert #3A6EA5 bzw. RGB-Wert 58,110,165. Die
## Leider kann ich die Zahl "10841658" in späteren Befehlen nicht dir-
## ekt verwenden sondern muss die Zahl vorher in einen Hexwert oder
## für andere Funktionen in einen RGB-Wert umwandeln.

$pixfarbhex = sprintf("#%X", $pixfarb);
## Inhalt von $pixfarbhex ist jetzt "#A56E3A". Da ist aber dann schon
## ein Dreher drin denn eigentlich sollte der äquivalente Hexfarbwert
## "#3A6EA5" sein!!
## Der Hexwert "#A56E3A" ist aber eine ganz andere Farbe als der Hex-
## wert "#3A6EA5". Ganz krass ist es z.B. bei dem Wert "12643" (ist
## ne ziemlich dunkle braune Farbe). Wenn ich diesen Wert "12643" in
## eine Hexzahl wandle kommt "#3163" raus. Der äquivalente Hexfarbwert
## für "12643" ist aber "#633100" und nicht "#3163". Das ist eine völlig
## andere Farbe!! Also schon bei der Umwandlung in eine Hexzahl habe ich
## Probleme. Auch die Nullen werden bei der Umwandlung nicht dargestellt.

$image = Image::Magick->new;
$image->Set(size=>"200x200");
$image->ReadImage('xc:white');


$image->Set("pixel[5,8]"=>"$pixelfarbhex"); # ich füge hier ein Pixel
# mit dem ermittelten Farb-
# wert ein.
## In diesem Befehl wird halt ein Hexwert erwartet. D.h. ich kann den
## Wert aus $pixfarb "10841658" hier nicht direkt verarbeiten sondern
## benötige einen Hexwert. Und wie ich es schon erwähnte habe ich Prob-
## leme mit der Umwandlung sodass ich den entsprechend richtigen Hexwert
## habe.

$pic1 = $image->Write('C:\Verzeichnisxy\name.gif'); # Bild abspeichern


Also am Besten wäre es den Wert aus $pixfarbhex direkt (ohne Hexumwandlung)
weiterverarbeiten zu können oder wenigstens eine sichere Umwandlung in den
entsprechenden richtigen Hexwert zu realisieren. Vielleicht gibt es ja auch
einen ganz andere Lösungsansatz? Vielleicht kann man auch irgendwie mit RGB-
Werten arbeiten?


An Struppi:
@pixfarb enthält den gleichen Wert wie wenn ich $pixwert nehmen!

gruss, rommie

--- Offene Systeme könenn ja nicht ganz "dicht" sein! ----
MatthiasW
 2008-08-11 19:40
#113365 #113365
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Quote
GetPixel (x, y)

Return pixel value color at x, y or undef if error. For image with BPP <= 8 return palette index color. For image with BPP > 8 return color value. This color value can be an integer value or a [B,G,R,A] array.

Schonmal nachgesehen ob du nich ne Arrayreferenz bekommst?

edit:
Ansonsten kannste natürlich die einzelnen Werte noch aus dem integer holen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl

use strict;
use warnings;

use Win32::GUI;

my $screen = new Win32::GUI::DC("DISPLAY");
my $pixel = $screen -> GetPixel( 5, 5 );

print "PIXEL: $pixel\n";

my $r = ($pixel << 24) >> 24;
my $g = ($pixel << 16) >> 24;
my $b = ($pixel << 8) >> 24;
my $a = ($pixel ) >> 24;

print "R: $r\n";
print "G: $g\n";
print "B: $b\n";

Eventuell ist die Reihenfolge genau verkehrtherum, das hängt vom jeweiligen Prozessor ab, wie asphalt im perlboard ja bereits geschrieben hat.

edit2: Oh sehe grad das das Problem ja bereits gelöst is, naja egal.

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
rommi
 2008-08-12 02:28
#113377 #113377
User since
2005-03-03
54 Artikel
BenutzerIn
[default_avatar]
jo, danke!

gruss
rommi
<< >> 8 Einträge, 1 Seite



View all threads created 2008-08-10 22:27.