c# Alternative a System.Drawing per l'utilizzo con ASP.NET?





3 Answers

Sì, usa le classi WPF System.Windows.Media . Essendo completamente gestiti non subiscono gli stessi problemi del materiale GDI.

Ecco un estratto da un codice MVC che utilizzo per il rendering dei gradienti, per darti un'idea di come ottenere da un Visual FoxPro in PNG:

using System;
using System.IO;
using System.Web.Mvc;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace MyMvcWebApp.Controllers
{
    public class ImageGenController : Controller
    {
        // GET: ~/ImageGen/Gradient?color1=red&color2=pink
        [OutputCache(CacheProfile = "Image")]
        public ActionResult Gradient(Color color1, Color color2, int width = 1, int height = 30, double angle = 90)
        {
            var visual = new DrawingVisual();
            using (DrawingContext dc = visual.RenderOpen())
            {
                Brush brush = new LinearGradientBrush(color1, color2, angle);
                dc.DrawRectangle(brush, null, new Rect(0, 0, width, height));
            }

            return new FileStreamResult(renderPng(visual, width, height), "image/png");
        }

        static Stream renderPng(Visual visual, int width, int height)
        {
            var rtb = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Default);
            rtb.Render(visual);

            var frame = BitmapFrame.Create(rtb);
            var encoder = new PngBitmapEncoder();
            encoder.Frames.Add(frame);

            var stream = new MemoryStream();
            encoder.Save(stream);
            stream.Position = 0;

            return stream;
        }
    }
}
c# asp.net gdi+ system.drawing system.drawing.imaging

Dopo diversi giorni di rintracciare gli errori bizzarri di GDI +, mi sono imbattuto in questo piccolo gioiello su MSDN :

Le classi all'interno dello spazio dei nomi System.Drawing non sono supportate per l'uso all'interno di un servizio Windows o ASP.NET. Il tentativo di utilizzare queste classi all'interno di uno di questi tipi di applicazioni può causare problemi imprevisti, ad esempio la riduzione delle prestazioni del servizio e le eccezioni di run-time.

Non so se "servizio ASP.NET" significa "applicazione web" in questo contesto, ma "prestazioni di servizio ridotte" sembrano certamente coprire l'assortimento casuale di errori "Errore generico verificatosi in GDI +" e "Memoria insufficiente" che la mia app sta lanciando - errori intermittenti e non riproducibili che leggono e scrivono immagini JPEG che in molti casi sono state effettivamente create da System.Drawing.Imaging in primo luogo.

Quindi, se GDI + non è in grado di leggere e scrivere file JPEG in modo affidabile in un'app Web, cosa dovrei usare invece?

Voglio che gli utenti siano in grado di caricare immagini (necessario JPEG, altri formati piacevoli), ricampionarli in modo affidabile e visualizzare utili messaggi di errore se qualcosa va storto. Qualche idea? Vale la pena considerare gli spazi dei nomi System.Media di WPF?

Grazie,

Dylan

EDIT: Sì, so che GDI + funziona "il più delle volte". Non è abbastanza buono, perché quando fallisce, lo fa in un modo che è impossibile isolare o recuperare con garbo. Non sono interessato ad esempi di codice GDI + che funzionano per te: sto cercando librerie alternative da utilizzare per l'elaborazione delle immagini.




ImageSharp

ImageSharp è una libreria grafica 2D multipiattaforma open source. È scritto in C # in cima al nuovo standard .NET, senza alcuna dipendenza da API specifiche del sistema operativo.

Al momento è ancora in pre-release su MyGet (dovrai aggiungere la fonte del pacchetto nelle opzioni VS o in un file NuGet.config), ma lo stiamo già utilizzando con risultati molto positivi.









Related