http://d.hatena.ne.jp/antlabo/20110611/1307768591
この人が結構やっているんだけど、ある画像を別の小さな画像のあつまりで再現するという処理。
常用漢字でモナリザをつくったりしてて、面白い。
このコードをそのままこぴぺして、前に作ったWebカメラから写真を取得して処理するアプリに組み込んでみた。
前のサーバーサイドはrailsだったけど、画像検索のライブラリLIREhttp://www.semanticmetadata.net/lire/を使うために、javaにしなきゃということで、
サーブレットに作り直した。
アプリのデモはここで公開しています。(そのうちやめるかもしれないけど)
http://www.saizo-aoyagi.jp:8080/Collage2/
Webカメラの画像は、WebRTC APIを使って取得する。
これについては、一番上のリンク先参照。
画像を処理するサーブレットのメインのコード
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //ポストされてきたデータをBase64でコード String val = request.getParameter("imageData"); byte[] decoded = Base64.decode(val); InputStream in = new ByteArrayInputStream(decoded); //レスポンスは字で返す response.setContentType("text/plain"); BufferedImage readImage = null; //レスポンスから PrintWriter printWriter = response.getWriter(); try { //送られてきたファイルを画像に readImage = ImageIO.read(in); //出力ストリームつくる ByteArrayOutputStream baos = new ByteArrayOutputStream(); BufferedOutputStream bos = new BufferedOutputStream(baos); //コラージュ作る String realPath2 = this.getServletContext().getRealPath(Collage.INDEX_PATH_IN_SERVLET); Collage.createCollageInServlet(readImage, bos, realPath2); readImage.flush(); bos.flush(); bos.close(); byte[] bImage = baos.toByteArray(); String byteString =Base64.encode(bImage); //文字列出力 printWriter.write(byteString); //画像出力 //ImageIO.write(readImage, "gif", out); } catch (Exception e) { e.printStackTrace(); readImage = null; } }
こいつがたたいている、コラージュを作る関数(これはほぼ参考サイトのコピペ)
public static void createCollageInServlet(BufferedImage bimg, BufferedOutputStream bos, String indexPath) throws IOException{ // 検索対象のIndexを読むReaderを作る IndexReader reader = IndexReader.open(FSDirectory.open(new File(indexPath))); ImageSearcher searcher = ImageSearcherFactory.createDefaultSearcher(); //白い画像を作る BufferedImage imageBlank = new BufferedImage(bimg.getWidth(), bimg.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D gr = imageBlank.createGraphics(); gr.setColor(Color.WHITE); gr.fillRect(0, 0, bimg.getWidth(), bimg.getHeight()); for (int i = 0; i < ROOP; i++) { //ここは参考サイトのコピペ } gr.dispose(); ImageIO.write(imageBlank, "png", bos); }
文字列をBase64エンコード、デコードするとか、byteの配列にするとか、なんかややこしかった。
画像処理のコラージュ作る部分も自分なりの何かに置き換えたら、コード全体を公開しようと思う
この内容とあまり関係ないが、javaによる画像処理の本紹介。
実際に呼んだのはこれ。
あんまり詳しくない初心者向けだが、初心者なので役に立った本。古いので中古しかない。
- 作者: 杉山三樹雄
- 出版社/メーカー: ディーアート
- 発売日: 2002/12
- メディア: 単行本
- クリック: 7回
- この商品を含むブログ (2件) を見る
こっちはあるらしい。
Javaによる画像処理プログラミング (I・O BOOKS)
- 作者: 赤間世紀
- 出版社/メーカー: 工学社
- 発売日: 2007/01
- メディア: 単行本
- 購入: 1人 クリック: 3回
- この商品を含むブログ (5件) を見る