2016-03-30 16 views
0

これに似た質問がありますが、私の質問には答えられないことが分かります。タイトルが読んでいるうちに、私はJavaFX Imageクラスを使用していますが、bufferedImageは使用していません。javafx argbからグレースケール変換へ

私はthisの答えを使用しましたが、結果の画像は空です。

これは私のコードです:

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; 
} 

誰もが、問題が何であるかを私に伝えることができます。

+0

http://stackoverflow.com/questions/18124364/how-to-change-color-of-image([JavaFXの画像の色を変更する方法]の重複するように思えます-in-javafx)? – jewelsea

+1

内側のforループを閉じるためのブラケットがありません。 – ManoDestra

+0

@jewelsea、ありがとう、しかし、それは私が欲しいものではありません。 – blaze

答えて

1

私はあなたのコードを以下のようにして作業していますが、なぜこれがどうして必要なのかを完全には分かっていません。これは、Imageに格納するのに必要なintの値と関係があるものです。グレーレベルの値を反転し、グレーの整数を格納する必要があります。 Little/Big Endianの問題かもしれません。 ColorAdjustを使用すると安全です。

// 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

画像からグレースケールを得るために、私はちょうどdesaturation effectを適用すると思います。

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); 
    } 
} 
関連する問題