• 06.06.2025, 17:56
  • Registrieren
  • Anmelden
  • Sie sind nicht angemeldet.

 

Lieber Besucher, herzlich willkommen bei: Aqua Computer Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

iNFiNiTE

God

eigenes makro programm schreiben *teil gelöst*

Dienstag, 22. April 2008, 23:38

nabend,

ich würde mir gerne ein eigenes makro programm schreiben; ein programm was also :
- den mauszeiger nach x,y schieben kann
- mausklick ausführen kann
- den bildschirminhalt in ein array einlesen kann (am besten 2d) - am besten pro pixel als hexwert, sodass ich mir methoden erstellen kann, welche zbsp einen OK button erkenen können..
done - siehe unten :D

natürlich gibt es sowas schon fertig, kostet aber geld - außerdem bin ich so sehr frei in der realisation.
am liebsten wäre mir was in .net; da hab ich auch schon die copyfromscreen methode gefunden, die einen bestimmten ausschnitt des desktops oder eben den ganzen in ein graphic objekt kopiert, aber das wars dann auch schon.

den screenshot neu zeichnen will ich ja auch gar nicht, ich hätte eigtl nur gerne ein 2d array mit hexwerten, sodass ich genau weiß welcher pixel welchen hexwert/farbe hat.

messi

iNFiNiTE

God

Re: [coding] eigenes makro programm schreiben

Mittwoch, 23. April 2008, 01:38

die sache mit dem array hab ich jetzt fertig bekommen. ist noch nicht ganz ordentlich und evt ein bisschen dirty, aber falls bedarf besteht kann ich das hier publishen.

1024*768 pixel einlesen dauert auf meinem pentium m 1,6ghz etwas mehr als 10sek :o

TrOuble

God

Re: [coding] eigenes makro programm schreiben

Mittwoch, 23. April 2008, 01:52

Na sind ja auch 786432 Pixel ... ;)
Du hast das ganze aber sehr wahrscheinlich nicht (end)rekursiv geschrieben oder? Würde mich doch arg wundern, wenn das wirklich 10sek dauern sollte - klingt für mich eher nach ner einfachen Schleife :o

Willste den Code mal posten? Hätte Interesse da mal rein zu schauen (auch wenn ich keine Verwendung dafür habe).

Gruß TrOuble

iNFiNiTE

God

Re: [coding] eigenes makro programm schreiben

Mittwoch, 23. April 2008, 02:01

ja ne, is ned rekursiv. einfach doppelte schleife, wie du richtig vermutet hast.

nur wie willst du da was rekursiv lösen? da steh ich atm irgendwie auf dem schlauch..
werd den code morgen nochmal versuchen etwas zu optimieren und dann hier posten :)

iNFiNiTE

God

Re: [coding] eigenes makro programm schreiben

Mittwoch, 23. April 2008, 14:05

