2016-03-30 13 views
0

Ich weiß, dass es ähnliche Fragen zu diesem, aber diejenigen, die meine Frage nicht beantworten. Wie der Titel liest, verwende ich JavaFX Image Klasse, nicht gepuffertImage.javafx argb zu Graustufen Umwandlung

Ich habe die Antwort auf this andere Frage verwendet, aber das resultierende Bild ist leer.

Dies ist mein Code:

public static Image toGrayScale(Image sourceImage) { 
    PixelReader pixelReader = sourceImage.getPixelReader(); 

    int width = (int) sourceImage.getWidth(); 
    int height = (int) sourceImage.getHeight(); 

    WritableImage grayImage = new WritableImage(width, height); 

    for (int y = 0; y < height; y++) { 
     for (int x = 0; x < width; x++) { 
      int pixel = pixelReader.getArgb(x, y); 

      int red = ((pixel >> 16) & 0xff); 
      int green = ((pixel >> 8) & 0xff); 
      int blue = (pixel & 0xff); 

      int grayLevel = (int) (0.2162 * red + 0.7152 * green + 0.0722 * blue)/3; 
      int gray = (grayLevel << 16) + (grayLevel << 8) + grayLevel; 

      grayImage.getPixelWriter().setArgb(x, y, gray); 

    } 
    return grayImage; 
} 

kann mir jemand sagen, was das Problem ist.

+0

Scheint wie ein Duplikat von [Wie in JavaFX Farbe des Bildes ändern] (http://stackoverflow.com/questions/18124364/how-to-change-color-of-image -in-javafx)? – jewelsea

+1

Sie verpassen eine Klammer, um Ihre innere for-Schleife zu schließen. – ManoDestra

+0

@jewelsea, danke, aber das will ich nicht. – blaze

Antwort

1

Ich habe Ihren Code funktioniert, indem Sie Folgendes tun, aber ich habe nicht ganz herausgefunden, warum das der Fall sein muss. Es hat etwas mit dem Wert des Int zu tun, der für die Speicherung im Image benötigt wird. Sie müssen den Graustufenwert invertieren und die -gray-Ganzzahl speichern. Vielleicht ein Little/Big Endian Problem. Kann mit einem ColorAdjust sicherer sein.

// Put this outside the loops 
    // so we have easier access to the writer. 
    PixelWriter pixelWriter = grayImage.getPixelWriter(); 
    for (int x = 0; x < width; x++) { 
     for (int y = 0; y < height; y++) { 
      int pixel = pixelReader.getArgb(x, y); 

      int red = ((pixel >> 16) & 0xff); 
      int green = ((pixel >> 8) & 0xff); 
      int blue = (pixel & 0xff); 

      int grayLevel = (int) (0.2162 * (double)red + 0.7152 * (double)green + 0.0722 * (double)blue)/3; 
      grayLevel = 255 - grayLevel; // Inverted the grayLevel value here. 
      int gray = (grayLevel << 16) + (grayLevel << 8) + grayLevel; 

      pixelWriter.setArgb(x, y, -gray); // AMENDED TO -gray here. 
     } 
    } 
2

Um ein Graustufen aus einem Bild zu bekommen, ich würde nur ein desaturation effect anwenden.

grayscale

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.effect.ColorAdjust; 
import javafx.scene.image.*; 
import javafx.scene.layout.HBox; 
import javafx.stage.Stage; 

public class Desaturation extends Application { 
    @Override 
    public void start(Stage stage) throws Exception { 
     Image image = new Image(
       "http://www.iamqurat.com/wp-content/uploads/2016/02/National_Flower_Rose_flickr_20140901.jpg", 
       200, 
       0, 
       true, 
       true 
     ); 

     ImageView original = new ImageView(image); 

     ImageView desaturated = new ImageView(image); 
     ColorAdjust desaturate = new ColorAdjust(); 
     desaturate.setSaturation(-1); 
     desaturated.setEffect(desaturate); 

     Scene scene = new Scene(new HBox(original, desaturated)); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
}