Add image resizing example. Currently used base64 encoded data transfer and the 'jimp' module, neither of which are fast. Will replace these shortly.

This commit is contained in:
SteveSandersonMS
2016-06-07 15:55:06 +01:00
parent 8dbd143857
commit 3e82d94f1c
7 changed files with 110 additions and 1 deletions

View File

@@ -15,6 +15,11 @@ namespace NodeServicesExamples.Controllers
return View(); return View();
} }
public IActionResult ImageResizing()
{
return View();
}
public IActionResult Error() public IActionResult Error()
{ {
return View("~/Views/Shared/Error.cshtml"); return View("~/Views/Shared/Error.cshtml");

View File

@@ -0,0 +1,61 @@
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.NodeServices;
using Microsoft.AspNetCore.StaticFiles;
namespace NodeServicesExamples.Controllers
{
public class ResizeImageController : Controller
{
private const int MaxDimension = 1000;
private IHostingEnvironment _environment;
private INodeServices _nodeServices;
public ResizeImageController(IHostingEnvironment environment, INodeServices nodeServices)
{
_environment = environment;
_nodeServices = nodeServices;
}
[Route("resize/{*imagePath}")]
public async Task<IActionResult> Index(string imagePath, int maxWidth, int maxHeight)
{
// Validate incoming params
if (maxWidth > MaxDimension || maxHeight > MaxDimension || (maxHeight <= 0 && maxWidth <= 0))
{
return BadRequest("Invalid dimensions");
}
// Locate source image on disk
var fileInfo = _environment.WebRootFileProvider.GetFileInfo(imagePath);
if (!fileInfo.Exists)
{
return NotFound();
}
// Invoke Node and convert the base64 result back to bytes
var mimeType = GetContentType(imagePath);
var resizedImage = await _nodeServices.Invoke<ResizeImageResult>("./Node/resizeImage", fileInfo.PhysicalPath, mimeType, maxWidth, maxHeight);
return File(Convert.FromBase64String(resizedImage.Base64), mimeType);
}
private string GetContentType(string path)
{
string result;
if (!new FileExtensionContentTypeProvider().TryGetContentType(path, out result))
{
result = "application/octet-stream";
}
return result;
}
private class ResizeImageResult
{
public string Base64 { get; set; }
}
}
}

View File

@@ -0,0 +1,15 @@
var Jimp = require('jimp');
module.exports = function(cb, physicalPath, mimeType, maxWidth, maxHeight) {
Jimp.read(physicalPath, function (err, loadedImage) {
if (err) {
cb(err);
}
loadedImage
.contain(maxWidth > 0 ? maxWidth : Jimp.AUTO, maxHeight > 0 ? maxHeight : Jimp.AUTO)
.getBuffer(mimeType, function(err, buffer) {
cb(err, { base64: buffer && buffer.toString('base64') });
});
});
}

View File

@@ -0,0 +1,26 @@
<h1>Image Resizing</h1>
<p>
This sample shows how the NPM module <a href="https://www.npmjs.com/package/jimp"><code>jimp</code></a>
can be used for dynamic image resizing from within an ASP.NET Core application. There is one copy of the
following image on disk, but we can set up an MVC action method that returns it resized to fit within an
arbitrary width and height.
</p>
<p>
<em><a href="https://www.flickr.com/photos/dcoetzee/3572948635">Parrot</a>
by <a href="https://www.flickr.com/photos/dcoetzee/">D Coetzee</a>
is dedicated to the <a href="http://creativecommons.org/publicdomain/zero/1.0/">public domain (CC0)</a></em>
</p>
<h3>100px wide [<a href="/resize/images/parrot.jpg?maxWidth=100">open</a>]</h3>
<img src="/resize/images/parrot.jpg?maxWidth=100" />
<h3>200px wide [<a href="/resize/images/parrot.jpg?maxWidth=200">open</a>]</h3>
<img src="/resize/images/parrot.jpg?maxWidth=200" />
<h3>400px wide [<a href="/resize/images/parrot.jpg?maxWidth=400">open</a>]</h3>
<img src="/resize/images/parrot.jpg?maxWidth=400" />
<h3>800px wide [<a href="/resize/images/parrot.jpg?maxWidth=800">open</a>]</h3>
<img src="/resize/images/parrot.jpg?maxWidth=800" />

View File

@@ -8,5 +8,6 @@
<ul> <ul>
<li><a asp-action="ES2015Transpilation">ES2015 transpilation</a> <li><a asp-action="ES2015Transpilation">ES2015 transpilation</a>
<li><a asp-action="ImageResizing">Image resizing</a>
</li> </li>

View File

@@ -3,6 +3,7 @@
"version": "0.0.0", "version": "0.0.0",
"dependencies": { "dependencies": {
"babel-core": "^6.7.4", "babel-core": "^6.7.4",
"babel-preset-es2015": "^6.6.0" "babel-preset-es2015": "^6.6.0",
"jimp": "^0.2.24"
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB