web-dev-qa-db-fra.com

Manipulation des images .Net Core (recadrage et redimensionnement) / Gestion des fichiers

J'ai passé les 5 dernières heures à essayer de trouver un moyen réalisable d'accomplir ce qui me semble une tâche assez facile s'il s'agissait d'une version précédente de la famille .NET avec laquelle je travaillais:

  1. Téléchargement d'une photo
  2. Redimensionner et recadrer l'image
  3. Enregistrement de la nouvelle image dans un répertoire

Je suis tombé sur deux bibliothèques qui sont soit en phase de pré-version soit en phase incomplète.

Quelqu'un a-t-il accompli les tâches ci-dessus sans inclure spécifiquement l'espace de noms System.Drawing et/ou ajouter une dépendance pour une version antérieure du framework .NET?

MISE À JOUR le 08/08/2016

J'ai fini par utiliser System.Drawing quelque chose de très ennuyeux et décevant. Si vous développez un logiciel utilisé par des milliers de développeurs, et si tous ces développeurs s'appuient sur les composants de ce logiciel, je crois, on ne peut pas juste proposer une nouvelle version, "sweet talk" à ce sujet lors des conférences pour montrer au lieu de donner une merde à propos de votre travail et, d'une part, en tenir fièrement en haute estime, et d'autre part, en retirer les parties les plus utilisées et les plus demandées.

Je comprends et apprécie moi-même avec une grande excitation - de la nouvelle ère de .net avec le framework de base - étant un développeur fidèle de l'asp depuis les premiers jours de l'asp classique - cependant, pour moi, c'est juste un produit incomplet causant plus de frustrations et déception plus que plaisir. Lorsqu'il y a des millions de sites Web dans le monde axé sur le contenu d'aujourd'hui, en s'appuyant entièrement sur la gestion de contenu, vous ne pouvez pas simplement dire: "Hé, j'ai cette technologie brillante, technologique, plus légère et plus rapide" mais errr, vous le ferez avoir des problèmes avec la "gestion" de votre contenu.

Il ne faut pas oublier que, bien que MS (et nous) soit très enthousiasmé par ce nouveau cadre de base, étant désormais open source, etc., il existe d'autres langages et cadres qui font ce que MS promet de faire, pour un très très longtemps maintenant.

16
Kemal Emin

ImageSharpImageSharp

ImageSharp est une nouvelle API graphique 2D multiplateforme, entièrement gérée et multiplateforme.

Conçu pour démocratiser le traitement d'image, ImageSharp vous offre une API incroyablement puissante mais d'une simplicité magnifique.

Par rapport à System.Drawing nous avons pu développer quelque chose de beaucoup plus flexible, plus facile à coder et beaucoup moins sujet aux fuites de mémoire. Fini les verrous de processus à l'échelle du système; Les images ImageSharp sont thread-safe et entièrement prises en charge dans les environnements Web.

Construit contre .Net Standard 1.1 ImageSharp peut être utilisé dans des scénarios de périphérique, de cloud et embarqués/IoT.

13
Soren

Vous pouvez utiliser Microsoft ASP.NET Core JavaScript Services pour appeler des packages NPM arbitraires au moment de l'exécution à partir du code .NET, ce qui signifie que vous pouvez choisir n'importe quel package npm qui fournit une mise à l'échelle de l'image et l'invoquer.

L'exemple suivant montre comment utiliser JavaScriptServices pour redimensionner l'image https://github.com/aspnet/JavaScriptServices/tree/dev/samples/misc/NodeServicesExamples

J'espère que cela pourra aider

6
Hossam Barakat

Pour compléter la réponse @Hossam Barakat, vous pouvez utiliser Microsoft ASP.NET Core JavaScript Services pour appeler des packages NPM arbitraires au moment de l'exécution à partir du code .NET, ce qui signifie que vous pouvez choisir n'importe quel package npm qui fournit une mise à l'échelle de l'image et l'invoquer.
L'exemple utilise le module sharp , qui a beaucoup de dépendances. Si vous préférez, comme moi, utiliser jimp qui est du pur javascript:

Startup.cs

public class Startup
{
 ...
    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        // Enable Node Services
        services.AddNodeServices();
...
    }
...
}

ImageController.cs

using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.NodeServices;
using Microsoft.AspNetCore.StaticFiles;
using System.Security.Cryptography;
using System.Text;