wie gesagt, recht dirty (.net c#):

includes:

Quellcode

1
2
3
4
5
6
7
8
9
10
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Drawing.Imaging;
using System.Diagnostics;


programm:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
Stopwatch sw = new Stopwatch();
            Bitmap Screenshot;
            Graphics gfx;
            Color pixelColor;
            string color,R,G,B;
            int position = 0;
            int tempInt = 0;
            string[,] hexArray = new string[Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height];

            sw.Start();
            
            Screenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
            gfx = Graphics.FromImage(Screenshot);
            gfx.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
            


            for (int i = 0; i < Screen.PrimaryScreen.Bounds.Width; i++)
            {
                for (int j = 0; j < Screen.PrimaryScreen.Bounds.Height; j++)
                {

                    //pixel detection
                    pixelColor = Screenshot.GetPixel(i, j);
                    color = pixelColor.ToString();

                    //format ist: "Color [A=XXX, R=XXX, G=XXX, B=XXX]"
                    //"Color [A=XXX, R=" löschen
                    position = color.IndexOf(",");
                    color = color.Substring(position + 4);

                    //ende des R werts bestimmen
                    position = color.IndexOf(",");
                    R = color.Substring(0, position);

                    //"XXX, G=" löschen & ende bestimmen
                    color = color.Substring(position + 4);
                    position = color.IndexOf(",");
                    G = color.Substring(0, position);

                    //"XXX, B=" löschen & ende bestimmen
                    color = color.Substring(position + 4);
                    position = color.IndexOf("]");
                    B = color.Substring(0, position);


                    //rgb werte in hex werte ändern
                    tempInt = Convert.ToInt32(R);
                    R = String.Format("{0:X}", tempInt);
                    tempInt = Convert.ToInt32(G);
                    G = String.Format("{0:X}", tempInt);
                    tempInt = Convert.ToInt32(B);
                    B = String.Format("{0:X}", tempInt);

                    //bei zahlen unter 16 ist zbsp 10 = A und nicht 0A, daher 0 drankleben
                    if (R.Length == 1)
                        R = "0" + R;
                    if (G.Length == 1)
                        G = "0" + G;
                    if (B.Length == 1)
                        B = "0" + B;
                
                    hexArray[i,j] = R + G + B;

                }
            }

            sw.Stop();
            MessageBox.Show("Das Einlesen von " + (Screen.PrimaryScreen.Bounds.Width * Screen.PrimaryScreen.Bounds.Height)
                            + " Pixeln hat " + sw.ElapsedMilliseconds + "ms gedauert. Das sind " +
                            (Screen.PrimaryScreen.Bounds.Width * Screen.PrimaryScreen.Bounds.Height / sw.ElapsedMilliseconds)
                            + " Pixel/ms.");


für optimierungen bin ich immer zu haben :D

messi

Y0Gi

God

Re: eigenes makro programm schreiben *teil gelöst*

Mittwoch, 23. April 2008, 15:18

Je nachdem was du letztlich vorhast wird hier ein sehr kurzer Weg aufgezeigt, um über Python und die PIL Pixel auszulesen.

iNFiNiTE

God

Re: eigenes makro programm schreiben *teil gelöst*

Mittwoch, 23. April 2008, 16:28

naja, die lösung in .net gefällt mir schon sehr gut - nur dass ich die zeitdauer gerne um einiges reduzieren würde.. 1sek wäre viel besser, aber da müsste man optimierungen des faktor10 finden..

Y0Gi

God

Re: eigenes makro programm schreiben *teil gelöst*

Mittwoch, 23. April 2008, 18:21

Deswegen hatte ich ja die Alternative vorgeschlagen, vielleicht ist die um Längen schneller.

hurra

God

Re: eigenes makro programm schreiben *teil gelöst*

Mittwoch, 23. April 2008, 18:23

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
color = pixelColor.ToString(); 
 
     //format ist: "Color [A=XXX, R=XXX, G=XXX, B=XXX]" 
     //"Color [A=XXX, R=" löschen 
     position = color.IndexOf(","); 
     color = color.Substring(position + 4); 
 
     //ende des R werts bestimmen 
     position = color.IndexOf(","); 
     R = color.Substring(0, position); 
 
     //"XXX, G=" löschen & ende bestimmen 
     color = color.Substring(position + 4); 
     position = color.IndexOf(","); 
     G = color.Substring(0, position); 
 
     //"XXX, B=" löschen & ende bestimmen 
     color = color.Substring(position + 4); 
     position = color.IndexOf("]"); 
     B = color.Substring(0, position);


Da gibts bestimmt was schnelleres. Das ganze erst in nen String zu konvertieren und den dann einzeln wieder zu zerklauben ist da etwas schlecht.

iNFiNiTE

God

Re: eigenes makro programm schreiben *teil gelöst*

Mittwoch, 23. April 2008, 19:03

ja, nur was.
hab jetz aber gehört, das getPixel sehr lahm sein soll. gibt da ne custom klasse im netz mit der das 800x (!) schneller gehen soll. ich werds mal versuchen zu implementieren ;)

yogi, wenn alle stricke reissen auch die von dir genannte variante :)

messi

iNFiNiTE

God

Re: eigenes makro programm schreiben *teil gelöst*

Mittwoch, 23. April 2008, 20:41

mit dieser neuen methode konnte ich immerhin 1sek rausholen.

wenn ich das von hurra genannte string gedrösel weglasse könnte ich nochmal 4 sek sparen... nur seh ich da keine wirkliche möglichkeit.

hurra

God

Re: eigenes makro programm schreiben *teil gelöst*

Mittwoch, 23. April 2008, 20:53

Kannst du denn aus dem PixelColor nicht direkt die einzelnen Farbwerte abfragen?

iNFiNiTE

God

Re: eigenes makro programm schreiben *teil gelöst*

Mittwoch, 23. April 2008, 21:06

das wars *patsch*.
NATÜRLICH gibt es die funktion und ich zerschnipsel den string :(
bin jetz auf 3,5sekunden ;D

edit: 2sek ;D

xx_ElBarto

God

Re: eigenes makro programm schreiben *teil gelöst*

Mittwoch, 23. April 2008, 21:47

mal so als anhalt:
unter linux nen screen zu machen, in python das bild zu öffnen und nen ausschnitt aus zu schneiden, und diesen mit hilfe von gocr analysieren zu lassen dauert ca 300-400ms
(natürlich screen aufm ram drive und so, weil festplatte is da zu lahm ;))

da könnte sich windows mal ne scheibe von abschneiden ;)

Y0Gi

God

Re: eigenes makro programm schreiben *teil gelöst*

Mittwoch, 23. April 2008, 22:15

messi glaubt mir ja nicht, dass ich da eine *wirkliche* Alternative angepriesen habe ... :)

iNFiNiTE

God

Re: eigenes makro programm schreiben *teil gelöst*

Mittwoch, 23. April 2008, 23:45

ich glaub es dir sicherlich. hab es auch selbst getestet: das array is quasi in 0,nix da bei python.
nur sind meine python kentnisse recht stark eingerostet, sodass ich nicht mehr testen konnte :-X :'(

elbarto, schön und gut. linux kann vieles besser aber auch vieles schlechter.
ich nutze gerne linux, aber es geht hier um windows applikationen - und da ist linux auch mit wine keine alternative.

Y0Gi

God

Re: eigenes makro programm schreiben *teil gelöst*

Donnerstag, 24. April 2008, 00:13

Ich denke nicht, dass das jetzt rein vom OS abhängt, dass es bei ihm soviel schneller war.