CUBは子供の白熊

Java SE 8 実践プログラミングの練習問題を解く

第3章 ラムダ式を使ったプログラミング : 問題 8 : 画像変換の生成

問題

画像に任意の幅と任意の色の枠を追加するColorTransformerを生成するメソッドを実装せよ

解答

ColorTransformerは、第3章 ラムダ式を使ったプログラミング : 問題 5 : 座標を考慮した画像変換 - CUBは子供の白熊 で以下のように定義した

@FunctionalInterface
interface ColorTransformer {
    Color apply(int x, int y, Color colorAtXY);
}

ちょっと引数が多いが、ColorTransformerを生成するメソッドは以下のようになる。

ColorTransformer生成

/**
 * 与えられた幅と色の枠を追加する ColorTransformer の生成
 *
 * @param width       変換対象画像の幅
 * @param height      変換対象画像の高さ
 * @param frameWidth  枠の幅
 * @param frameColor  枠の色
 * @return            画像の色変換
 */
public static ColorTransformer colorTransformer(
    int width, int height, int frameWidth, Color frameColor)
{
    return (x, y, c) ->
        x < frameWidth || y < frameWidth || x >= width - frameWidth || y >= height - frameWidth
        ? frameColor : c;
}

問題 5 と同じ結果を得るには、以下のようにtransformメソッドを呼び出す

■ 問題 5 と同じ結果

public void start(Stage stage) throws Exception {
    Image image = new Image("queen-mary.png");
    int width  = (int)image.getWidth();
    int height = (int)image.getHeight();
    Image image2 = transform(image, colorTransformer(width, height, 10, Color.GRAY));
    stage.setScene(new Scene(new HBox(new ImageView(image), new ImageView(image2))));
    stage.show();
}