2011年06月04日

Twitterのプロフィール画像を取得する方法2(C#メモ)

前回の記事『Twitterのプロフィール画像を取得する方法(C#メモ)』で users/profile_image を使っていたのですが、どうやら確認のために使うもので通常は使ってはいけないようです。

こちらの記事で指摘されてました。
profileImageの取得 twitter4j

ここにも書いてありました。
twitter/api/users/profile_image/twitter

どうやら users/profile_image_url で取得するのが正しいようなので、サンプルを書き直しました。

ユーザー情報を取得するためには次のAPIを使用します。

http://api.twitter.com/1/users/show.[format]

APIの説明はこの辺りを参照してください。
GET users/show

前回同様、WebRequest、WebResponseを使ってユーザーの情報を取得します。

WebRequest api_req = WebRequest.Create(
    "http://api.twitter.com/1/users/show.xml?screen_name=XXXX");
WebResponse api_res = api_req.GetResponse();

読み込んだユーザーの情報をXMLパーサに読み込ませて、profile_image_urlを取得します。

StreamReader api_sr = new StreamReader(api_res.GetResponseStream());
System.Xml.XmlDocument xml = new System.Xml.XmlDocument();
xml.LoadXml(api_sr.ReadToEnd());

System.Xml.XmlNode node = xml.SelectSingleNode("/user/profile_image_url");
string profile_image_url = node.InnerText;

以降は、前回と同様です。
profile_image_urlが画像のURLです。このURLから画像を取得するのも、WebRequest、WebResponseで良いです。

WebRequest image_req = WebRequest.Create(profile_image_url);
WebResponse image_res = image_req.GetResponse();

画像はSystem.IO.Streamを使ってBitmapに変換するのが楽です。

System.IO.Stream stream = image_res.GetResponseStream();
Bitmap bitmap = new Bitmap(stream);

後は、取得したbitmapを好きなようにすれば良いです。

簡単なサンプルプログラムを作ってみました。

using System;
using System.Drawing;
using System.IO;
using System.Net;
using System.Windows.Forms;
using System.Xml;

〜省略〜

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // 画像を取得するID
        string screen_name = "XXXX"; // ←画像を取得したいIDを入れてください

        // 画像を取得
        Bitmap image = GetProfileImage(screen_name);

        // PictureBoxに設定
        PictureBox picture = new PictureBox();
        picture.Left = 10;
        picture.Top = 10;
        picture.Size = image.Size;
        picture.Image = image;
        this.Controls.Add(picture);
    }

    // Users取得APIのアドレス
    private static readonly string USERS_SHOW_URL = 
        "http://api.twitter.com/1/users/show.xml";

    /// <summary>
    /// ProfileImageを取得する
    /// </summary>
    /// <param name="screen_name">ProfileImageを取得するID(screen_name)</param>
    /// <returns>取得した画像</returns>
    public Bitmap GetProfileImage(string screen_name)
    {
        // Users情報を取得
        WebRequest api_req = WebRequest.Create(
            USERS_SHOW_URL + "?screen_name=" + screen_name);
        WebResponse api_res = api_req.GetResponse();
        StreamReader api_sr = new StreamReader(
            api_res.GetResponseStream());

        // XmlDocumentに読み込ませる
        XmlDocument xml = new XmlDocument();
        xml.LoadXml(api_sr.ReadToEnd());

        // profile_image_urlを取得
        XmlNode node = xml.SelectSingleNode("/user/profile_image_url");
        string profile_image_url = node.InnerText;

        // 画像を取得
        WebRequest image_req = WebRequest.Create(profile_image_url);
        WebResponse image_res = image_req.GetResponse();

        // BITMAPに変換
        Stream stream = image_res.GetResponseStream();
        Bitmap bitmap = new Bitmap(stream);

        // 後始末
        stream.Close();
        image_res.Close();
        api_res.Close();

        // BITMAPを返却
        return bitmap;
    }
}

実行結果は次のようになります。
twitter-profile-image-sample2.png

