Статьи

Применение эффекта сепии к загруженным изображениям в JavaFX 2.0

В этой записи блога я рассматриваю очень простое приложение JavaFX 2.0, которое загружает изображение, предоставленное в командной строке, и представляет его как в обычной форме, так и с примененным к нему эффектом SepiaTone в JavaFX 2.0 . Простое приложение представляет два изображения бок о бок для драматического эффекта. Для достижения этой цели , простой пример демонстрирует загрузку изображений в JavaFX на основе URL, использование HBox расположения компонентов, а также доступ к параметрам командной строки в приложении JavaFX с помощью приложения «с getParameters () методом.

В обычной фотографии использование сепии может сделать фотографию более старой или антикварной. JavaFX SepiaTone Effect выполняет это для компонентов JavaFX, включая загруженные изображения. Следующий фрагмент кода показывает, как это можно сделать.

SepiaEffect.java

package dustin.examples;

import java.util.List;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.effect.SepiaTone;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

/**
 * Simple demonstration of the SepiaTone Effect.
 * 
 * @author Dustin
 */
public class SepiaEffect extends Application
{
   /** Default width of displayed photographs/images. */
   private final static int DEFAULT_WIDTH = 540;

   /**
    * Overridden (from parent Application class) method.
    * 
    * @param stage Primary stage.
    * @throws Exception JavaFX 2.0 application exception or file I/O exception.
    */
   @Override
   public void start(final Stage stage) throws Exception
   {
      // Get command-line parameters and access first argument as image URL.
      final Parameters params = getParameters();
      final List<String> parameters = params.getRaw();
      final String imageUrl = !parameters.isEmpty() ? parameters.get(0) : "";

      // The third-to-last 'true' preserves height/width ratio and the next
      // 'true' argument indicates better quality (smooth) filtering should be
      // used and the final 'true' indicates that background loading should be
      // used. The imageUrl must really be a URL and begin with a protocol
      // such as file:\\ or http:\\.
      final Image loadedImage = new Image(imageUrl, DEFAULT_WIDTH, 405, true, true, true);
      final ImageView originalView = new ImageView(loadedImage);
      final ImageView sepiaView = new ImageView(loadedImage);
      sepiaView.setEffect(new SepiaTone());  // default is full (1.0) effect

      final HBox horizontalBox = new HBox();
      horizontalBox.getChildren().add(originalView);
      horizontalBox.getChildren().add(sepiaView);

      stage.setTitle("Demonstration of JavaFX 2.0 Sepia Effect");
      final Group rootGroup = new Group();
      final Scene scene = new Scene(rootGroup, DEFAULT_WIDTH*2, 405, Color.WHITE);
      rootGroup.getChildren().add(horizontalBox);
      stage.setScene(scene);
      stage.show();
   }

   /**
    * Main function for running demonstration of JavaFX 2.0 SepiaTone Effect.
    * 
    * @param arguments Command-line arguments: none expected.
    */
   public static void main(final String[] arguments)
   {
      Application.launch(arguments);
   }
}

В приведенном выше примере используется менее 70 строк, включая пробелы и слишком подробные комментарии в коде, предназначенном для примера с сообщением в блоге. При запуске с фотографией, которую я сделал в Джуно , приложение выглядит так, как показано на следующем снимке экрана.

Исходное изображение было загружено только один раз в один экземпляр Image , но два разных экземпляра ImageView использовались для представления этого одного экземпляра Image как в исходной цветовой схеме, так и с эффектом сепии . Применение эффекта сепии — только одна строка. Можно указать уровень «сепия», но в этом случае я использовал значение по умолчанию. Компонент макета HBox позволяет легко размещать изображения рядом друг с другом.

Как видно из комментария в примере кода, строка, предоставляемая конструктору Image, должна быть URL-адресом, который включает протокол, такой как http или файл. Например, в моем случае строка, которую я указал в качестве аргумента командной строки для примера приложения, была «file: /// C: /Users/Dustin/Pictures/P1010804-juneau.jpg». Без префикса file: // приложение не может найти изображение для его загрузки.

Этот пост в блоге показал, что загрузка изображений в JavaFX 2.0 и применение к ним эффектов не вызывает затруднений.

 

От http://marxsoftware.blogspot.com/2012/01/applying-sepia-effect-to-loaded-images.html