全部產品
Search
文件中心

Object Storage Service:.NET圖片處理

更新時間:Nov 26, 2024

圖片處理是OSS提供的海量、安全、低成本、高可靠的圖片處理服務。原始圖片上傳到OSS後,您可以通過簡單的RESTful介面,在任何時間、任何地點、任何互連網裝置上對圖片進行處理。

注意事項

  • 本文以華東1(杭州)外網Endpoint為例。如果您希望通過與OSS同地區的其他阿里雲產品訪問OSS,請使用內網Endpoint。關於OSS支援的Region與Endpoint的對應關係,請參見OSS地區和訪問網域名稱

  • 本文以OSS網域名稱建立OSSClient為例。如果您希望通過自訂網域名、STS等方式建立OSSClient,請參見初始化

使用圖片處理參數處理圖片

  • 使用單個圖片處理參數處理圖片並儲存為本地圖片

    using System;
    using System.IO;
    using Aliyun.OSS;
    using Aliyun.OSS.Common;
    using Aliyun.OSS.Util;
    
    namespace Samples
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                // yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
                var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
                // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 
                var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
                var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
                // 指定原圖所在的Bucket名稱,例如examplebucket。
                var bucketName = "examplebucket";
                // 指定原圖名稱。如果圖片不在Bucket根目錄,需攜帶圖片完整路徑,例如exampledir/example.jpg。
                var objectName = "exampledir/example.jpg";
                // 指定原圖所在的本地完整路徑。
                var localImageFilename = "D:\\localpath\\example.jpg";
                // 填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。
                const string region = "cn-hangzhou";
                
                // 建立ClientConfiguration執行個體,按照您的需要修改預設參數。
                var conf = new ClientConfiguration();
                
                // 設定v4簽名。
                conf.SignatureVersion = SignatureVersion.V4;
                
                // 建立OssClient執行個體。
                var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
                c.SetRegion(region);
                try
                {
                    // 將圖片縮放為固定寬高100 px。
                    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);
                }
            }
            private static void WriteToFile(string filePath, Stream stream)
            {
                using (var requestStream = stream)
                {
                    using (var fs = File.Open(filePath, FileMode.OpenOrCreate))
                    {
                        IoUtils.WriteTo(stream, fs);
                    }
                }
            }
        }
    }

  • 使用不同的圖片處理參數處理圖片並分別儲存為本地圖片

    using System;
    using System.IO;
    using Aliyun.OSS;
    using Aliyun.OSS.Common;
    using Aliyun.OSS.Util;
    namespace Samples
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                // yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
                var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
                // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 
                var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
                var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
                // 指定原圖所在的Bucket名稱,例如examplebucket。
                var bucketName = "examplebucket";
                // 指定原圖名稱。如果圖片不在Bucket根目錄,需攜帶圖片完整路徑,例如exampledir/example.jpg。
                var objectName = "exampledir/example.jpg";
                // 指定原圖所在的本地完整路徑。
                var localImageFilename = "D:\\localpath\\example.jpg";
                // 填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。
                const string region = "cn-hangzhou";
                
                // 建立ClientConfiguration執行個體,按照您的需要修改預設參數。
                var conf = new ClientConfiguration();
                
                // 設定v4簽名。
                conf.SignatureVersion = SignatureVersion.V4;
                
                // 建立OssClient執行個體。
                var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
                c.SetRegion(region);
                try
                {
                    // 若靶心圖表片不在目標Bucket內,需上傳圖片到目標Bucket。   
                    // client.PutObject(bucketName, objectName, localImageFilename);
                    // 將圖片縮放為固定寬高100 px。
                    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)開始,將圖片裁剪為寬高100 px。
                    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);
                }
            }
            private static void WriteToFile(string filePath, Stream stream)
            {
                using (var requestStream = stream)
                {
                    using (var fs = File.Open(filePath, FileMode.OpenOrCreate))
                    {
                        IoUtils.WriteTo(stream, fs);
                    }
                }
            }
        }
    }
  • 使用多個圖片處理參數處理圖片並儲存為本地圖片

    使用多個圖片處理參數處理圖片時,多個參數之間以正斜線(/)分隔。

    using System;
    using System.IO;
    using Aliyun.OSS;
    using Aliyun.OSS.Common;
    using Aliyun.OSS.Util;
    namespace ImageProcessCascade
    {
        class Program
        {
            static void Main(string[] args)
            {
                Program.ImageProcessCascade();
                Console.ReadKey();
            }
            public static void ImageProcessCascade()
            {
                // yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
                var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
                // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 
                var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
                var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
                // 指定原圖所在的Bucket名稱,例如examplebucket。
                var bucketName = "examplebucket";
                // 指定原圖名稱。如果圖片不在Bucket根目錄,需攜帶圖片完整路徑,例如exampledir/example.jpg。
                var objectName = "exampledir/example.jpg";
                // 指定原圖所在的本地完整路徑。
                var localImageFilename = "D:\\localpath\\example.jpg";
                // 填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。
                const string region = "cn-hangzhou";
                
                // 建立ClientConfiguration執行個體,按照您的需要修改預設參數。
                var conf = new ClientConfiguration();
                
                // 設定v4簽名。
                conf.SignatureVersion = SignatureVersion.V4;
                
                // 建立OssClient執行個體。
                var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
                c.SetRegion(region);
                try
                {
                    // 如果原圖不在目標Bucket內,需上傳該圖片到目標Bucket。   
                    // client.PutObject(bucketName, objectName, localImageFilename);
                    // 將圖片縮放為固定寬高100 px後,再旋轉90°。
                    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);
                }
            }
            private static void WriteToFile(string filePath, Stream stream)
            {
                using (var requestStream = stream)
                {
                    using (var fs = File.Open(filePath, FileMode.OpenOrCreate))
                    {
                        IoUtils.WriteTo(stream, fs);
                    }
                }
            }
        }
    }

