2014-03-29 12 views
5

Ich mache einen Sprite-Editor mit JavaFX für die Verwendung auf Desktops.JavaFX: Bildglättung auf Canvas-Objekt deaktivieren

Ich versuche, Zoomen Funktionalität zu implementieren, aber ich habe ein Problem: Ich kann nicht herausfinden, wie Bildglättung auf einem Canvas Objekt deaktivieren.

Ich rufe Canvas.setScaleX() und Canvas.setScaleY() wie in jedem Tutorial Implementierung Canvas Zoomen. Aber mein Bild erscheint verschwommen, wenn es in gezoomt wird.

Ich habe einige Testcode here zu demonstrieren.

What I getWhat I want

Da dies ein Sprite-Editor, ist es wichtig für mich, scharfe Kanten zu haben, mit zu arbeiten. Die Alternative zum Fixieren der Bildglättung auf der Canvas ist eine non-smoothing ImageView zu haben, und eine versteckte Canvas zu zeichnen, die ich lieber vermeiden würde.

Hilfe ist willkommen.


(here's a link to a related question, but doesn't address my particular problem)

Antwort

3

Ich war mit der Verwischung das gleiche Problem haben.

In meinem Fall hat mein Computer Retina Display. Retina Display bewirkt, dass ein Pixel mit Subpixeln gerendert wird. Beim Zeichnen von Bildern auf die Leinwand wird das Bild mit Antialiasing für die Subpixel gezeichnet. Ich habe keine Möglichkeit, zu verhindern, dass diese Anti-Aliasing auftritt (obwohl es möglich ist, mit anderen Leinwand Technologien wie HTML5's Canvas)

In der Zwischenzeit gefunden, ich habe eine Behelfslösung (wenn auch ich mache mir Sorgen um Leistung):

public class ImageRenderer { 
    public void render(GraphicsContext context, Image image, int sx, int sy, int sw, int sh, int tx, int ty) { 
     PixelReader reader = image.getPixelReader(); 
     PixelWriter writer = context.getPixelWriter(); 
     for (int x = 0; x < sw; x++) { 
     for (int y = 0; y < sh; y++) { 
      Color color = reader.getColor(sx + x, sy + y); 
      if (color.isOpaque()) { 
       writer.setColor(tx + x, ty + y, color); 
      } 
     } 
     } 
    } 
} 

Der PixelWriter umgeht das Anti-Aliasing, das beim Zeichnen des Bildes auftritt.