Funktioniert "Canvas.Pixels[x,y]" unter MacOSX nicht?
-
- Beiträge: 124
- Registriert: Mo 6. Sep 2010, 18:39
- OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
- CPU-Target: Win 7
- Wohnort: Mailand
Funktioniert "Canvas.Pixels[x,y]" unter MacOSX nicht?
Hallo zusammen,
ich hab irgendwie das Problem, das ich unter OSX die Farbe von Pixeln auf dem Formular auslesen
möchte, allerdings funktioniert "Canvas.Pixels[x,y]" überhaupt nicht.
Woran könnte das liegen?
Danke schonmal
mintpc
ich hab irgendwie das Problem, das ich unter OSX die Farbe von Pixeln auf dem Formular auslesen
möchte, allerdings funktioniert "Canvas.Pixels[x,y]" überhaupt nicht.
Woran könnte das liegen?
Danke schonmal
mintpc
-
- Beiträge: 124
- Registriert: Mo 6. Sep 2010, 18:39
- OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
- CPU-Target: Win 7
- Wohnort: Mailand
Re: Funktioniert "Canvas.Pixels[x,y]" unter MacOSX nicht?
Hallo,
hat niemand eine Idee, ob das bei Mac grundsätzlich nicht
funktioniert oder ob es einen anderen Weg gibt?
Danke schonmal
mintpc
hat niemand eine Idee, ob das bei Mac grundsätzlich nicht
funktioniert oder ob es einen anderen Weg gibt?
Danke schonmal
mintpc
-
- Beiträge: 206
- Registriert: Di 10. Nov 2009, 18:49
- OS, Lazarus, FPC: macOS, 10.13, lazarus 1.8.x, fpc 3.0.x
- CPU-Target: 32Bit/64bit
Re: Funktioniert "Canvas.Pixels[x,y]" unter MacOSX nicht?
Vielleicht komme ich in einer Woche dazu. Zu beschäftigt im Moment. Kannst du ein Mini-Projekt erstellen, das man auf verschiedenen Plattformen testen kann?
MiSchi macht die fink-Pakete
Re: Funktioniert "Canvas.Pixels[x,y]" unter MacOSX nicht?
Was für Pixel? Wie kommen die da hin?
Funktioniert dein Code mit anderen Betriebssystemen?
Funktioniert dein Code mit anderen Betriebssystemen?
-
- Beiträge: 768
- Registriert: Mo 4. Mai 2009, 13:24
- OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
- CPU-Target: x86_64-linux-qt/gtk2
- Kontaktdaten:
Re: Funktioniert "Canvas.Pixels[x,y]" unter MacOSX nicht?
Grundsätzlich kann man unter Cocoa (oder Carbon?) jedenfalls der Standard-API auf Mac OS X nur innerhalb der OnPaint()-Events zeichnen. Alternativ kannst du gegen Qt linken - was jedoch eine nicht ganz triviale Installation voraussetzt.
-
- Beiträge: 124
- Registriert: Mo 6. Sep 2010, 18:39
- OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
- CPU-Target: Win 7
- Wohnort: Mailand
Re: Funktioniert "Canvas.Pixels[x,y]" unter MacOSX nicht?
Erstmal danke für die Antworten, aber ich hatte mich wahrscheinlich nicht deutlich gemacht.
Ich hab ein kleines Beispielprogramm, das das Problem verdeutlichen soll.
In der OnPaint-Methode des Formulars wird ein roter Balken gezeichnet. Wenn ich mit der
Maus auf den Balken klicke, soll die Farbe des Balkens abgenommen werden und ein zweiter
Balken mit derselben Farbe gezeichnet werden.
Das Ganze funktioniert unter Windows wie es soll, unter Mac OS Lion (gerade nochmal getestet) funktioniert
es eben nicht. Der erste rote Balken wird gezeichnet, beim Klicken der Maus passiert aber eben nichts.
Hier ist der kurze Code:
Im Anhang dasselbe als Programm.
Kann das mal vielleicht jemand nem Mac testen? Oder liegt es
an meiner OSX Version (10.7.5)?
Besten Dank
mintpc
Ich hab ein kleines Beispielprogramm, das das Problem verdeutlichen soll.
In der OnPaint-Methode des Formulars wird ein roter Balken gezeichnet. Wenn ich mit der
Maus auf den Balken klicke, soll die Farbe des Balkens abgenommen werden und ein zweiter
Balken mit derselben Farbe gezeichnet werden.
Das Ganze funktioniert unter Windows wie es soll, unter Mac OS Lion (gerade nochmal getestet) funktioniert
es eben nicht. Der erste rote Balken wird gezeichnet, beim Klicken der Maus passiert aber eben nichts.
Hier ist der kurze Code:
Code: Alles auswählen
var
Form1: TForm1;
Zeichnen : Boolean = false;
Farbe : Tcolor = clblack;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Farbe := self.Canvas.Pixels[x,y];
Zeichnen := true;
self.Invalidate;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
self.canvas.pen.width := 20;
self.canvas.Pen.color := clred;
self.canvas.Line(10, 30, 100, 30);
if Zeichnen then
begin
self.canvas.pen.width := 20;
self.canvas.Pen.color := Farbe;
self.canvas.Line(10, 60, 100, 60);
end;
end;
Im Anhang dasselbe als Programm.
Kann das mal vielleicht jemand nem Mac testen? Oder liegt es
an meiner OSX Version (10.7.5)?
Besten Dank
mintpc
- Dateianhänge
-
Lazarus - MacOS Pixelproblem.zip
- (268.89 KiB) 261-mal heruntergeladen
-
- Beiträge: 124
- Registriert: Mo 6. Sep 2010, 18:39
- OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
- CPU-Target: Win 7
- Wohnort: Mailand
Re: Funktioniert "Canvas.Pixels[x,y]" unter MacOSX nicht?
Hallo, nochmal ich.
Ich hab in einem englischen Forum die Idee gefunden, einen Screenshot als Bitmap zu speichern und
dann davon den entsprechenden Pixel auszulesen. Die Funktion dazu sieht so aus:
Das Problem ist mal wieder (oh Wunder), dass das unter Windows funktioniert (mit leichter Zeitverzögerung),
unter OSX allerdings einen Fehler wirft. Das liegt wahrscheinlich am Aufruf über
Irgendwie kann OSX das Mouse.Cursorpos nicht.
Hat jemand eine Ahnung, wie dieses Problem zu lösen ist?
Gruß
mintpc
Ich hab in einem englischen Forum die Idee gefunden, einen Screenshot als Bitmap zu speichern und
dann davon den entsprechenden Pixel auszulesen. Die Funktion dazu sieht so aus:
Code: Alles auswählen
uses [...] LCLIntf, LCLType;
[. . . ]
function ScreenColor(aX, aY: integer):TColor;
var
ScreenDC: HDC;
SaveBitmap: TBitmap;
begin
SaveBitmap := TBitmap.Create;
try
SaveBitmap.SetSize(Screen.Width, Screen.Height);
ScreenDC := GetDC(0);
try
SaveBitmap.LoadFromDevice(ScreenDC);
finally
ReleaseDC(0, ScreenDC);
end;
Result := SaveBitmap.Canvas.Pixels[aX, aY];
finally
SaveBitmap.Free;
end;
end;
unter OSX allerdings einen Fehler wirft. Das liegt wahrscheinlich am Aufruf über
Code: Alles auswählen
ScreenColor(Mouse.Cursorpos.x, Mouse.Cursorpos.y);
Hat jemand eine Ahnung, wie dieses Problem zu lösen ist?
Gruß
mintpc
-
- Beiträge: 40
- Registriert: Mo 27. Mai 2013, 13:16
- OS, Lazarus, FPC: Arch Linux, OpenSuse 13.2, Lazarus 1.4
- CPU-Target: AMD64
- Wohnort: Berlin
Re: Funktioniert "Canvas.Pixels[x,y]" unter MacOSX nicht?
Zeichne doch alles was du zeichnen musst erstmal in einen Bitmap-Puffer, den du in OnPaint nur auf die Form zeichnest.
Dort dürfte die Abfrage von Farbwerten nämlich funktionieren.
Dort dürfte die Abfrage von Farbwerten nämlich funktionieren.
Code: Alles auswählen
var
Buffer: TBitmap;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Farbe := Buffer.Canvas.Pixels[x,y];
Zeichnen := true;
RenderStuff;
Invalidate;
end;
procedure TForm1.Renderstuff;
begin
Buffer.canvas.pen.width := 20;
… Buffer.canvas.Pen.color := Farbe; …
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Draw(0,0, Buffer);
end;
-
- Beiträge: 206
- Registriert: Di 10. Nov 2009, 18:49
- OS, Lazarus, FPC: macOS, 10.13, lazarus 1.8.x, fpc 3.0.x
- CPU-Target: 32Bit/64bit
Re: Funktioniert "Canvas.Pixels[x,y]" unter MacOSX nicht?
Ich habe Canvas unter Carbon probiert und da kommt für Pixel und auch für Colors immer nur weiß als Farbe. In dem Beispielprogramm wird der Balken tatsächlich gezeichnet, aber weil er weiß ist, ist er nicht zu sehen. Keine Ahnung, ob das innerhalb von Canvas für Carbon behoben werden könnte oder nicht. Wenn es noch keinen gibt, reicht das , um einen Bugreport zu schreiben.
MiSchi.
MiSchi.
MiSchi macht die fink-Pakete
-
- Beiträge: 124
- Registriert: Mo 6. Sep 2010, 18:39
- OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
- CPU-Target: Win 7
- Wohnort: Mailand
Re: Funktioniert "Canvas.Pixels[x,y]" unter MacOSX nicht?
Hallo. Danke erstmal für die Antworten.
Das mit dem Zwischenpuffer ist ne gute Idee, leider aber wieder das alte Spiel: Bei Windows super, bei
Mac gar nichts. Jetzt stürzt die Kiste sogar einfach nur ab. Tut sich gar nichts mehr, muss ausgeschaltet
werden.
Problematisch scheint mir das Setzen der Bitmap-Größe zu sein.
Da gibt es stets ne Fehlermeldung. Aber ohne die Bitmapgröße funktioniert
es gar nicht. Auch nicht unter Windows.
Oh Mann. Hätte nicht gedacht, das dieses Problem so ein Brocken sein würde.
Ich bin am Verzweifeln.
mintpc
Das mit dem Zwischenpuffer ist ne gute Idee, leider aber wieder das alte Spiel: Bei Windows super, bei
Mac gar nichts. Jetzt stürzt die Kiste sogar einfach nur ab. Tut sich gar nichts mehr, muss ausgeschaltet
werden.
Problematisch scheint mir das Setzen der Bitmap-Größe zu sein.
Code: Alles auswählen
Buffer := TBitmap.create;
Butter.setSize(Screen.Width, Screen.Height);
es gar nicht. Auch nicht unter Windows.
Oh Mann. Hätte nicht gedacht, das dieses Problem so ein Brocken sein würde.
Ich bin am Verzweifeln.

