Google Chart API
リリース後 10 日も経っているので,絶対誰かが既にやってるでしょうが……
http://chart.apis.google.com/chart?chs=256x256&cht=s&chm=o,000000ff,1,1.0,8.0......
URL の文字数制限がきついので,Simple encoding を選んで 0〜61 の世界で戦うのがよさげ.
(追記) やっぱり先人がいた(id:hetappi:20071209:1197213046).
実は Line charts でよかったのか.すばらしいドット絵.
クエリ文字列生成コード
サイズ 61×61 のビットマップ専用.
public static string SimpleEncoding(Bitmap bmp) { const string ENC_STR = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; int RANGE_MAX = ENC_STR.Length - 1; if (bmp.Width != RANGE_MAX || bmp.Height != RANGE_MAX) throw new ArgumentException( string.Format("bmp size should be {0}x{0}", RANGE_MAX), "bmp"); var pixels = from y in Enumerable.Range(0, bmp.Height) from x in Enumerable.Range(0, bmp.Width) let color = bmp.GetPixel(x, bmp.Height - y - 1) let gray = Math.Min((color.R * 0.3 + color.G * 0.59 + color.B * 0.11) / 255.0, 1.0) where gray < 0.9 select new { X = x, Y = y, G = (int)((1.0 - gray) * RANGE_MAX) }; var encoded_x_y_size = new[] { new string(pixels.Select(p => ENC_STR[p.X]).ToArray()), new string(pixels.Select(p => ENC_STR[p.Y]).ToArray()), new string(pixels.Select(p => ENC_STR[p.G]).ToArray()) }; return "s:" + string.Join(",", encoded_x_y_size); } public static Uri GetChartUri(Bitmap bmp) { var para = new Dictionary<string, string>(); para["chs"] = string.Format("{0}x{1}", 256, 256); // image size para["cht"] = "s"; // scatter para["chm"] = "o,000000ff,1,1.0,8.0"; // marker para["chf"] = "bg,s,ffffff00"; // background color para["chd"] = SimpleEncoding(bmp); // simple encoding //Skip UrlEncoding for shorter uri //Func<string, string> urlEncode = s => HttpUtility.UrlEncode(s, Encoding.ASCII); //var queryStr = string.Join("&", // para.Select(pair => pair.Key + "=" + urlEncode(pair.Value)).ToArray()); var queryStr = string.Join("&", para.Select(pair => pair.Key + "=" + pair.Value).ToArray()); return new Uri(@"http://chart.apis.google.com/chart?" + queryStr); }