namespace NodeServicesExamples.Controllers
{
    public class ResizeImageController : Controller
    {
        private const int MaxDimension = 1000;
        private static string[] AllowedMimeTypes = new[] { "image/jpeg", "image/png", "image/gif" };

        private IHostingEnvironment _environment;
        private INodeServices _nodeServices;

        public ResizeImageController(IHostingEnvironment environment, INodeServices nodeServices)
        {
            _environment = environment;
            _nodeServices = nodeServices;
        }

        [Route("resize/{*imagePath}")]
        [ResponseCache(Duration = 3600)]
        public async Task<IActionResult> Index(string imagePath, double maxWidth, double maxHeight)
        {
            // Validate incoming params
            if (maxWidth < 0 || maxHeight < 0 || maxWidth > MaxDimension || maxHeight > MaxDimension
                || (maxWidth + maxHeight) == 0)
            {
                return BadRequest("Invalid dimensions");
            }

            var mimeType = GetContentType(imagePath);
            if (Array.IndexOf(AllowedMimeTypes, mimeType) < 0)
            {
                return BadRequest("Disallowed image format");
            }

            // Locate source image on disk
            var fileInfo = _environment.WebRootFileProvider.GetFileInfo(imagePath);
            if (!fileInfo.Exists)
            {
                return NotFound();
            }

            var eTag = GenerateETag(Encoding.UTF8.GetBytes($"{fileInfo.LastModified.ToString("s")}-{fileInfo.Length}"));
            HttpContext.Response.Headers["ETag"] = eTag;

            var match = HttpContext.Request.Headers["If-None-Match"].FirstOrDefault();
            if (eTag == match)
            {
                return StatusCode(304);
            }

            // Invoke Node and pipe the result to the response
            var imageStream = await _nodeServices.InvokeAsync<Stream>(
                "./Node/resizeImage",
                fileInfo.PhysicalPath,
                mimeType,
                maxWidth,
                maxHeight);

            return File(imageStream, mimeType, fileInfo.Name);
        }

        private string GetContentType(string path)
        {
            string result;
            return new FileExtensionContentTypeProvider().TryGetContentType(path, out result) ? result : null;
        }

        private string GenerateETag(byte[] data)
        {
            string ret = string.Empty;

            using (var md5 = MD5.Create())
            {
                var hash = md5.ComputeHash(data);
                string hex = BitConverter.ToString(hash);
                ret = hex.Replace("-", "");
            }

            return ret;
        }

    }
}

Node\resizeImage.js

var jimp = require("jimp");

module.exports = function (result, physicalPath, mimeType, maxWidth, maxHeight) {
    // Invoke the 'jimp' NPM module, and have it pipe the resulting image data back to .NET
    jimp.read(physicalPath).then(function (file) {
        var width = maxWidth || jimp.AUTO;
        var height = maxHeight || jimp.AUTO;
        file.resize(maxWidth, height)
             .getBuffer(mimeType, function (err, buffer) {
                 var stream = result.stream;
                 stream.write(buffer);
                 stream.end();
             });
    }).catch(function (err) {
        console.error(err);
    });
};

installez jimp: npm install jimp --save

3
agua from mars

. NET Core Image Processing article de blog (19 janvier 2017) compare 6 bibliothèques:

  • CoreCompat.System.Drawing
  • ImageSharp
  • Magick.NET (Win uniquement)
  • SkiaSharp
  • FreeImage-dotnet-core
  • MagicScaler

Mise à jour du 26 février: le post a été mis à jour, deux nouveaux packages ont été ajoutés

3
Dmitry

La réponse courte est non, pas encore. La plupart des bibliothèques actuelles, sinon toutes, reposent sur System.Drawing. Si vous en avez besoin maintenant, j'irais dans cette voie et ajouterais System.Drawing.

L'équipe .NET travaille actuellement sur les fonctionnalités qui manquent dans la pile Core 1.0, mais celle-ci n'est pas assez élevée dans leur liste de priorités: Link

Il s'agit d'une bibliothèque à regarder car ils se rapprochent très près d'une API libérable sans System.Drawing. : ImageSharp

2
Ashley Lee

utilisez SkiSharp, il figure également sur la documentation officielle de Microsoft: https://docs.Microsoft.com/en-us/dotnet/api/skiasharp?view=skiasharp-1.68.

0
juFo