http://gyazo.com
というサービスがあって、簡単にスクリーンショットをWebにあ
げられるんだけど、
clientソフトがMac用しかない。
なのでC# VS2005で作ってみていて大体できたんだけど、
POSTしたらhttp 500エラーが返ってきてアップされない。
APIとかもソース読めって感じでupload.cgi(サーバ側)と
upload.rb(クライアント側)が公開されてるだけだったので
適当にソース読んでC#で実装してた。
今回使った技は、
・透明フルスクリーンのウィンドウを作る
→マウス入力を全部キャンセルするため
・タイマでクリックとクリック離しを監視する
→Formに対するMouseDown/MouseUpイベントで取ると、
ちゃんとクリックしないと反応しない事があるので
if(Control.MouseButtons == MouseButtons.Left)
を毎回実行
・C#2.0からGraphicsクラスを使ってスクリーンショット
を取れるようになってた
> Image bmp = new Bitmap(1024, 768);
> g = Graphics.FromImage(bmp);
> g.CopyFromScreen(new Point(0,0), new Point(0,0), bmp.Size);
> g.Dispose();
> pictureBox1.Image = bmp; // 表示
・Bitmapをbyte配列に変換する時にBitmapヘッダを
飛ばしたい時は、なぜかJpegを経由するとできる(謎)
> System.IO.MemoryStream ms = new System.IO.MemoryStream();
> bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
> byte[] imgByte = new byte[ms.Length];
> imgByte = ms.ToArray();
やっぱC#だとPOSTのデータを手動で作らないとならないの
で超めんどいですね。
なんかこんだけ行数かけてPOSTした後に、また別に
WebResponseオブジェクト作ってレスポンス受信しなきゃならないんで
すけど…ありえない。
//文字コード
System.Text.Encoding enc =
System.Text.Encoding.GetEncoding("utf-8");
//区切り文字列
string boundary = "----BOUNDARYBOUNDARY----";
//WebRequestの作成
System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)
System.Net.WebRequest.Create(url);
//メソッドにPOSTを指定
req.Method = "POST";
//ContentTypeを設定
req.ContentType = "multipart/form-data; boundary=" +
boundary;
DateTime now = DateTime.Now;
//POST送信するデータを作成
string postData = "";
postData = "--" + boundary + "\r\n" +
"Content-Disposition: form-data; name=\"id
\"\r\n\r\n" +
now.Year+now.Month+now.Day+now.Hour+now.Minute
+now.Second + "\r\n" +
"--" + boundary + "\r\n" + // 区切り
"Content-Disposition: form-data; name=
\"imagedata\"\r\n\r\n" + //
imagedata
imgByte.ToString() + "\r\n\r
\n" + // ここまでimagedata
"--" + boundary + "\r\n" + // 区切り
"Content-type: multipart/form-data\r
\n\r\n";
//バイト型配列に変換
byte[] startData = enc.GetBytes(postData);
postData = "\r\n--" + boundary +
"\r\n";
byte[] endData = enc.GetBytes(postData);
//POST送信するデータの長さを指定
req.ContentLength = startData.Length + endData.Length;
//データをPOST送信するためのStreamを取得
System.IO.Stream reqStream = req.GetRequestStream();
//送信するデータを書き込む
reqStream.Write(startData, 0, startData.Length);
fs.Close();
reqStream.Write(endData, 0, endData.Length);
reqStream.Close();
--
橋本 翔(Sho Hashimoto)
sho...@sfc.keio.ac.jp
http://shokai.org/
そなんだ。Perlだと楽チンだけどね。
BaseなんちゃらでエンコードさせてからPOSTでしょ。
わだ
Sho Hashimoto さんは書きました:
--
Yusuke Wada / 和田裕介 <yus...@kamawada.com>
web <http://kamawada.com/~yusuke>