Javaで写真をトイカメラ風にしたい


いつものように、ふとJavaで写真をトイカメラ風にしてみたいと思ったので、早速試してみました。


簡単に実現したかたので、Jerry Huxtableさんという人が公開しているJava Image Filtersを使ってみました。

http://www.jhlabs.com/ip/filters/index.html


ライセンスは、 Apache License, Version 2.0とのこと。


ダウンロードすると、ソースとjarが提供されているですが、なぜかjarが少し古いようなのでソースからantでビルドしてFilter.jarをつくり直してから、それをビルドバスに通しました。


作り方は、Photoshopトーンカーブを使ったトイカメラ風の写真にする方法が紹介されていたので、それをそのまま同じように適応しただけです。

http://photoshopvip.net/archives/13661


実際に動かして作った画像は、以下。


↓加工前の写真


トイカメラ風に加工した後の写真


いかがですか?個人的には、これだけでもいい感じかなぁと思っていますw


コードは、以下の通り。

package sample.imagefilter;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.imageio.ImageIO;

import com.jhlabs.image.Curve;
import com.jhlabs.image.CurvesFilter;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**
 * トイカメラ風の画像を作成するサンプルです。
 * トーンカーブのみで表現しています。
 */
public class ToycameraSample {
	public static void main(String[] args) {
		try {
			BufferedImage src = ImageIO.read(new File("sample.jpg"));

			// 赤
			Curve red = new Curve();
			red.x = new float[] { 0, 90 / 255f, 170 / 255f, 217 / 255f, 1 };
			red.y = new float[] { 0, 40 / 255f, 190 / 255f, 255 / 255f, 1 };
			// 緑
			Curve green = new Curve();
			green.x = new float[] { 0, 62 / 255f, 190 / 255f, 1 };
			green.y = new float[] { 0, 61 / 255f, 220 / 255f, 1 };
			// 青
			Curve blue = new Curve();
			blue.x = new float[] { 0, 255 / 255f };
			blue.y = new float[] { 30 / 255f, 225 / 255f };
			Curve[] rgb = new Curve[] { red, green, blue };
			CurvesFilter cf = new CurvesFilter();
			cf.setCurves(rgb);
			BufferedImage dist = cf.filter(src, null);

			// ImageIO.writeだと画質が悪いみたいです。
			// ImageIO.write(dist, "jpg", new File("sample_after.jpg"));
			OutputStream os = null;
			try {
				os = new FileOutputStream(new File("sample_after.jpg"));
				JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os);
				JPEGEncodeParam params = encoder.getDefaultJPEGEncodeParam(dist);
				params.setQuality(0.95f, false);
				encoder.encode(dist, params);
			} finally {
				os.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


画像編集の知識がないので少し調べたんだけど、画像の加工って奥が深いなぁと思いましたw