.Net Core Image Manipulation (Crop & Resize)/Обработка файлов

Я провел последние 5 часов, пытаясь найти возможный способ выполнить то, что мне кажется довольно простой задачей, если это была предыдущая версия семейства .NET, с которой я работал:

  • Загрузка изображения
  • Изменение размера и обрезка изображения
  • Сохранение нового изображения в каталог

Я подошел к нескольким библиотекам, которые либо находятся в стадии предварительного освобождения, либо находятся в незавершенной стадии.

Кто-нибудь вообще выполнил вышеуказанные задачи, не включив в него пространство имен System.Drawing и/или добавляя зависимость для более ранней версии .NET framework?

ОБНОВЛЕНИЕ 08/08/2016

В итоге я использовал System.Drawing что-то очень раздражающее и разочаровывающее. Если вы разрабатываете программное обеспечение, используемое тысячами разработчиков, и если все эти разработчики полагаются на компоненты этого программного обеспечения, я считаю, что нельзя просто придумать новую версию, "сладкий разговор" об этом во время конференций, чтобы показать а не давать дерьмо о вашей работе и, с одной стороны, с гордостью высоко ценить ее, а с другой - отрывать наиболее используемые и востребованные ее части.

Я понимаю и высоко ценю с большим волнением - новой эры .net с основной картой - будучи лояльным asp dev с первых дней классического asp - однако для меня это просто незавершенный продукт, вызывающий больше разочарований и разочарования, чем удовольствия. Когда в сегодняшнем мире, основанном на контенте, есть миллионы веб-сайтов, полностью полагающихся на управление контентом, вы не можете просто придумать и сказать: "Эй, у меня есть эта блестящая, технологическая, более компактная, быстрая бла-бла", но errr, вы будете есть некоторые проблемы с "управлением" вашим контентом.

Не следует забывать, что, хотя MS (и мы) очень взволнованы этой новой базой данных, с открытым исходным кодом и т.д., существуют другие языки и фреймворки, которые делают то, что MS обещает сделать, в течение очень долгого времени.

Ответ 1

ImageSharp ImageSharp

ImageSharp - это новый, полнофункциональный, полностью управляемый, кроссплатформенный API для 2D-графики.

Разработанный для демократизации обработки изображений, ImageSharp предоставляет вам невероятно мощный, но в то же время красивый простой API.

По сравнению с System.Drawing мы смогли разработать что-то более гибкое, более простое для кодирования и гораздо менее подверженное утечкам памяти. Прошли общесистемные блокировки процессов; Изображения ImageSharp являются поточно-ориентированными и полностью поддерживаются в веб-средах.

Созданный в соответствии с .Net Standard 1.1 ImageSharp может использоваться в сценариях устройств, облачных сред и встраиваемых приложений /IoT.

Ответ 2

Вы можете использовать Microsoft ASP.NET Core JavaScript Services для вызова произвольных пакетов NPM во время выполнения из .NET-кода, что означает, что вы можете выбрать любой пакет npm, который предоставляет изображение масштабировать и вызывать его.

В следующем примере показано, как использовать JavaScriptServices для изменения размера изображения https://github.com/aspnet/JavaScriptServices/tree/dev/samples/misc/NodeServicesExamples

Надеюсь, что поможет

Ответ 3

.NET Core Image Processing в блоге (19 января 2017) сравнивает 6 библиотек:

  • CoreCompat.System.Drawing
  • ImageSharp
  • Magick.NET(только для Win)
  • SkiaSharp
  • FreeImage-DotNet-ядро
  • MagicScaler

26 февраля обновлено сообщение:, добавлено два новых пакета

Ответ 4

Чтобы завершить ответ @Hossam Barakat, вы можете использовать Microsoft ASP.NET Core JavaScript Services для вызова произвольных пакетов NPM во время выполнения из .NET, что означает, что вы можете выбрать любой пакет npm, который обеспечивает масштабирование изображения и вызывать его.
В примере используется модуль sharp, который имеет много зависимостей. Если вы предпочитаете, как и я, использовать jimp, который является чистым 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);
    });
};

установить jimp: npm install jimp --save

Ответ 5

Короткий ответ - нет, еще нет. Большинство, если не все текущие библиотеки, полагаются на System.Drawing. Если вам это нужно сейчас, я бы пошел по этому маршруту и ​​добавил System.Drawing.

В настоящее время команда .NET работает с функциями, отсутствующими в стеке Core 1.0, но этот уровень недостаточно высок в списке приоритетов: Ссылка

Это библиотека для просмотра, поскольку они очень близки к разворачиваемому API без System.Drawing.: ImageSharp