ASP .NET ASP.NET Çekirdeğinde System.Drawing

ASP.NET hizmetlerinde System.Drawing kitaplığının kullanımına ayrılmış pek çok soru var. En yaygın yanıt, Microsoft’un ASP.NET hizmetlerinde System.Drawing kullanımını önermediği şeklindedir.

Bu yazıda, Aspose.Drawing for .NET ile ASP.NET servislerinde System.Drawing kütüphanesinin arayüzünü kullanma hakkında detayları öğreneceksiniz. Aşağıdaki bölümler ilgili tüm bilgileri yapılandırır:

Neden Aspose.Drawing?

Microsoft, System.Drawing kitaplığının ASP.NET hizmetlerinde kullanılmasını önermez. System.Drawing belgeleme ana sayfası şöyledir:

System.Drawing ad alanındaki sınıfların bir Windows veya ASP.NET hizmetinde kullanılması desteklenmez. Bu sınıfları, bu uygulama türlerinden birinin içinden kullanmaya çalışmak, çalışma zamanı istisnalarına ve hizmet performansının düşmesine neden olabilir.

Microsoft’u yukarıda dikkatli yazmaya zorlayan iki temel sorun vardır. İlk sorun, GDI+ yerel kitaplığının kullanılması ve sonuç olarak GDI tutamaçlarının kullanılmasıdır. İkinci endişe ise eşzamanlılık sorunlarıdır. Örneğin, herhangi bir DrawImage() işlemi sırasında işlem çapında bir kilit oluşur. Bu nedenle, Microsoft’un System.Drawing kitaplığını kullanarak hızlı ve ölçeklenebilir ASP.NET hizmetleri oluşturamazsınız.

Aspose.Drawing for .NET API’yi Kurma

DLL dosyasını İndirilenler bölümünden kolayca indirebilir veya aşağıdaki komutla NuGet paket Yöneticisi aracılığıyla yapılandırabilirsiniz:

PM> Install-Package Aspose.Drawing

Aspose.Drawing for .NET API - Giriş

Görüntü işleme özellikleri nedeniyle System.Drawing’in geliştiriciler arasında çok popüler olduğunu anlıyoruz. Bu nedenle herhangi bir uyumluluk sorunu olmayan benzer ve uyumlu bir API oluşturduk. Rahatlığınız ve uyarlanabilirliğiniz için API aynı sınıf, işlev, numaralandırma ve arabirim adlarını içerir. Proje referansını System.Drawing’ten Aspose.Drawing’e kolayca değiştirebilir ve programı yeniden derleyebilirsiniz.

Ayrıca Aspose.Drawing, NET Framework 2.0 ve NET Core 2.0 için kullanılabilen yönetilen bir kitaplıktır. System.Drawing’in aksine, Linux, Azure vb. herhangi bir platforma bağımlılığı yoktur.

Aspose.Drawing’i ASP.NET Servislerinde Kullanmak

Aspose.Drawing uygulaması, GDI veya GDI+‘ya bağlı değildir. GDI tutamaçlarını kullanmaz ve nadiren süreç çapında kilitler kullanır.

Aspose.Drawing’in ASP.NET Servislerinde kullanımına yönelik tanıtım

Aspose.Drawing kütüphanesini kullanmanın faydalarını açıklayan basit bir uygulama oluşturalım:

Tamamen yeni bir web hizmeti veya uygulaması oluşturmaya karar verdiğinizi hayal edin. Uygulama, kullanıcının görüntüsünden filtrelerin eklendiği bir dizi küçük resim oluşturacaktır.

Birkaç yeni varlık tanıtarak başlayabilirsiniz:

///<summary>
/// Kullanılabilir filtre türleri.
///</summary>
public enum FilterType
{
    ///<summary>
    /// Kırmızı renkle doymuş görüntü oluşturmak için filtre.
    ///</summary>
    Red,

    ///<summary>
    /// Yeşil renkle doymuş görüntü oluşturmak için filtre.
    ///</summary>
    Green,

    ///<summary>
    /// Mavi renkle doymuş görüntü oluşturmak için filtre.
    ///</summary>
    Blue,

    ///<summary>
    /// Gri tonlamalı bir görüntünün oluşturulması için filtre.
    ///</summary>
    Grayscale,

    ///<summary>
    /// Negatif bir görüntünün oluşturulması için filtre.
    ///</summary>
    Negative,