mintpc
-
- Beiträge: 40
- Registriert: Mo 27. Mai 2013, 13:16
- OS, Lazarus, FPC: Arch Linux, OpenSuse 13.2, Lazarus 1.4
- CPU-Target: AMD64
- Wohnort: Berlin
Re: Funktioniert "Canvas.Pixels[x,y]" unter MacOSX nicht?
Welchen Fehler wirft denn SetSize bei dir? Und warum benutzt du Screen.Size, wäre deine Zeichenfläche vielleicht sinnvoller mit Form.Width&Height angegeben?
Ich mach das immer folgendermaßen: In OnCreate erstelle ich das Bitmap lediglich, das Setzen der Größe mach ich nur in OnResize.
Denn ich bin mir nie sicher, inwieweit die Größe schon beim OnCreate-Ereignis feststeht.
Probier das mal, gibt es dann immer noch Fehler?
Andererseits kenne ich mich mit Mac so überhaupt nicht aus…
Edit: Aber wenn das natürlich tatsächlich eine Sache von Mac und Canvas ist, wie mischi sagt, kann auch der Puffer dir nicht weiterhelfen -> Bugreport
Ich mach das immer folgendermaßen: In OnCreate erstelle ich das Bitmap lediglich, das Setzen der Größe mach ich nur in OnResize.
Denn ich bin mir nie sicher, inwieweit die Größe schon beim OnCreate-Ereignis feststeht.
Probier das mal, gibt es dann immer noch Fehler?
Code: Alles auswählen
procedure TForm1.FormCreate;
Buffer := TBitmap.Create;
procedure TForm1.FormResize;
Buffer.SetSize(Width, Height);
procedure TForm1.FormPaint;
Canvas.Draw(0,0, Buffer)
procedure TForm1.FormDestroy;
Buffer.Free;
Edit: Aber wenn das natürlich tatsächlich eine Sache von Mac und Canvas ist, wie mischi sagt, kann auch der Puffer dir nicht weiterhelfen -> Bugreport
-
- Beiträge: 124
- Registriert: Mo 6. Sep 2010, 18:39
- OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
- CPU-Target: Win 7
- Wohnort: Mailand
Re: Funktioniert "Canvas.Pixels[x,y]" unter MacOSX nicht?
Hallo Joz,
danke für die Anwort, aber immer derselbe Fehler "Bitmap Size".
Unter Windows immer super, unter Mac läufts nicht.
Ich gebs jetzt auf.
Danke für alle Antworten
mintpc
danke für die Anwort, aber immer derselbe Fehler "Bitmap Size".
Unter Windows immer super, unter Mac läufts nicht.
Ich gebs jetzt auf.
Danke für alle Antworten
mintpc
Re: Funktioniert "Canvas.Pixels[x,y]" unter MacOSX nicht?
Hallo mintpc,
hast Du schon mal mit einem alternativen Bitmap getestet?!: http://wiki.freepascal.org/BGRABitmap#D ... _to_pixels
Schön wäre es trotzdem, wenn Du einen Bugreport erstellen würdest, damit das Problem hoffentlich irgendwann gefixt wird!
Scheinbar nutzen hier im Forum zu wenig einen MAC. Du könntest daher auch noch nach einer Lösung im englischen Forum fragen/suchen. Da gibt es ein paar mehr, die für MAC entwickeln.
hast Du schon mal mit einem alternativen Bitmap getestet?!: http://wiki.freepascal.org/BGRABitmap#D ... _to_pixels
Schön wäre es trotzdem, wenn Du einen Bugreport erstellen würdest, damit das Problem hoffentlich irgendwann gefixt wird!
Scheinbar nutzen hier im Forum zu wenig einen MAC. Du könntest daher auch noch nach einer Lösung im englischen Forum fragen/suchen. Da gibt es ein paar mehr, die für MAC entwickeln.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 124
- Registriert: Mo 6. Sep 2010, 18:39
- OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
- CPU-Target: Win 7
- Wohnort: Mailand
Re: Funktioniert "Canvas.Pixels[x,y]" unter MacOSX nicht?
Hallo Michl,
klar, ich mach mal nen Bugreport ... und natürlich lässt mich
das Problem auch nicht los
Ich werd schon irgendeine Lösung finden. Da muss was gehn.
Wenn ich was raus hab, werde ich's hier melden.
mintpc
klar, ich mach mal nen Bugreport ... und natürlich lässt mich
das Problem auch nicht los

