Loading...
Loading...
Implement the Syncfusion ASP.NET Core Image Editor (EJ2) component. Use this when adding image editing to an ASP.NET Core application, including cropping, rotating, annotations, fine-tuning (brightness, contrast, blur), and filter application. Covers opening/saving images, toolbar customization, redaction, resizing, and image editor event handling with ejs-imageeditor.
npx skill4agent add syncfusion/aspnetcore-ui-components-skills syncfusion-aspnetcore-image-editor_ViewImports.cshtml<ejs-imageeditor>open()imageSettingsexport()getImageData()clearImage()reset()FileOpenedSavingBeforeSaverotate()flip()straightenImage()zoom()ZoomSettingsminZoomFactormaxZoomFactorRotatingFlippingZoomingPanningselect()crop()preventScalingSelectionChangingdrawText()\ndrawRectangle()drawEllipse()drawLine()drawArrow()drawPath()drawImage()freehandDraw()deleteShape()getShapeSetting()FontFamilyShapeChangingShapeChangefinetuneImage()FinetuneSettingsapplyImageFilter()FinetuneValueChangingImageFilteringresize()ResizingdrawRedact()selectRedact()deleteRedact()updateRedact()getRedacts()ToolbarToolbarTemplateToolbarUpdatingShowQuickAccessToolbarQuickAccessToolbarOpenToolbarCreatedToolbarItemClickeddrawFrame()UploadSettingsLocaleundo()redo()AllowUndoRedoAllowUndoRedoCssClassDisabledHeightWidthThemeLocaleZoomSettingsFinetuneSettingsSelectionSettingsUploadSettingsFontFamilyInstall-Package Syncfusion.EJ2.AspNet.Core~/Pages/_ViewImports.cshtml@addTagHelper *, Syncfusion.EJ2~/Pages/Shared/_Layout.cshtml<head>
<!-- CSS hosted locally in wwwroot/lib/ej2/ -->
<link rel="stylesheet" href="/lib/ej2/fluent2.css" />
</head>
<body>
...
<!-- JavaScript hosted locally in wwwroot/lib/ej2/ -->
<!-- IMPORTANT: Do NOT load from external CDN — use local assets only -->
<script src="/lib/ej2/ej2.min.js"></script>
<ejs-scripts></ejs-scripts>
</body>⚠️ Security Policy: External CDN loading is not permitted. All Syncfusion runtime assets must be hosted locally in your application.
~/Pages/Index.cshtml<div class="e-img-editor-sample">
<ejs-imageeditor id="image-editor"></ejs-imageeditor>
</div>
<style>
.e-img-editor-sample {
height: 80vh;
width: 100%;
}
</style><ejs-imageeditor id="image-editor" created="onCreated"></ejs-imageeditor>
<script>
function onCreated() {
var imageEditor = document.getElementById('image-editor').ej2_instances[0];
// Reference local image in wwwroot/images/
imageEditor.open('/images/nature.png');
}
</script><ejs-uploader id="fileUpload" selected="onFileSelected"></ejs-uploader>
<ejs-imageeditor id="image-editor"></ejs-imageeditor>
<script>
function onFileSelected(args) {
if (args.filesData.length > 0) {
var reader = new FileReader();
reader.onload = function() {
// Pass base64-encoded local data (no external fetch)
var imageEditor = document.getElementById('image-editor').ej2_instances[0];
imageEditor.open(reader.result);
};
reader.readAsDataURL(args.filesData[0].rawFile);
}
}
</script><button onclick="saveImage()">Save</button>
<ejs-imageeditor id="image-editor" created="onCreated"></ejs-imageeditor>
<script>
function onCreated() {
var imageEditor = document.getElementById('image-editor').ej2_instances[0];
// Load local image
imageEditor.open('/images/nature.png');
}
function saveImage() {
var imageEditor = document.getElementById('image-editor').ej2_instances[0];
imageEditor.export('PNG'); // saves as PNG to local device
}
</script><ejs-imageeditor id="image-editor" fileOpened="onFileOpened"></ejs-imageeditor>
<script>
function onFileOpened(args) {
console.log('Opened file:', args.fileName, 'Type:', args.fileType);
}
</script><ejs-imageeditor id="image-editor">
<e-imageeditor-uploadsettings allowedExtensions=".jpg, .png, .webp"
minFileSize="10000"
maxFileSize="5000000">
</e-imageeditor-uploadsettings>
</ejs-imageeditor>| Property | Type | Default | Purpose |
|---|---|---|---|
| string | "100%" | Editor height |
| string | "100%" | Editor width |
| bool | true | Enable undo/redo (16 steps) |
| bool | false | Disable the control |
| bool | true | Show annotation quick access toolbar |
| Theme | Bootstrap5 | Shape selection appearance theme |
| string | "en-US" | Localization culture |
| bool | false | High-quality rendering smoothing |
| object | default items | Toolbar items array |
| string | null | Custom toolbar template selector |
imageEditor.open()drawImage()// ❌ FORBIDDEN — Loads remote content from untrusted sources
imageEditor.open('https://untrusted-external-cdn.com/bridge.png');
imageEditor.open('https://example.com/user-uploads/image.jpg'); // Arbitrary external URL
imageEditor.drawImage('https://external-site.com/logo.png', 10, 10, 100, 50);
// ✅ SAFE — Use only local/trusted sources
imageEditor.open('/images/local-image.png'); // Local file in wwwroot
imageEditor.open(base64DataUrl); // Base64 encoded (local data)
imageEditor.open(blobUrl); // Blob URL from File input
imageEditor.drawImage('/images/company-logo.png', 10, 10, 100, 50); // Local assetwwwroot/lib/ej2//lib/ej2/ej2.min.js// ✅ SAFE: Load user file locally as base64
function selected(args) {
if (args.filesData.length > 0) {
var reader = new FileReader();
reader.onload = function() {
imageEditor.open(reader.result); // Base64 data, not URL
};
reader.readAsDataURL(args.filesData[0].rawFile);
}
}// ASP.NET Core controller
[HttpPost]
public IActionResult ValidateImage(IFormFile file)
{
// Whitelist allowed MIME types only
var allowedTypes = new[] { "image/png", "image/jpeg", "image/webp", "image/bmp" };
if (!allowedTypes.Contains(file.ContentType))
return BadRequest("Invalid image format");
// Enforce file size limits (e.g., max 5MB)
if (file.Length > 5 * 1024 * 1024)
return BadRequest("File too large");
return Ok();
}drawImage()// ✅ SAFE: Local asset in wwwroot/images/
imageEditor.drawImage('/images/company-logo.png', 10, 10, 100, 50);
// ❌ FORBIDDEN: External URLs not permitted
// imageEditor.drawImage('https://external-site.com/logo.png', ...); <!-- Enforce local-only content loading -->
<meta http-equiv="Content-Security-Policy"
content="script-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline';">| Factor | Assessment |
|---|---|
| Vendor | Syncfusion Inc. — established enterprise component vendor, widely adopted |
| Protocol | All CDN resources served over HTTPS with certificate pinning possible |
| Transparency | Regular security updates and CVE disclosures via Syncfusion support channels |
| Monitoring | Check Syncfusion security bulletins and NuGet package advisory database |
| Undo/Redo | 16-step history is local-only; no cloud sync or external telemetry |
wwwroot/lib/ej2/wwwroot/images/script-src 'self'; img-src 'self' data:snykdotnet list package --vulnerable