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