Paradigm Shift Design

ISHITOYA Kentaro's blog.

Jsonicで画像転送API

ん、他にもいろいろ書くことはあるんだけれど、とりあえず、鍵を忘れて研究室から帰れずに増田様に来ていただくことになってしまったので、時間つぶし…orz


画像をサーバーに転送する方法はいろいろとあるみたいだけれど、Socketは使いたくないし、メールでやるのも面倒だし、HTTPがどうのとか考えたくないので、バイト配列をBase64エンコードしてJsonicで送りつけてやることにしました。


クライアント側のコードはこんな感じ

/**
 * upload background image
 */
public override void uploadBackgroundImage(Image image, int backgroundId)
{
    try
    {
        MemoryStream stream = new MemoryStream();
        Bitmap bitmap = new Bitmap((Image)image.Clone());
        bitmap.Save(stream, ImageFormat.Jpeg);

        ArrayList param = this.createRequest(Convert.ToBase64String(stream.ToArray()));
        param.Add(backgroundId);
        String result = this.call("TimeMachineBoard.uploadBackgroundImage", param);

    }
    catch (Exception e)
    {
        if (this.debug)
        {
            Console.WriteLine(e);
        }
    }
}

callとcreateRequestはなんか適当に作ったやつ。MemoryStreamを使うと簡単にbitmapのバイト配列を得ることができるらしい。
ImageConverter使うと、Byte配列は取れるけどフォーマットを指定できなくて困っていたんだけれど、MemoryStreamとBitmap.Saveで解決。
どうでもいいけど、stream.ToArrayとか増田君みたいなネーミングはやめてほしい。stream.ToBytesかToByteArrayだろ。


で、サーバー側では

/**
 * upload background image
 */
public void uploadBackgroundImage(String data, int backgroundId){
    try{
        byte[] bytes = Base64.decodeBase64(data.getBytes());
        ByteArrayInputStream input = new ByteArrayInputStream(bytes);
        BufferedImage image = ImageIO.read(input);
        FileOutputStream output = 
            new FileOutputStream("D:\\workspace\\tmboarddb\\src\\main\\webapp\\images\\" + backgroundId + ".jpg");
        ImageIO.write(image, "jpg", output);
    }catch(IOException e){			
    }
}

とかすると、データがちゃんと保存されてた。
因みに、スクリーンをキャプチャする方法 - Paradigm Shift Designで取得した画像をAPIで転送するという話でした。


しかし、普通はどうやってデータを送りつけるんだろうなぁ。

関連: