2016-08-05 21 views
0

ich einige Pixel in einem Canvas-Knoten gemalt, wie folgt aus:Wie Leinwand Pixel deaktivieren Glättung

canvas.getGraphicsContext2D().getPixelWriter().setColor(10, 10, Color.RED); 

Dann skaliert ich die Leinwand. Jetzt sind die Pixel blury/glatt (siehe das erste Bild). Aber was ich erreichen möchte, ist im zweiten Bild dargestellt.

Wie kann ich das tun?

Image 1 Image 2

Antwort

0

Einige Möglichkeiten der Bilder in javafx und in der Tat viele der Komponenten in javafx Rendering sind ein Anti-Aliasing das heißt, sie werden versuchen, zu glätten here für einen anderen Beitrag sehen es mit Bildern bedeckt.

Sie könnten versuchen, die Pixel zu einem Bildansicht Zeichnung erste und das Deaktivieren des Glättungs Attribut und neu zu zeichnen das Bild wieder auf den Kontext:

ImageView scaledImageView = new ImageView(image); 
scaledImageView.setSmooth(false); 

jedoch, die eine Neuimplementierung von dem, was Sie bereits haben, erfordern würde und Zeichnen Sie das Bild zurück auf den Kontext2d mit der angepassten Größe.

Dieser Beitrag here hatte das gleiche Problem mit Unschärfe verursacht durch Anti-Aliasing nur als Referenz.

Es gibt auch einige weniger invasive Lösungen, die, manchmal Anti-Aliasing arbeiten könnten kann das Bild verzerren, wenn Sie/Zoom-Skalierung um einen Betrag von weniger als 2, Beispiele 32x32, 64x64, tut es dies, weil:

Auf Gerätepixelebene werden ganzzahlige Koordinaten auf die Ecken abgebildet und Risse zwischen den Pixeln und den Mittelpunkten der Pixel erscheinen bei den Mittelpunkten zwischen ganzzahligen Pixelpositionen. Da alle Koordinatenwerte mit Gleitkommazahlen angegeben werden, können Koordinaten präzise auf diese Ecken zeigen (wenn die Gleitkommawerte exakte Ganzzahlwerte haben) oder auf eine beliebige Stelle auf dem Pixel. Zum Beispiel würde eine Koordinate von (0,5, 0,5) auf die Mitte des oberen linken Pixels auf der Bühne zeigen. Ähnlich würde ein Rechteck bei (0, 0) mit den Dimensionen von 10 mal 10 von der oberen linken Ecke des oberen linken Pixels auf der Bühne bis zur unteren rechten Ecke des 10. Pixels auf der 10. Scanlinie reichen. Die Pixelmitte des letzten Pixels innerhalb dieses Rechtecks ​​wäre bei den Koordinaten (9.5, 9.5).