ラベル TinyPNG の投稿を表示しています。 すべての投稿を表示
ラベル TinyPNG の投稿を表示しています。 すべての投稿を表示

2015年10月22日木曜日

タイニーPNG のAPIを利用した画像圧縮アプリケーションの作成

こんにちわ山田です。
昨日は、オリオン座流星群がよく見えたそうですね。
まったく見れなかったです、、。

たまたま夕方のニュースで情報を得ていたので、楽しみにしていたら
朝になるまで思い出せませんでした。

そんなこんなで、画像を外部のサービス(API)を利用して
圧縮して、画像サイズを小さくするメソッドを作成したので、その覚書です。

開発環境 ASP.NET
開発言語 C#

使用したのは、TinyPNGでほぼ公式のリファレンス通りに実装しました。 
画像→byte配列にするのが苦戦しました。ここを参考にさせていただきました。 

呼び出し元
    protected void ButtonUpload_Click(object sender, EventArgs e)
    {
        Label1.Text = "";
        if(FileUpload1.HasFile)
        {
            string path = @"C:\temp\\";
            //つけたいファイル名
            string fileName = FileUpload1.PostedFile.FileName;
            string output = Path.Combine (path, fileName);

            //アップロードファイルを入力ストリーム経由でbyte配列に読み込む
            Byte[] aryData = new Byte[FileUpload1.PostedFile.ContentLength];
            FileUpload1.PostedFile.InputStream.Read(aryData, 0, FileUpload1.PostedFile.ContentLength);
            output = SizeDownImage(aryData, output);
            Label1.Text = "次のファイル名で保存しました: " + output;
        }
  
呼び出される側
    /// <summary>
    /// アップされた画像をTinyJPGのAPIを使用して、圧縮して保存するメソッド
    /// ・引数:
    ///  byte[] 画像のバイナリデータ
    ///  string 保存先のファイルパス
    /// ・返り値:
    ///  string 保存後のファイルパス
    ///   ※失敗した場合は、空を返却
    /// </summary>
    /// <param name="_imageByte"></param>
    /// <param name="_output"></param>
    /// <returns></returns>
    public static string SizeDownImage(Byte[] _imageByte, string _output)
    {
        string key = [外部APIキー];

        string url = [外部APIのURL];
        string auth = Convert.ToBase64String(Encoding.UTF8.GetBytes("api:" + key));

        WebClient client = new WebClient();
        client.Headers.Add(HttpRequestHeader.Authorization, "Basic " + auth);
        string result = "";
        try
        {
            //画像アップロード //
            client.UploadData(url, _imageByte);
            // 画像ダウンロード
            client.DownloadFile(client.ResponseHeaders["Location"], _output);
            result = _output;
        }
        catch (WebException ex)
        {
            log.Error(ex.Message);
        }
        finally
        {
            client.Dispose();
        }
        return result;
    }
}