Reputation: 43
I want to get the color for specific coordinates inside a Canvas
. I already tried getting a snapshot using this code:
WritableImage snap = gc.getCanvas().snapshot(null, null);
snap.getPixelReader().getArgb(x, y); //This just gets the color without assigning it.
But it just takes too much time for my application. I was wondering if there is any other way to access the color of a pixel for which I know the coordinates.
Upvotes: 4
Views: 4740
Reputation: 205815
A Canvas
buffers the drawing instructions prescribed by invoking the methods of a GraphicsContext
. There are no pixels to read until the Canvas
is rendered in a later pulse, and the internal format of the instruction buffer is not exposed in the API.
If a snapshot()
of the Canvas
is feasible, a rendered pixel may be examined using the resulting image's PixelReader
.
int aRGB = image.getPixelReader().getArgb(x, y);
This example focuses on a single pixel. This example displays the ARGB BlendMode
result in a TextField
and a Tooltip
as the mouse moves on the Canvas
. More examples may be found here.
As an alternative, consider drawing into a BufferedImage
, illustrated here, which allows access to the image's pixels directly and via its WritableRaster
. Adding the following line to this complete example outputs the expected value for opaque red in ARGB order: ffff0000
.
System.out.println(Integer.toHexString(bi.getRGB(50, 550)));
Upvotes: 9
Reputation: 11
public class Pixel
{
private static final SnapshotParameters SP = new SnapshotParameters();
private static final WritableImage WI = new WritableImage(1, 1);
private static final PixelReader PR = WI.getPixelReader();
private Pixel()
{
}
public static int getArgb(Node n, double x, double y)
{
synchronized (WI)
{
Rectangle2D r = new Rectangle2D(x, y, 1, 1);
SP.setViewport(r);
n.snapshot(SP, WI);
return PR.getArgb(0, 0);
}
}
public static Color getColor(Node n, double x, double y)
{
synchronized (WI)
{
Rectangle2D r = new Rectangle2D(x, y, 1, 1);
SP.setViewport(r);
n.snapshot(SP, WI);
return PR.getColor(0, 0);
}
}
}
Upvotes: -1