私の画像だと面白みがないですね。

実際には、プロフィール画像だけを取得するケースというのは少ないと思います。ユーザーの情報をまるごと取得したときに、プロフィール画像のURLも一緒に読み込めますし、ユーザー情報はタイムラインを取得したときも一緒に取れるので、ついでに取得することができます。

注意点として、このやり方ですと、画像サイズの指定ができません。通常は48x48のサイズが返されるようですが、ときどき大きい画像が返されることがあるようです。実際に使うときには、画像サイズはBitmapなりPicutreBoxなりで調整する必要があると思います。
ちょっと疑問なのは、ツイッターのクライアント(例えば「ついっぷる」とか)で非常に大きいサイズの画像が表示できるものがありますよね。ユーザーが大きい画像をアップロードしているのだと思いますが、このAPIだと48x48のサイズしか取得できません。何か方法があるんでしょうが、良く分からないですね。

良かったらクリックしてください
にほんブログ村 IT技術ブログ プログラム・プログラマーへ  人気ブログランキングへ

posted by among at 09:15 | Comment(0) | TrackBack(0) | C#

2011年05月28日

Twitterのプロフィール画像を取得する方法(C#メモ)

Twitterのプロフィール画像(アイコン)をC#で取得する方法です。あまり難しくないためか、ネット上にサンプルが少なかったので書いておきます。

Twitterのプロフィール画像を取得するためには次のAPIを使用します。

http://api.twitter.com/1/users/profile_image/[screen_name].[format]

APIの説明はこの辺りを参照してください。
GET users/profile_image/:screen_name

このAPIは特殊で、formatにxmlまたはjsonを指定しますが、返されるのはプロフィール画像へのURIです。そのため、まず画像のURIを取得し、次に画像を取得する、という2段階の処理が必要になります。

画像のURIを取得するのは、WebRequest、WebResponseを使えば良いです。認証も不要なので、下記のようにすれば実現できます。

WebRequest api_req = WebRequest.Create(
    "http://api.twitter.com/1/users/profile_image/screen_name.xml");
WebResponse api_res = api_req.GetResponse();

api_res.ResponseUriが画像のURIです。このURIから画像を取得するのも、WebRequest、WebResponseで良いです。

WebRequest image_req = WebRequest.Create(api_res.ResponseUri);
WebResponse image_res = image_req.GetResponse();

画像はSystem.IO.Streamを使ってBitmapに変換するのが楽です。

System.IO.Stream stream = image_res.GetResponseStream();
Bitmap bitmap = new Bitmap(stream);

後は、取得したbitmapを好きなようにすれば良いです。

また、画像のURIを取得するときに、引数としてsizeの指定が可能です。mini(小サイズ)、normal(通常サイズ)、bigger(大サイズ)を指定することができます。省略した場合はnormalの扱いになります。

簡単なサンプルプログラムを作ってみました。

using System;
using System.Drawing;
using System.IO;
using System.Net;
using System.Windows.Forms;

〜省略〜

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // 画像を取得するID
        string screen_name = "XXXX"; // ←画像を取得したいIDを入れてください

        // 大きい画像を取得
        Bitmap bigger_image = GetProfileImage(screen_name, 
                                              ProfileImageSize.bigger);

        // PictureBoxに設定
        PictureBox bigger_picture = new PictureBox();
        bigger_picture.Left = 10;
        bigger_picture.Top = 10;
        bigger_picture.Size = bigger_image.Size;
        bigger_picture.Image = bigger_image;
        this.Controls.Add(bigger_picture);

        // 通常の画像を取得
        Bitmap normal_image = GetProfileImage(screen_name, 
                                              ProfileImageSize.normal);

        // PictureBoxに設定
        PictureBox normal_picture = new PictureBox();
        normal_picture.Left = bigger_picture.Right + 10;
        normal_picture.Top = 10;
        normal_picture.Size = normal_image.Size;
        normal_picture.Image = normal_image;
        this.Controls.Add(normal_picture);

        // 小さい画像を取得
        Bitmap mini_image = GetProfileImage(screen_name, 
                                            ProfileImageSize.mini);

        // PictureBoxに設定
        PictureBox mini_picture = new PictureBox();
        mini_picture.Left = normal_picture.Right + 10;
        mini_picture.Top = 10;
        mini_picture.Size = mini_image.Size;
        mini_picture.Image = mini_image;
        this.Controls.Add(mini_picture);
    }

    // Profile画像取得APIのアドレス
    private static readonly string PROFILE_IMAGE_URL = 
        "http://api.twitter.com/1/users/profile_image/";

    /// <summary>
    /// ProfileImageのサイズ
    /// </summary>
    public enum ProfileImageSize
    {
        mini = 0,       /// 小
        normal = 1,     /// 通常
        bigger = 2,     /// 大
    } ;

    /// <summary>
    /// ProfileImageを取得する
    /// </summary>
    /// <param name="screen_name">ProfileImageを取得するID(screen_name)</param>
    /// <param name="image_size">ProfileImageのサイズ</param>
    /// <returns>取得した画像</returns>
    public Bitmap GetProfileImage(string screen_name, 
                                  ProfileImageSize image_size)
    {
        // サイズ指定テキストの定義
        string[] image_size_string = { "mini", "normal", "bigger" };

        // 画像のURLを取得
        WebRequest api_req = WebRequest.Create(
            PROFILE_IMAGE_URL + screen_name + ".xml" + 
            "?size=" + image_size_string[(int)image_size]);
        WebResponse api_res = api_req.GetResponse();

        // 画像を取得
        WebRequest image_req = WebRequest.Create(api_res.ResponseUri);
        WebResponse image_res = image_req.GetResponse();

        // BITMAPに変換
        Stream stream = image_res.GetResponseStream();
        Bitmap bitmap = new Bitmap(stream);

        // 後始末
        stream.Close();
        image_res.Close();
        api_res.Close();

        // BITMAPを返却
        return bitmap;
    }
}

