読者です 読者をやめる 読者になる 読者になる

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);
}