JavaFX示例--简易图片处理工具

在JavaFX中,大概是2.2之后的版本中,新增加了像素处理的相关类。这就意味着我们可以做一些图片处理的事。


  还是老样子,大家可以先看看示例。支持拖动本地图片到程序中进行处理。


  示例地址: 点击


  如下图所示:


  JavaFX示例--简易图片处理工具_第1张图片

  

  这只是一个简易的图片处理示例,我们可以对图片进行明暗度 饱和度 灰度 颜色反转等处理。 然后保存在本地。同样的,我们可以拖动图片到ImageView中进行处理。


 JavaFX中的拖动教程已有写过。大家可以去看看。

 

  首先我们要知道在JavaFX中进行图像像素处理需要使用的几个类。


 PixelReader和PixelWriter,顾名思义。这两个是像素读取和像素写入的类。需要注意的是,我们只能从JavaFX的Image中读取像素,而像素写入,必须要对WritableImage进行操作。


 WritableImage是一个可写入像素的Image。通常我们可以从Image中读取像素,然后创建一个同样大小的WritableImage,然后将读取的像素进行处理,再写入到WritableImage中。


 总的来说,还是很简单的。


  另外,JavaFX中的Color,自己就附带了简单的颜色处理的方法。我们可以直接使用,来进行一般的颜色处理。例如: Color.brighter(), 可以让颜色更加明亮。 Color.invert(),可以让颜色进行反转。


  下面大家来看看示例代码:

  