使用圖片樣式處理圖片

您可以將多個圖片處理參數封裝在一個樣式中,之後使用樣式批量處理圖片。更多資訊,請參見圖片樣式。以下代碼展示了使用圖片樣式處理圖片:

using System;
using System.IO;
using Aliyun.OSS;
using Aliyun.OSS.Common;
using Aliyun.OSS.Util;
namespace ImageProcessCustom
{
    class Program
    {
        static void Main(string[] args)
        {
            Program.ImageProcessCustomStyle();
            Console.ReadKey();
        }
        public static void ImageProcessCustomStyle()
        {
            // yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
            var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
            // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 
            var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
            var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
            // 指定原圖所在的Bucket名稱,例如examplebucket。
            var bucketName = "examplebucket";
            // 指定原圖名稱。如果圖片不在Bucket根目錄,需攜帶圖片完整路徑,例如exampledir/example.jpg。
            var objectName = "exampledir/example.jpg";
            // 指定原圖所在的本地完整路徑。
            var localImageFilename = "D:\\localpath\\example.jpg";
            // 填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。
            const string region = "cn-hangzhou";
            
            // 建立ClientConfiguration執行個體,按照您的需要修改預設參數。
            var conf = new ClientConfiguration();
            
            // 設定v4簽名。
            conf.SignatureVersion = SignatureVersion.V4;
            
            // 建立OssClient執行個體。
            var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
            c.SetRegion(region);
            try
            {
                // 如果原圖不在目標Bucket內,需上傳該圖片到目標Bucket。   
                // client.PutObject(bucketName, objectName, localImageFilename);
                // 使用圖片樣式處理圖片。其中,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);
            }
        }
        private static void WriteToFile(string filePath, Stream stream)
        {
            using (var requestStream = stream)
            {
                using (var fs = File.Open(filePath, FileMode.OpenOrCreate))
                {
                    IoUtils.WriteTo(stream, fs);
                }
            }
        }
    }
}

產生帶圖片處理參數的檔案簽名URL

私人檔案的訪問URL帶有簽名。OSS不支援在帶簽名的URL後直接添加圖片處理參數。如果您想要對私人檔案進行圖片處理,需要將圖片處理參數加入到簽名中,相關的程式碼範例如下:

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

// yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID"); 
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// 指定圖片所在Bucket的名稱,例如examplebucket。
var bucketName = "examplebucket";
// 指定圖片名稱。如果圖片不在Bucket根目錄,需攜帶檔案完整路徑,例如exampledir/example.jpg。
var objectName = "exampledir/exampledir.jpg";
// 填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。
const string region = "cn-hangzhou";

// 建立ClientConfiguration執行個體,按照您的需要修改預設參數。
var conf = new ClientConfiguration();

// 設定v4簽名。
conf.SignatureVersion = SignatureVersion.V4;

// 建立OssClient執行個體。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
c.SetRegion(region);
try
{
    // 將圖片縮放為固定寬高100 px。
    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
    };
    // 產生帶有簽名的URI。
    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);
}

相關文檔

  • 關於圖片處理的完整範例程式碼,請參見GitHub樣本

  • 關於圖片處理支援的參數說明,請參見處理參數