[C#] Cognitive Servicesでサムネイル作成(Computer Vision API)

Cloud Application Engineerの内海です。

今回はMicrosoft AzureのCognitive Servicesの中から画像解析等が可能なComputer Vision APIを使って、サムネイルの作成を行ってみたいと思います。


REST APIへアクセスするために必要なもの

REST APIへのアクセスのためにSubscription keyが必要になります。

1.下記サイトの『Request new trials』より『Computer Vision – Preview』を作成
https://www.microsoft.com/cognitive-services/en-US/subscriptions

2.作成されたSubscriptionよりKeyを取得
(下記画面のShowを押下でKeyが可視化されます。)
computervisonapi1


今回サムネイル作成に利用する画像ファイル

以下の2点を満たしている必要があります。
・ 対応しているファイル形式はJPEGとPNG、GIF、BMP
・ ファイルサイズは4MB以下


REST APIへのアクセス手順

サムネイル作成を行いたい画像ファイルをHTTPリクエストでPOSTしましょう。

レスポンスとしてリクエストパラメータで指定した画像サイズにトリミングされた画像データがバイナリで返ってきます。

POST先アドレスは以下のものになります。

https://api.projectoxford.ai/vision/v1.0/generateThumbnail

さらに、POST先アドレスにパラメータを仕込みます。

Key Value
width サムネイル画像の幅
1~1024の間で指定(サイズはピクセル)
推奨は50以上
height サムネイル画像の高さ
1~1024の間で指定(サイズはピクセル)
推奨は50以上
smartCropping スマートトリミングを有効にするかどうか
取りあえず”true”でOK

リクエストヘッダーは以下を設定しておきましょう。

Key Value
Content-Type 以下の3タイプの内から選択
どこかにアップロードした画像の場合
“application/json”
ローカル上の画像を送るなら以下のどちらか
“application/octet-stream”
“multipart/form-data”
Ocp-Apim-Subscription-Key 取得したSubscription Key

今回はローカル上のファイルを送るため、
リクエストボディには画像ファイルをByte配列として書き込みましょう。
画像ファイルのByte配列化はC#ならこんな感じ

var fs = new FileStream(/*ローカル上の画像ファイルパス*/, FileMode.Open, FileAccess.Read);
var byteData = new byte[fs.Length];
fs.Read(byteData, 0, byteData.Length);
fs.Close();

レスポンス

リクエストパラメータに加えリクエストヘッダーとボディに間違いがなければトリミングされた画像データがバイナリとして返ってきます。


サンプルコード

サンプルコードを載せておきます。

公式リファレンスに載っているサンプルコードにローカル上の画像ファイルのPOST処理、レスポンスバイナリをファイルに書き込む処理を加えたものになります。

using System;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Web;

namespace Computer_Vision_API
{
    class Program
    {
        static void Main(string[] args)
        {
            string filename = /*ファイルパス*/;
            GetThumbnail(filename);
            Console.ReadLine();
        }
        static async void GetThumbnail(string fname)
        {
            var client = new HttpClient();
            var queryString = HttpUtility.ParseQueryString(string.Empty);

            // Request headers
            client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", /*取得したSubscription Key*/);

            // Request parameters
            queryString["width"] = "200";
            queryString["height"] = "200";
            queryString["smartCropping"] = "true";
            var uri = "https://api.projectoxford.ai/vision/v1.0/generateThumbnail?" + queryString;

            HttpResponseMessage response;

            var fs = new FileStream(fname, FileMode.Open, FileAccess.Read);
            byte[] byteData = new byte[fs.Length];
            fs.Read(byteData, 0, byteData.Length);
            fs.Close();

            using (var content = new ByteArrayContent(byteData))
            {
                content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
                response = await client.PostAsync(uri, content);
            }
            var responceStream = response.Content.ReadAsStreamAsync();

            if (responceStream == null) return;

            byte[] buf = new byte[20000];
            byte[] bs;

            using (var ms = new MemoryStream())
            {
                while (true)
                {
                    int read = responceStream.Result.Read(buf, 0, buf.Length);
                    if (read > 0)
                    {
                        ms.Write(buf, 0, read);
                    }
                    else
                    {
                        break;
                    }
                }
                bs = ms.ToArray();
                using (FileStream filStream = new FileStream("thumbnail.jpeg", FileMode.Create, FileAccess.Write))
                using (BinaryWriter binWriter = new BinaryWriter(filStream))
                {
                    binWriter.Write(bs);
                }
            }
        }
    }
}