Ich werd schon irgendeine Lösung finden. Da muss was gehn.
Wenn ich was raus hab, werde ich's hier melden.
mintpc
-
- Beiträge: 104
- Registriert: Fr 22. Jun 2012, 01:51
- OS, Lazarus, FPC: Fedora-Linux 23 (Korora) Lazarus 1.6 FPC 3.0
- CPU-Target: 64Bit
- Wohnort: Bonn
Re: Funktioniert "Canvas.Pixels[x,y]" unter MacOSX nicht?
Benutze selber Linux, aber wenn das ganze nur unter OnPaint funktioniert, probier doch mal folgendes:
Sieht zwar nicht schön aus, aber wenns funktioniert, kannst du das ja auch noch irgendwie optimieren.
Code: Alles auswählen
var
Form1: TForm1;
Zeichnen : Boolean = false;
Farbe : Tcolor = clblack;
UpdatePixel: Boolean;
PixelPos: TPoint;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
PixelPos:= Point( X, Y );
Zeichnen := true;
self.Invalidate;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
if ( UpdatePixel ) then
begin
Farbe := self.Canvas.Pixels[PixelPos.x,PixelPos.y];
UpdatePixel:= False;
end;
self.canvas.pen.width := 20;
self.canvas.Pen.color := clred;
self.canvas.Line(10, 30, 100, 30);
if Zeichnen then
begin
self.canvas.pen.width := 20;
self.canvas.Pen.color := Farbe;
self.canvas.Line(10, 60, 100, 60);
end;
end;