すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:画像処理 (C# SDK V1)

最終更新日:Mar 21, 2026

Image Processing (IMG) は、Object Storage Service (OSS) が提供する、安全で費用対効果が高く、信頼性の高い画像処理サービスであり、大量のデータを処理するのに役立ちます。ソースイメージを OSS にアップロードした後、RESTful API オペレーションを呼び出すことで、インターネットに接続された任意のデバイスからイメージを処理できます。

前提条件

開始する前に、以下を確認してください。

  • ソースイメージを含む OSS バケット

  • 有効なアクセス認証情報で構成された OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数

注意事項

  • このトピックの例では、中国 (杭州) リージョンのパブリックエンドポイントを使用します。同じリージョン内の他の Alibaba Cloud サービスから OSS にアクセスするには、代わりに内部エンドポイントを使用します。詳細については、「リージョンとエンドポイント」をご参照ください。

  • このトピックの例では、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名またはセキュリティトークンサービス (STS) を使用して OSSClient インスタンスを作成するには、「初期化」をご参照ください。

クライアントのセットアップ

このトピックのすべての例では、次の初期化コードを使用して OSSClient インスタンスを作成します。例を実行する前に、プレースホルダー値を実際のバケット名、オブジェクト名、およびローカルファイルパスに置き換えてください。

using System;
using System.IO;
using Aliyun.OSS;
using Aliyun.OSS.Common;
using Aliyun.OSS.Util;

// Endpoint for the region where your bucket is located.
// 例: 中国 (杭州) の場合は https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";

// 環境変数からアクセス認証情報を読み取ります。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");

// ソースイメージを含むバケット。
var bucketName = "examplebucket";

// 完全なオブジェクトパス。イメージがバケットのルートにない場合は、
// ディレクトリプレフィックスを含めます。例: exampledir/example.jpg
var objectName = "exampledir/example.jpg";

// 処理されたイメージが保存されるローカルパス。
var localImageFilename = "D:\\localpath\\example.jpg";

// バケットのリージョン ID。例: 中国 (杭州) の場合は cn-hangzhou。
const string region = "cn-hangzhou";

// ClientConfiguration インスタンスを作成し、署名アルゴリズム V4 を使用します。
var conf = new ClientConfiguration();
conf.SignatureVersion = SignatureVersion.V4;

// OSSClient インスタンスを作成します。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);

すべてのダウンロード例で使用される、応答ストリームをローカルファイルに書き込むヘルパーメソッド:

private static void WriteToFile(string filePath, Stream stream)
{
    using (var requestStream = stream)
    {
        using (var fs = File.Open(filePath, FileMode.OpenOrCreate))
        {
            IoUtils.WriteTo(stream, fs);
        }
    }
}

IMG パラメーターを使用したイメージの処理

IMG パラメーター文字列を GetObjectRequest に渡して、オブジェクトのダウンロード時に画像処理を適用します。処理されたイメージは応答で返され、ローカルに保存されます。OSS 内の元のオブジェクトは変更されません。

例 1: 単一の IMG パラメーターの適用

この例では、固定モードを使用してイメージのサイズを 100x100 ピクセルに変更し、結果をローカルに保存します。

namespace Samples
{
    public class Program
    {
        public static void Main(string[] args)
        {
            // 初期化コードについては、「クライアントのセットアップ」をご参照ください。

            try
            {
                // イメージのサイズを 100x100 ピクセルに変更します。
                var process = "image/resize,m_fixed,w_100,h_100";
                var ossObject = client.GetObject(new GetObjectRequest(bucketName, objectName, process));
                WriteToFile(localImageFilename, ossObject.Content);
            }
            catch (OssException ex)
            {
                Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
                    ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Failed with error info: {0}", ex.Message);
            }
        }
    }
}

例 2: 複数の IMG パラメーターのシーケンス適用

この例では、サイズ変更、クロップ、回転の 3 つの個別の操作を、それぞれ独自のリクエストで適用します。各結果は同じローカルパスに保存され、後の結果が以前の結果を上書きします。

namespace Samples
{
    public class Program
    {
        public static void Main(string[] args)
        {
            // 初期化コードについては、「クライアントのセットアップ」をご参照ください。
            // イメージがバケットに存在しない場合は、まずアップロードします。
            // client.PutObject(bucketName, objectName, localImageFilename);

            try
            {
                // イメージのサイズを 100x100 ピクセルに変更します。
                var process = "image/resize,m_fixed,w_100,h_100";
                var ossObject = client.GetObject(new GetObjectRequest(bucketName, objectName, process));
                WriteToFile(localImageFilename, ossObject.Content);

                // 座標 (100, 100) から始まる 100x100 の領域をクロップします。
                process = "image/crop,w_100,h_100,x_100,y_100";
                ossObject = client.GetObject(new GetObjectRequest(bucketName, objectName, process));
                WriteToFile(localImageFilename, ossObject.Content);

                // イメージを 90 度回転します。
                process = "image/rotate,90";
                ossObject = client.GetObject(new GetObjectRequest(bucketName, objectName, process));
                WriteToFile(localImageFilename, ossObject.Content);
            }
            catch (OssException ex)
            {
                Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
                    ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Failed with error info: {0}", ex.Message);
            }
        }
    }
}

例 3: 単一リクエストでの複数の IMG パラメーターの連結

パラメーターをスラッシュ (/) で区切ることで、複数の操作を 1 つのリクエストに連結します。この例では、1 回の呼び出しでイメージのサイズを 100x100 ピクセルに変更し、その後 90 度回転します。

namespace ImageProcessCascade
{
    class Program
    {
        static void Main(string[] args)
        {
            Program.ImageProcessCascade();
            Console.ReadKey();
        }

        public static void ImageProcessCascade()
        {
            // 初期化コードについては、「クライアントのセットアップ」をご参照ください。
            // イメージがバケットに存在しない場合は、まずアップロードします。
            // client.PutObject(bucketName, objectName, localImageFilename);

            try
            {
                // 100x100 ピクセルにサイズ変更し、その後 90 度回転します (1 回のリクエストで)。
                var process = "image/resize,m_fixed,w_100,h_100/rotate,90";
                var ossObject = client.GetObject(new GetObjectRequest(bucketName, objectName, process));
                WriteToFile(localImageFilename, ossObject.Content);
                Console.WriteLine("Get Object:{0} with process:{1} succeeded ", objectName, process);
            }
            catch (OssException ex)
            {
                Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
                    ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Failed with error info: {0}", ex.Message);
            }
        }
    }
}

イメージスタイルを使用したイメージの処理

イメージスタイルは複数の IMG パラメーターをカプセル化するため、単一の識別子で適用できます。コードで使用する前に、OSS コンソールでスタイルを作成してください。詳細については、「イメージスタイル」をご参照ください。

この例では、カスタムイメージスタイルをソースイメージに適用します。

namespace ImageProcessCustom
{
    class Program
    {
        static void Main(string[] args)
        {
            Program.ImageProcessCustomStyle();
            Console.ReadKey();
        }

        public static void ImageProcessCustomStyle()
        {
            // 初期化コードについては、「クライアントのセットアップ」をご参照ください。
            // イメージがバケットに存在しない場合は、まずアップロードします。
            // client.PutObject(bucketName, objectName, localImageFilename);

            try
            {
                // yourCustomStyleName を、OSS コンソールで作成したイメージスタイルの名前に置き換えます。
                var process = "style/yourCustomStyleName";
                var ossObject = client.GetObject(new GetObjectRequest(bucketName, objectName, process));
                WriteToFile(localImageFilename, ossObject.Content);
                Console.WriteLine("Get Object:{0} with process:{1} succeeded ", objectName, process);
            }
            catch (OssException ex)
            {
                Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
                    ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Failed with error info: {0}", ex.Message);
            }
        }
    }
}

IMG パラメーターを含む署名付き URL の生成

非公開オブジェクトへのアクセスには、署名付き URL が必要です。非公開オブジェクトに画像処理を適用するには、GeneratePresignedUriRequestProcess フィールドに IMG パラメーターを含めます。これにより、パラメーターが署名自体に埋め込まれます。

生成された後、IMG パラメーターを署名付き URL に直接追加しないでください。署名は完全なリクエストをカバーしており、署名後に URL を変更すると無効になります。

この例では、イメージのサイズを 100x100 ピクセルに変更する署名付き URL を生成します。URL は 1 時間後に有効期限切れになります。

using Aliyun.OSS;
using Aliyun.OSS.Common;

// バケットが配置されているリージョンのエンドポイント。
var endpoint = "yourEndpoint";

// 環境変数からアクセス認証情報を読み取ります。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");

var bucketName = "examplebucket";
var objectName = "exampledir/exampledir.jpg";

const string region = "cn-hangzhou";

var conf = new ClientConfiguration();
conf.SignatureVersion = SignatureVersion.V4;

var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);

try
{
    // IMG パラメーターは Process フィールドを介して署名に含まれるため、
    // URL 署名によってカバーされ、後で変更することはできません。
    var process = "image/resize,m_fixed,w_100,h_100";
    var req = new GeneratePresignedUriRequest(bucketName, objectName, SignHttpMethod.Get)
    {
        Expiration = DateTime.Now.AddHours(1),
        Process = process
    };

    // 署名付き URL を生成します。
    var uri = client.GeneratePresignedUri(req);
    Console.WriteLine("Generate Presigned Uri:{0} with process:{1} succeeded ", uri, process);
}
catch (OssException ex)
{
    Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
        ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
    Console.WriteLine("Failed with error info: {0}", ex.Message);
}

次のステップ