[java]  view plain copy
  1. public class MainClass extends Application {  
  2.     private ImageView imageView;  
  3.     private Image image;  
  4.     private WritableImage wImage;  
  5.     private FileChooser fileChooser;  
  6.     @Override  
  7.     public void start(final Stage primaryStage) {  
  8.         StackPane stackPane = new StackPane();  
  9.         Scene scene = new Scene(stackPane);  
  10.           
  11.         VBox mVBox = new VBox(20);  
  12.         HBox mButtonsBox = new HBox(10);  
  13.         mButtonsBox.setAlignment(Pos.CENTER);  
  14.           
  15.         Button bright = new Button("明亮");  
  16.         Button darker = new Button("深暗");  
  17.         Button gray = new Button("灰度处理");  
  18.         Button invert = new Button("颜色反转");  
  19.         Button saturate  = new Button("增加饱和度");  
  20.         Button desaturate = new Button("减少饱和度");  
  21.         Button recover = new Button("还原图片");  
  22.         Button export = new Button("导出");  
  23.           
  24.         fileChooser = new FileChooser();  
  25.         fileChooser.getExtensionFilters().add(new ExtensionFilter("图片文件""*.png","*.jpg""*.bmp""*.gif"));  
  26.         bright.setOnAction(new EventHandler() {  
  27.               
  28.             @Override  
  29.             public void handle(ActionEvent event) {  
  30.                 pixWithImage(0);  
  31.             }  
  32.         });  
  33.           
  34.         darker.setOnAction(new EventHandler() {  
  35.               
  36.             @Override  
  37.             public void handle(ActionEvent event) {  
  38.                 pixWithImage(1);  
  39.             }  
  40.         });  
  41.           
  42.         gray.setOnAction(new EventHandler() {  
  43.               
  44.             @Override  
  45.             public void handle(ActionEvent event) {  
  46.                 pixWithImage(2);  
  47.             }  
  48.         });  
  49.           
  50.         invert.setOnAction(new EventHandler() {  
  51.               
  52.             @Override  
  53.             public void handle(ActionEvent event) {  
  54.                 pixWithImage(3);  
  55.             }  
  56.         });  
  57.           
  58.         saturate.setOnAction(new EventHandler() {  
  59.               
  60.             @Override  
  61.             public void handle(ActionEvent event) {  
  62.                 pixWithImage(4);  
  63.             }  
  64.         });  
  65.           
  66.         desaturate.setOnAction(new EventHandler() {  
  67.               
  68.             @Override  
  69.             public void handle(ActionEvent event) {  
  70.                 pixWithImage(5);  
  71.             }  
  72.         });  
  73.           
  74.         recover.setOnAction(new EventHandler() {  
  75.   
  76.             @Override  
  77.             public void handle(ActionEvent event) {  
  78.                 imageView.setImage(image);  
  79.             }  
  80.         });  
  81.           
  82.         export.setOnAction(new EventHandler() {  
  83.   
  84.             @Override  
  85.             public void handle(ActionEvent event) {  
  86.                 File file = fileChooser.showSaveDialog(primaryStage.getOwner());  
  87.                 if (file != null) {  
  88.                     try {  
  89.                         ImageIO.write(SwingFXUtils.fromFXImage(wImage, null), "png", file);  
  90.                     } catch (IOException e) {  
  91.                         e.printStackTrace();  
  92.                     }  
  93.                 }  
  94.             }  
  95.         });  
  96.           
  97.         mButtonsBox.getChildren().addAll(bright,darker,gray,invert,saturate,desaturate,recover,export);  
  98.         image = new Image("res/test.jpg");  
  99.         imageView = new ImageView(image);  
  100.         imageView.setSmooth(true);  
  101.         imageView.setOnDragOver(new EventHandler() {  
  102.   
  103.             @Override  
  104.             public void handle(DragEvent event) {  
  105.                 if(event.getGestureSource() != imageView){  
  106.                     event.acceptTransferModes(TransferMode.ANY);  
  107.                 }  
  108.             }  
  109.         });  
  110.           
  111.         imageView.setOnDragDropped(new EventHandler() {  
  112.   
  113.             @Override  
  114.             public void handle(DragEvent event) {  
  115.                 Dragboard dragboard = event.getDragboard();  
  116.                 List files = dragboard.getFiles();  
  117.                 if(files.size() == 1){  
  118.                     File file = files.get(0);  
  119.                     try {  
  120.                         image = new Image(new FileInputStream(file));  
  121.                         imageView.setImage(image);  
  122.                     } catch (FileNotFoundException e) {  
  123.                         e.printStackTrace();  
  124.                     }  
  125.                 }  
  126.             }  
  127.         });  
  128.   
  129.         mVBox.getChildren().addAll(mButtonsBox, imageView);  
  130.         stackPane.getChildren().add(mVBox);  
  131.           
  132.         primaryStage.setTitle("JavaFX示例--简易图片处理工具");  
  133.         primaryStage.setScene(scene);  
  134.         primaryStage.setWidth(600);  
  135.         primaryStage.setHeight(500);  
  136.         primaryStage.show();  
  137.     }  
  138.       
  139.     private void pixWithImage(int type){  
  140.         PixelReader pixelReader = imageView.getImage().getPixelReader();  
  141.         // Create WritableImage  
  142.         wImage = new WritableImage(  
  143.                 (int)image.getWidth(),  
  144.                 (int)image.getHeight());  
  145.         PixelWriter pixelWriter = wImage.getPixelWriter();  
  146.           
  147.         for(int y = 0; y < image.getHeight(); y++){  
  148.             for(int x = 0; x < image.getWidth(); x++){  
  149.                 Color color = pixelReader.getColor(x, y);  
  150.                 switch (type) {  
  151.                 case 0:  
  152.                     color = color.brighter();  
  153.                     break;  
  154.                 case 1:  
  155.                     color = color.darker();  
  156.                     break;  
  157.                 case 2:  
  158.                     color = color.grayscale();  
  159.                     break;  
  160.                 case 3:  
  161.                     color = color.invert();  
  162.                     break;  
  163.                 case 4:  
  164.                     color = color.saturate();  
  165.                     break;  
  166.                 case 5:  
  167.                     color = color.desaturate();  
  168.                     break;  
  169.                 default:  
  170.                     break;  
  171.                 }  
  172.                 pixelWriter.setColor(x, y, color);  
  173.             }  
  174.         }  
  175.         imageView.setImage(wImage);  
  176.     }  
  177.   
  178.     public static void main(String[] args) {  
  179.         launch(args);  
  180.     }  
  181. }  

  

  由于比较简单,我们在这里只用一个主类来进行。


  界面上只是一个VBox,上面是一排按钮的HBox,下面是一个ImageView


  pixWithImage(int type)是一个按照类型来进行颜色处理的方法。大家可以看到,我们首先通过Image来获取pixelReader。然后,创建一个同等大小的WriteableImage,并获取这个WriteableImagepixelWriter


 我们通过一个双层for循环遍历原始Image的像素,然后对每个像素进行处理之后,通过PixelWriter写入到WriteableImage中,最后将新的Image显示到ImageView里。


  其他的代码都是很基础的,就不做过多解释了。


 不过这里有一个很重要的类SwingFXUtils,它可以将Swing中的Image和JavaFX中的Image进行转换,这样对以前的Java图形程序的移植提供了很大的方便。


 下面大家看看效果截图:

  JavaFX示例--简易图片处理工具_第2张图片


  JavaFX示例--简易图片处理工具_第3张图片


   转载请注明出处: http://blog.csdn.net/ml3947


-------------------------------------------------------------------------------------------------------------------------

  JavaFX在国外目前讨论的还比较火热,相反在国内,却是关注的人不多。实在令人汗颜。其实本人工作一直在进行Android开发,即使随便写写文章访问量也应该会很大,但我并不想做那种太多人都在做的事。所以一直在坚持的JavaFX相关的研究和写教程。

  不过本人马上要从现在的Android项目,跳到Unity3D项目去了。以后可能会新增加一些Unity3D的教程。因为本人对3D的兴趣还是很大的。


------------------------------------------------

你可能感兴趣的:(java)