画像を出力するだけのWebサーバー

適当に画像を生成する必要があったので、JDKのHttpServerを使って画像を出力するだけのWebサーバーを作ってみた。


「http ://localhost:6780/HOGE」にアクセスするとこんな画像が得れる。


ソースはこんな感じ

package imageserver;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import javax.imageio.ImageIO;

public class ImageServer {
    private static final int PORT = 6780;
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        HttpServer server = HttpServer.create(
                new InetSocketAddress(PORT), 0);
        
        server.createContext("/", new HttpHandler() {
            @Override
            public void handle(HttpExchange he) throws IOException {
                String path = he.getRequestURI().getPath();
                System.out.println(path);
                //画像を作成
                BufferedImage bi = getStringImage(path);

                //PNGデータを得る
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                ImageIO.write(bi, "png", baos);
                
                //ヘッダー
                he.getResponseHeaders().add(
                        "Content-Type", "image/png");
                he.sendResponseHeaders(200, baos.size());

                //出力
                OutputStream os = he.getResponseBody();
                os.write(baos.toByteArray());
                os.close();

                he.close();
            }
        });
        
        server.start();
    }

    /**
     * 文字列画像を得る
     * @param s 描画する文字列
     * @return 文字列を描いた画像
     */
    public static BufferedImage getStringImage(String s) {
        BufferedImage bi = new BufferedImage(400, 300, BufferedImage.TYPE_INT_RGB);
        Graphics g = bi.getGraphics();
        //背景
        int code = s.hashCode();
        int rd = (code & 4) == 0 ? 0 : 255;
        int gr = (code & 2) == 0 ? 0 : 255;
        int bl = (code & 1) == 0 ? 0 : 255;
        g.setColor(new Color(rd, gr, bl));
        g.fillRect(0, 0, 400, 300);
        //文字色
        if((code & 7) != 0){
            g.setColor(Color.BLACK);
        }else{
            g.setColor(Color.WHITE);
        }
        //文字描画
        g.setFont(new Font(Font.SERIF, Font.BOLD, 50));
        g.drawString(s, 0, 160);
        g.dispose();
        return bi;
    }

}