    ///<summary>
    /// Sepya görüntüsünün oluşturulması için filtre.
    ///</summary>
    Sepia,
}
///<summary>
/// Filtrelenmiş küçük resim oluşturmanın sonucu.
///</summary>
public class FilterThumbnailResult
{
    ///<summary>
    /// FilterThumbnailResult sınıfının yeni bir örneğini başlatır.
    ///</summary>
    ///<param name="filterType"> Küçük resme uygulanan filtre türü.</param>
    ///<param name="pngData"> PNG formatındaki görüntü verileri.</param>
    ///<param name="width"> Küçük resmin genişliği.</param>
    ///<param name="height"> Küçük resmin yüksekliği.</param>
    public FilterThumbnailResult(FilterType filterType, byte[] pngData, int width, int height)
    {
        this.FilterType = filterType;
        this.PngData = pngData;
        this.Width = width;
        this.Height = height;
    }

    ///<summary>
    /// Küçük resme uygulanan filtre türünü alır.
    ///</summary>
    public FilterType FilterType { get; }

    ///<summary>
    /// Görüntü verilerini PNG formatında alır.
    ///</summary>
    public byte[] PngData { get; }

    ///<summary>
    /// Küçük resmin genişliğini alır.
    ///</summary>
    public int Width { get; }

    ///<summary>
    /// Küçük resmin yüksekliğini alır.
    ///</summary>
    public int Height { get; }
}

Artık küçük resimlerin oluşturulması için arabirimi ekli filtrelerle tanımlayabilirsiniz:

using System.Collections.Generic;

///<summary>
/// Küçük resim oluşturma arabirimi.
///</summary>
public interface IThumbnailGenerator
{
    ///<summary>
    /// Mevcut tüm filtreler için bir dizi küçük resim oluşturur.
    ///</summary>
    ///<param name="sourceImage"> Kaynak görüntünün baytları.</param>
    ///<param name="width"> Önizleme görüntülerinin istenen genişliği.</param>
    ///<param name="height"> Önizleme görüntülerinin istenen yüksekliği.</param>
    ///<returns> Bir dizi küçük resim.</returns>
    IEnumerable<FilterThumbnailResult> GenerateAllThumbnails(byte[] sourceImage, int width, int height);
}

Uygulamaya geçerek, System.Drawing kitaplığını kullanarak IThumbnailGenerator arabirimini uyguladığınızı varsayalım. Bir sonraki kod parçacığı gibi görünecek:

///<summary>
/// IThumbnailGenerator arayüzü uygulaması System.Drawing kullanılarak.
///</summary>
public class ThumbnailGenerator
    : IThumbnailGenerator
{
    ///<summary>
    /// Bir dizi küçük resim işlemcisi.
    ///</summary>
    private static readonly FilterThumbnailProcessor[] Processors = new FilterThumbnailProcessor[] 
    {
        ApplyRedFilter,
        ApplyGreenFilter,
        ApplyBlueFilter,
        ApplyGrayFilter,
        ApplyNegativeFilter,
        ApplySepiaFilter,
    };

    ///<summary>
    /// Küçük resim işleme için yetki verin.
    ///</summary>
    ///<param name="thumbnail"> Orijinal görüntünün küçük resmi.</param>
    ///<returns> Filtrelenmiş küçük resim oluşturmanın sonucu.</returns>
    private delegate FilterThumbnailResult FilterThumbnailProcessor(Bitmap thumbnail);

    ///<summary>
    /// Mevcut tüm filtreler için bir dizi küçük resim oluşturur.
    ///</summary>
    ///<param name="sourceImage"> Kaynak görüntünün baytları.</param>
    ///<param name="width"> Önizleme görüntülerinin istenen genişliği.</param>
    ///<param name="height"> Önizleme görüntülerinin istenen yüksekliği.</param>
    ///<returns> Bir dizi küçük resim.</returns>
    public IEnumerable<FilterThumbnailResult> GenerateAllThumbnails(byte[] sourceImage, int width, int height)
    {
        using (MemoryStream ms = new MemoryStream(sourceImage))
        using (Bitmap bitmap = new Bitmap(ms))
        {
            foreach (var processor in Processors)
            {
                using (Bitmap previewBitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb))
                using (Graphics graphics = Graphics.FromImage(previewBitmap))
                {
                    graphics.DrawImage(bitmap, 0, 0, width, height);

                    yield return processor(previewBitmap);
                }
            }
        }
    }

    ///<summary>
    /// Küçük resme kırmızı bir filtre uygular.
    ///</summary>
    ///<param name="thumbnail"> Orijinal görüntünün küçük resmi.</param>
    ///<returns> Filtrelenmiş küçük resim oluşturmanın sonucu.</returns>
    private static FilterThumbnailResult ApplyRedFilter(Bitmap thumbnail)
    {
    ...
    }

    ///<summary>
    /// Küçük resme yeşil bir filtre uygular.
    ///</summary>
    ///<param name="thumbnail"> Orijinal görüntünün küçük resmi.</param>
    ///<returns> Filtrelenmiş küçük resim oluşturmanın sonucu.</returns>
    private static FilterThumbnailResult ApplyGreenFilter(Bitmap thumbnail)
    {
    ...
    }

    ///<summary>
    /// Küçük resme mavi bir filtre uygular.
    ///</summary>
    ///<param name="thumbnail"> Orijinal görüntünün küçük resmi.</param>
    ///<returns> Filtrelenmiş küçük resim oluşturmanın sonucu.</returns>
    private static FilterThumbnailResult ApplyBlueFilter(Bitmap thumbnail)
    {
    ...
    }

    ///<summary>
    /// Küçük resme gri bir filtre uygular.
    ///</summary>
    ///<param name="thumbnail"> Orijinal görüntünün küçük resmi.</param>
    ///<returns> Filtrelenmiş küçük resim oluşturmanın sonucu.</returns>
    private static FilterThumbnailResult ApplyGrayFilter(Bitmap thumbnail)
    {
    ...
    }

    ///<summary>
    /// Küçük resme negatif bir filtre uygular.
    ///</summary>
    ///<param name="thumbnail"> Orijinal görüntünün küçük resmi.</param>
    ///<returns> Filtrelenmiş küçük resim oluşturmanın sonucu.</returns>
    private static FilterThumbnailResult ApplyNegativeFilter(Bitmap thumbnail)
    {
    ...
    }

    ///<summary>
    /// Küçük resme sepya filtresi uygular.
    ///</summary>
    ///<param name="thumbnail"> Orijinal görüntünün küçük resmi.</param>
    ///<returns> Filtrelenmiş küçük resim oluşturmanın sonucu.</returns>
    private static FilterThumbnailResult ApplySepiaFilter(Bitmap thumbnail)
    {
    ...
    }
}