実行結果は次のようになります。
twitter-profile-image-sample.png

私の画像だと面白みがないですね。

良かったらクリックしてください
にほんブログ村 IT技術ブログ プログラム・プログラマーへ  人気ブログランキングへ

posted by among at 17:50 | Comment(0) | TrackBack(2) | C#

2011年05月22日

ListViewを更新したときのちらつきを抑制する(C#メモ)

リストビュー(System.Windows.Forms.ListView)を更新したときに起きる描画のちらつきを抑える方法です。
アイテムが少なかったり更新頻度が低ければ目立ちませんが、詳細ビューでアイテムが多かったり、頻繁に更新するような場合は、ちらつきが目立ちます。

ちらつきを抑えるにはダブルバッファを使用します。(ダブルバッファについての説明は省略します。ググってください。いわゆる裏画面のことです)
FormにはDoubleBufferedというプロパティがあるので、これをTrueにするだけで良かったのですが、ListViewには同様のプロパティがありません。そこでListViewを継承してDoubleBufferedがTrueを返すクラスを作ります。

// ダブルバッファ仕様のListView
class BufferedListView : System.Windows.Forms.ListView
{
    protected override bool DoubleBuffered { get { return true; } set { } }
}

フォームでは作成したBufferedListViewを使います。

public partial class Form1 : Form
{
    private BufferedListView listView1;

    public Form1()
    {
        InitializeComponent();

        // フォームのDoubleBufferedもtrueにする
        this.DoubleBuffered = true;

        // BufferedListViewの生成と配置
        this.listView1 = new BufferedListView();
        this.Controls.Add(this.listView1);
    }
}

BufferedListViewはDoubleBufferedがtrueであること以外はListViewと全く同じなので、同じように使えます。

良かったらクリックしてください
にほんブログ村 IT技術ブログ プログラム・プログラマーへ  人気ブログランキングへ

posted by among at 15:42 | Comment(0) | TrackBack(0) | C#