私が作業していた以前のバージョンの.NETファミリであった場合、私にとって非常に簡単なタスクを達成するための実行可能な方法を見つけるために、過去5時間を費やしました。
プレリリース段階または未完成段階のいくつかのライブラリに出くわしました。
System.Drawing名前空間を具体的に含めたり、以前のバージョンの.NETフレームワークの依存関係を追加したりすることなく、だれかが上記のタスクを達成しましたか?
最終的にSystem.Drawingを使用して、非常に迷惑でがっかりさせました。数千人の開発者が使用するソフトウェアを開発していて、これらすべての開発者がこのソフトウェアのコンポーネントに依存している場合、会議中にそれについて「甘い話」という新しいバージョンを思い付くことができないと思いますあなたの仕事についてたわごとを言うのではなく、人前で話すスキルを失い、一方ではそれを高く評価し、他方では、ほとんど使用され要求されている部分を取り除きます。
コアフレームワークを備えた.netの新時代-古典的なASPの最初の頃から忠実なASP開発者である私は、自分自身を大いに興奮させて理解し、感謝しています。喜びよりも失望。今日のコンテンツ駆動型の世界に何百万ものウェブサイトがあり、コンテンツ管理に完全に依存している場合、「ねえ、私はこの素晴らしい、技術、無駄のない、速いブラーを持っています」と言うことはできません。コンテンツの「管理」に問題があります。
MS(および私たち)はこの新しいコアフレームワークに非常に興奮していますが、現在はオープンソースなどであるため、MSが約束していることを実行している他の言語とフレームワークがあります。今はとても長い時間です。
画像処理を民主化するように設計されたImageSharpは、非常に強力でありながら美しくシンプルなAPIを提供します。
に比べ System.Drawing
はるかに柔軟性があり、コーディングが容易で、メモリリークがはるかに少ないものを開発できました。システム全体のプロセスロックはなくなりました。 ImageSharpイメージはスレッドセーフであり、Web環境で完全にサポートされています。
.Net Standard 1.1に対して構築されたImageSharpは、デバイス、クラウド、および組み込み/ IoTシナリオで使用できます。
Microsoft ASP.NET Core JavaScript Services を使用して、.NETコードから実行時に任意のNPMパッケージを呼び出すことができます。つまり、画像スケーリングを提供するnpmパッケージを選択して呼び出すことができます。
次の例は、JavaScriptServicesを使用して画像のサイズを変更する方法を示しています https://github.com/aspnet/JavaScriptServices/tree/dev/samples/misc/NodeServicesExamples
助けてくれることを願って
@Hossam Barakatの回答を完了するには、 Microsoft ASP.NET Core JavaScript Services を使用して.NETコードから実行時に任意のNPMパッケージを呼び出すことができます。これは、イメージのスケーリングを提供するnpmパッケージを選択できることを意味します。それを呼び出します。
サンプルでは sharp モジュールを使用していますが、これには多くの依存関係があります。私のように、純粋なjavascriptである jimp を使用したい場合:
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();
...
}
...
}
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;
}
}
}
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
。NET Core Image Processing ブログ投稿(2017年1月19日)は6つのライブラリを比較しています:
Feb 26 update:投稿が更新され、2つの新しいパッケージが追加されました
簡単な答えはまだありません。すべてではないにしても、ほとんどのライブラリはSystem.Drawingに依存しています。これが必要な場合は、そのルートに行き、System.Drawingを追加します。
.NETチームは現在、Core 1.0スタックにない機能を使用して作業していますが、これは優先順位リストで十分ではありません: Link
これは、System.Drawingなしでリリース可能なAPIに非常に近づいているため、監視するライブラリです。 : ImageSharp
skiSharpを使用すると、Microsoftの公式ドキュメントにも記載されています。 https://docs.Microsoft.com/en-us/dotnet/api/skiasharp?view=skiasharp-1.68.