Kod iyi çalışacaktır ancak bir dezavantajı vardır - tüm küçük resimleri sırayla oluşturur. System.Drawing kitaplığı, birden fazla CPU çekirdeği olduğunda kaynakları boşa harcayabilmesi için tek iş parçacığı kitaplığı olarak tasarlanmış oldukça eski GDI+ kitaplığına dayanmaktadır.

Aspose.Drawing’i kullanmak, tek iş parçacığıyla ilgili herhangi bir sınırlaması olmadığı için performansı önemli ölçüde iyileştirmeye yardımcı olabilir. Lütfen yalnızca bir işlevi değiştirmeyi deneyin:

///<summary>
/// Mevcut tüm filtreler için bir dizi küçük resim oluşturur.
///</summary>
///<param name="sourceImage"> Kaynak görüntünün baytları.</param>
///<param name="width"> Önizleme görüntülerinin istenen genişliği.</param>
///<param name="height"> Önizleme görüntülerinin istenen yüksekliği.</param>
///<returns> Bir dizi küçük resim.</returns>
public IEnumerable<FilterThumbnailResult> GenerateAllThumbnails(byte[] sourceImage, int width, int height)
{
    using (MemoryStream ms = new MemoryStream(sourceImage))
    using (Bitmap bitmap = new Bitmap(ms))
    {
        ConcurrentBag<FilterThumbnailResult> collection = new ConcurrentBag<FilterThumbnailResult>();

        Parallel.ForEach(Processors, (processor) =>
        {
            using (Bitmap previewBitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb))
            using (Graphics graphics = Graphics.FromImage(previewBitmap))
            {
                graphics.DrawImage(bitmap, 0, 0, width, height);
                collection.Add(processor(previewBitmap));
            }
        });

        return collection;
    }
}

Bu kod artık orijinal kaynak kodunda herhangi bir önemli değişiklik olmaksızın birden fazla CPU çekirdeği kullanabilir. System.Drawing’i Aspose.Drawing ile değiştirmek, uygulamalarınızın ve hizmetlerinizin performansını hızlandırır.

Kaynak Kodunu İndir

Referans olması için bu örnekle ilgili Kaynak Kodu’nı indirebilirsiniz.

Ücretsiz API Değerlendirme Lisansı

API’yi tam kapasitesiyle test etmek için bir Ücretsiz Geçici Lisans talep edebilirsiniz.

Çözüm

Sonuç olarak Aspose.Drawing kütüphanesini ASP.NET ve ASP.NET Core servislerinizde kullanmanın ne kadar basit olduğunu örnekle öğrenmiş oldunuz. Ayrıca Aspose.Drawing’in System.Drawing’de var olan sorunları veya dış bağımlılıkları yoktur. Ayrıca, Belgeleri inceleyerek API’yi ayrıntılı olarak keşfedebilirsiniz. Lütfen herhangi bir sorunuz için Ücretsiz Destek Forumu aracılığıyla istediğiniz zaman bizimle iletişime geçmekten çekinmeyin!

Ayrıca bakınız