using
System;
using
System.Drawing;
using
System.IO;
using
System.Web.UI.HtmlControls;
using
Sitecore.Data.Fields;
using
Sitecore.Data.Items;
using
Sitecore.Resources.Media;
using
Sitecore.SecurityModel;
using
Sitecore.XA.Foundation.RenderingVariants.Pipelines.RenderVariantField;
using
Sitecore.XA.Foundation.Variants.Abstractions.Models;
using
Sitecore.XA.Foundation.Variants.Abstractions.Pipelines.RenderVariantField;
using
Sitecore91.Foundation.CognitiveServices.ComputerVision;
namespace
Sitecore91.Foundation.SXAExtensions.Pipelines.VariantFields.SmartThumbnail
{
public
class
RenderSmartThumbnail : RenderRenderingVariantFieldProcessor
{
private
readonly
IComputerVisionService _computerVisionService;
public
override
Type SupportedType =>
typeof
(SmartThumbnailVariant);
public
override
RendererMode RendererMode => RendererMode.Html;
public
RenderSmartThumbnail()
{
_computerVisionService = ServiceLocator.ServiceProvider.GetService<IComputerVisionService>();
}
public
override
void
RenderField(RenderVariantFieldArgs args)
{
var
variantField = args.VariantField
as
SmartThumbnailVariant;
var
imageUrl =
default
(
string
);
if
(args.Item !=
null
&& !
string
.IsNullOrWhiteSpace(variantField?.FieldName))
{
ImageField imageField = args.Item.Fields[variantField.FieldName];
if
(imageField?.MediaItem !=
null
)
{
var
thumbNameSuffix =
"_thumb"
;
var
newItemPath = imageField.MediaItem.Paths.Path + thumbNameSuffix;
var
mediaItem = (MediaItem) imageField.MediaItem;
var
thumbMediaItem = mediaItem.Database.GetItem(newItemPath);
if
(thumbMediaItem !=
null
)
{
using
(
new
SecurityDisabler())
{
thumbMediaItem.Delete();
}
}
var
image = (
byte
[])
new
ImageConverter().ConvertTo(Image.FromStream(mediaItem.GetMediaStream()),
typeof
(
byte
[]));
var
thumbnail = _computerVisionService.GetThumbnail(image, variantField.Width, variantField.Height, variantField.IsSmartCrop);
if
(thumbnail ==
null
)
{
return
;
}
using
(
var
memoryStream =
new
MemoryStream(thumbnail))
{
var
mediaCreator =
new
MediaCreator();
var
options =
new
MediaCreatorOptions
{
Versioned =
false
,
IncludeExtensionInItemName =
false
,
Database = mediaItem.Database,
Destination = newItemPath,
FileBased =
false
};
using
(
new
SecurityDisabler())
{
var
newFileName = mediaItem.Name + thumbNameSuffix +
"."
+ mediaItem.Extension;
thumbMediaItem = mediaCreator.CreateFromStream(memoryStream, newFileName, options);
}
}
imageUrl = MediaManager.GetMediaUrl(thumbMediaItem);
}
}
if
(
string
.IsNullOrWhiteSpace(imageUrl))
{
return
;
}
var
control =
new
HtmlGenericControl(
"img"
);
control.Attributes.Add(
"src"
, imageUrl);
args.ResultControl = control;
args.Result = RenderControl(args.ResultControl);
}
}
}