我正在寻找一种方法来获取Umbraco事件的图像宽度,以验证图像在上传之前是否尊重某个宽高比。问题是我不知道是否可以将mediaItem转换为Image。到目前为止,我如何获得宽度或高度是我的事件代码:
public class ImageResizer : ApplicationEventHandler
{
protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
MediaService.Saving += MediaServiceSaving;
}
void MediaServiceSaving(IMediaService sender, SaveEventArgs<IMedia> e)
{
foreach (var mediaItem in e.SavedEntities)
{
Image img = (Image)mediaItem;
double height = img.Height;
double width = img.Width;
string msg = "" + height;
if (height / width != 1)
{
msg = "Ratio is not 1:1. Please make sure the width and height of your image is the same.";
BasePage.Current.ClientTools.ShowSpeechBubble(BasePage.speechBubbleIcon.success, "Error", msg);
}
else
{
//Ducplicate image to images and thubnails of desired choice
//Send images to database - continue normal process
}
}
}
}
只要相信Umbraco并让它努力弄清楚它是否是一个图像:
public class ImageResizer : ApplicationEventHandler
{
protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
MediaService.Saving += MediaServiceSaving;
}
void MediaServiceSaving(IMediaService sender, SaveEventArgs<IMedia> e)
{
foreach (var mediaItem in e.SavedEntities)
{
//if it's an image, the content type will tell you.
if(mediaItem.ContentType.Alias == "Image")
{
var width = Convert.ToDouble(mediaItem.Properties["umbracoWidth"].Value);
var height = Convert.ToDouble(mediaItem.Properties["umbracoHeight"].Value);
if (height / width != 1)
{
//Sending a message will cancel the process, so you don't
//need an else (unless you want to do something else with the image of course.
e.Messages.Add(new EventMessage("Wrong Ratio", "Ratio is not 1:1. Please make sure the width and height of your image is the same.", EventMessageType.Error));
}
}
}
}
}
你真的不能这样做。首先,IMedia
不一定是图像 - 它可以是任何东西(视频,PDF格式,拉链等)。它只是一个保存在Umbraco媒体库中的项目。实际上,您可以说Umbraco媒体项甚至不必附加文件(如果您愿意,它可能还有多个文件)。
此外 - 即使媒体项目实际上是一个图像,你也不能简单地将它转换为.NET Image
类,因为它们实际上不是同一个东西。
您希望在允许保存之前验证上载的图像是否遵循特定比例。虽然您可以在Umbraco中看到上传图像的比例,但这并不是您的代码运行时始终可用的内容。保存媒体项目时,您连接的事件将触发。
与您的事件处理程序一起,此精确事件还附加了一个不同的事件处理程序。此其他事件处理程序负责根据上载图像的尺寸添加umbracoWidth
和umbracoHeight
属性。因此,您无法真正依赖这些属性来始终在代码运行时分配和使用。您不知道这些事件的确切顺序,或者维度是否在您的代码被点击时实际持久存在。
要执行您想要执行的操作,您需要访问正在保存的文件数据,并从中生成内存中的Image
并使用它来检查正在上载的图像的尺寸。
总而言之,我并不认为你在这里的尝试是解决这个问题的最佳方法。如果有人上传了多个图片,其中只允许有一半图片被允许 - 您将如何处理这种情况?用户不太清楚哪些文件是正确的,哪些文件只是显示通知气泡。除此之外 - 你在上面的代码示例中并没有真正阻止任何事情。您只是显示通知错误 - 但即使比例不正确,文件仍会保存。
然后就是像媒体服务上的Saving
事件那样陷入一般事件的问题。这用于保存的任何类型的媒体 - 首先,您需要确保您的代码仅运行您希望它运行的内容。这意味着将其限制为仅在实际上载图像时运行。然而,您也很可能希望将其限制为仅在特定情况下发生的上传时运行(您似乎不太可能希望上传无论如何都能以1:1的比例运行)。
我认为解决问题的最佳方法是研究为媒体库创建自定义图像上传编辑器,只需在javascript中直接检查图像,是否符合您的比例要求。这将确保您能够以一种很好的方式处理尝试输入大小错误图像的人的情况 - 在让他们尝试保存媒体项之前显示警告并使UI状态无效。
它也会更加灵活,因为它不会干扰您网站中的所有媒体保存 - 代码只会处理使用此特定属性编辑器进行上传的上传。
我还强烈建议您花一点时间研究一下qmbxswpoi和Umbraco中的Image Cropper的功能。它基本上允许您设置要让图像进入的特定预设尺寸。上传图像时,您可以精确指定希望如何裁剪/调整特定尺寸的图像。然后可以在您的标记中使用这些作物,Umbraco将确保以您在模板中请求的特定大小调整,裁剪,缓存和输出您网站中的图像。
你可以在这里阅读更多相关信息:ImageProcessor