Is there any way of restricting the maximum width and height of images that people can use within the RadEditor? Both at the point of upload and within the designer would be useful.
Users can upload images but some are uploading images that are far too large (dimensions) and they are breaking the layout of the page.
I think that one partial solution would be to override the save function in the image manager to resize the graphic but the user could still use the design view of the editor to drag the image to a size that is too large.
Thanks
Users can upload images but some are uploading images that are far too large (dimensions) and they are breaking the layout of the page.
I think that one partial solution would be to override the save function in the image manager to resize the graphic but the user could still use the design view of the editor to drag the image to a size that is too large.
Thanks
8 Answers, 1 is accepted
0
Hi MPatt,
The following code will get you started:
You will notice that when you select an image and resize it an event will fire.
There is also most of the logic you need to get the job finished.
Due to the lack of onresizeend event in FireFox, there does not seem to be an approach that can make things work as needed there. Hopefully, the FireFox team will eventually add this useful event to the browser's implementation (similar to the lack of onpaste event which was eventually introduced in FF3).
You can also implement you own file system content provider on the server which will allow you to resize the images when they are uploaded to the server:
Sincerely yours,
Rumen
the Telerik team
Instantly find answers to your questions on the new Telerik Support Portal.
Check out the tips for optimizing your support resource searches.
The following code will get you started:
| <script type="text/javascript"> |
| function OnClientLoad(editor, args) |
| { |
| editor.attachEventHandler("oncontrolselect", function() |
| { |
| //Check if image |
| window.setTimeout(function() |
| { |
| var selElem = editor.getSelection().getParentElement(); |
| if (selElem.tagName == "IMG") |
| { |
| //Store current width and height |
| curWidth = selElem.offsetWidth; |
| curHeight = selElem.offsetHeight; |
| //Possible to resize, so attach eventhandler |
| selElem.onresizeend = function(e) |
| { |
| alert("I was resized"); |
| selElem.style.width = "300"; |
| selElem.style.height = "300"; |
| selElem.onresizeend = null;//remove handler |
| //Make calculations about skaling, then re-size image |
| }; |
| } |
| }, 0); |
| }); |
| } |
| </script> |
| <br /><br /><br /> |
| <telerik:RadEditor ID="RadEditor1" |
| OnClientLoad="OnClientLoad" ToolbarMode="showOnFocus" |
| runat="server" Width="400" Height="400"> |
| <Content>test |
| <img src="http://www.telerik.com/DEMOS/ASPNET/RadControls/Editor/Skins/Default/buttons/CustomDialog.gif"/> |
| <a href="www.telerik.com">telerik</a> |
| <img src="http://www.telerik.com/DEMOS/ASPNET/RadControls/Editor/Skins/Default/buttons/CustomDialog.gif"/> |
| </Content> |
| </telerik:RadEditor> |
You will notice that when you select an image and resize it an event will fire.
There is also most of the logic you need to get the job finished.
Due to the lack of onresizeend event in FireFox, there does not seem to be an approach that can make things work as needed there. Hopefully, the FireFox team will eventually add this useful event to the browser's implementation (similar to the lack of onpaste event which was eventually introduced in FF3).
You can also implement you own file system content provider on the server which will allow you to resize the images when they are uploaded to the server:
| protected void Page_Load(object sender, EventArgs e) |
| { |
| RadEditor1.ImageManager.ViewPaths = new string[]{"~/"}; |
| RadEditor1.ImageManager.UploadPaths = new string[] { "~/" }; |
| RadEditor1.ImageManager.ContentProviderTypeName = typeof(myprovider).AssemblyQualifiedName; |
| } |
| public class myprovider : Telerik.Web.UI.Widgets.FileSystemContentProvider |
| { |
| public myprovider(HttpContext context, string[] searchPatterns, string[] viewPaths, string[] uploadPaths, string[] deletePaths, string selectedUrl, string selectedItemTag) |
| : base(context, searchPatterns, viewPaths, uploadPaths, deletePaths, selectedUrl, selectedItemTag) |
| { |
| } |
| public bool ThumbnailCallback() |
| { |
| return false; |
| } |
| public override string StoreFile(UploadedFile file, string path, string name, params string[] arguments) |
| { |
| string result = base.StoreFile(file, path, name, arguments); |
| System.Drawing.Image.GetThumbnailImageAbort myCallback = |
| new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback); |
| string fileName = Path.Combine(path, name); |
| //Create a copy of the image with a different size |
| using (System.Drawing.Image originalImage = Bitmap.FromStream(file.InputStream)) |
| { |
| using (System.Drawing.Image thumbnail = originalImage.GetThumbnailImage(300, 300, myCallback, IntPtr.Zero)) |
| { |
| thumbnail.Save(Context.Server.MapPath(fileName)); |
| } |
| } |
| return result; |
| } |
| } |
Sincerely yours,
Rumen
the Telerik team
Instantly find answers to your questions on the new Telerik Support Portal.
Check out the tips for optimizing your support resource searches.
0
MPatt
Top achievements
Rank 1
answered on 16 Jul 2009, 07:18 AM
Many thanks for the very helpful response. I'll have a look into it.
Regards,
Matt
Regards,
Matt
0
Dimo
Top achievements
Rank 1
answered on 22 Apr 2010, 05:29 PM
Hi!
How can I set explicitely size to all pictures to be not more than 150px for example. Serverside prefered, but clientside also can be interesting.
How can I set explicitely size to all pictures to be not more than 150px for example. Serverside prefered, but clientside also can be interesting.
0
Rumen Jekov
Top achievements
Rank 1
answered on 23 Apr 2010, 01:32 AM
Hi,
This could be helpful:
http://www.telerik.com/community/code-library/aspnet-ajax/editor/resizing-an-image-during-upload.aspx
Of course you can also try to enhance the provided client side code posted on Jul 15, 2009 (the first snippet).
Best regards,
Rumen
This could be helpful:
http://www.telerik.com/community/code-library/aspnet-ajax/editor/resizing-an-image-during-upload.aspx
Of course you can also try to enhance the provided client side code posted on Jul 15, 2009 (the first snippet).
Best regards,
Rumen
0
Grey
Top achievements
Rank 1
answered on 24 Nov 2010, 09:36 AM
Hi
I wanted to resize images to a maximum width (In my case 600px) and retain the aspect ratio.
So I modified the VB script in the code example at
http://www.telerik.com/community/code-library/aspnet-ajax/editor/resizing-an-image-during-upload.aspx
As Follows
You can just set the ImageMaxWidth variable to whatever you'd like
Oh, and I just tweaked the resize quality a bit by adding the following
Works like a charm.
Thanks for the original code, really savied me a lot of time and effort.
I wanted to resize images to a maximum width (In my case 600px) and retain the aspect ratio.
So I modified the VB script in the code example at
http://www.telerik.com/community/code-library/aspnet-ajax/editor/resizing-an-image-during-upload.aspx
As Follows
Imports System.DrawingImports System.Drawing.Drawing2DImports Telerik.Web.UIPartial Class Default_Vb Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load Dim paths As String() = New String() {"~/Images"} RadEditor1.ImageManager.ViewPaths = paths RadEditor1.ImageManager.UploadPaths = paths RadEditor1.ImageManager.DeletePaths = paths RadEditor1.ImageManager.ContentProviderTypeName = GetType(ChangeImageSizeProvider).AssemblyQualifiedName End Sub Public Class ChangeImageSizeProvider Inherits Telerik.Web.UI.Widgets.FileSystemContentProvider Public Sub New(ByVal context As HttpContext, ByVal searchPatterns As String(), ByVal viewPaths As String(), ByVal uploadPaths As String(), ByVal deletePaths As String(), ByVal selectedUrl As String, _ ByVal selectedItemTag As String) MyBase.New(context, searchPatterns, viewPaths, uploadPaths, deletePaths, selectedUrl, _ selectedItemTag) End SubPublic Overloads Overrides Function StoreFile(ByVal file As UploadedFile, ByVal path As String, ByVal name As String, ByVal ParamArray arguments As String()) As String Dim image As System.Drawing.Image = System.Drawing.Image.FromStream(file.InputStream) Dim physicalPath As String = Context.Server.MapPath(path) 'Set Maximum Width of Image Dim ImageMaxwidth As Integer = 600 ' Finds height and width of original image Dim OriginalHeight As Single = Image.Height Dim OriginalWidth As Single = Image.Width ' Finds height and width of resized image Dim NewWidth As Integer Dim NewHeight As Integer If OriginalWidth >= ImageMaxwidth Then If OriginalHeight > OriginalWidth Then NewHeight = ImageMaxwidth NewWidth = (OriginalWidth / OriginalHeight) * ImageMaxwidth Else NewWidth = ImageMaxwidth NewHeight = (OriginalHeight / OriginalWidth) * ImageMaxwidth End If 'Mycode Else NewHeight = OriginalHeight NewWidth = OriginalWidth 'My Code End If Dim resultImage As System.Drawing.Image = ResizeImage(image, New Size(newWidth, newHeight)) resultImage.Save(physicalPath + name) Dim result As String = path + name Return result End Function Private Function ResizeImage(ByVal sourceImage As System.Drawing.Image, ByVal newSize As Size) As System.Drawing.Image Dim bitmap As New Bitmap(newSize.Width, newSize.Height) Dim g As Graphics = Graphics.FromImage(DirectCast(bitmap, System.Drawing.Image)) g.InterpolationMode = InterpolationMode.HighQualityBicubic g.CompositingQuality = CompositingQuality.HighQuality g.SmoothingMode = SmoothingMode.HighQuality g.DrawImage(sourceImage, 0, 0, newSize.Width, newSize.Height) g.Dispose() Return DirectCast(bitmap, System.Drawing.Image) End Function End ClassEnd ClassYou can just set the ImageMaxWidth variable to whatever you'd like
Oh, and I just tweaked the resize quality a bit by adding the following
g.CompositingQuality = CompositingQuality.HighQualityg.SmoothingMode = SmoothingMode.HighQualityWorks like a charm.
Thanks for the original code, really savied me a lot of time and effort.
0
Hi Grey,
Thank you for sharing your solution with the community. As a small token of gratitude I have updated your Telerik points.
All the best,
Dobromir
the Telerik team
Thank you for sharing your solution with the community. As a small token of gratitude I have updated your Telerik points.
All the best,
Dobromir
the Telerik team
Browse the vast support resources we have to jumpstart your development with RadControls for ASP.NET AJAX. See how to integrate our AJAX controls seamlessly in SharePoint 2007/2010 visiting our common SharePoint portal.
0
Mattias Moberg
Top achievements
Rank 1
answered on 14 Jan 2011, 11:26 PM
Thanks for handle nice example.
Is there anyone that can convert Grey´s code to C# ?
Thanks,
Edit: Did convert it myslef.
Is there anyone that can convert Grey´s code to C# ?
Thanks,
Edit: Did convert it myslef.
public class ChangeImageSizeProvider : Telerik.Web.UI.Widgets.FileSystemContentProvider{ public ChangeImageSizeProvider(HttpContext context, string[] searchPatterns, string[] viewPaths, string[] uploadPaths, string[] deletePaths, string selectedUrl, string selectedItemTag) : base(context, searchPatterns, viewPaths, uploadPaths, deletePaths, selectedUrl, selectedItemTag) { } public override string StoreFile(UploadedFile file, string path, string name, params string[] arguments) { System.Drawing.Image image = System.Drawing.Image.FromStream(file.InputStream); string physicalPath = Context.Server.MapPath(path); //Set Maximum Width of Image
int ImageMaxwidth = 600; // Finds height and width of original image float OriginalHeight = image.Height; float OriginalWidth = image.Width; // Finds height and width of resized image int NewWidth = 0; int NewHeight = 0; if (OriginalWidth >= ImageMaxwidth) { if (OriginalHeight > OriginalWidth) { NewHeight = ImageMaxwidth; NewWidth = (int)(OriginalWidth / OriginalHeight * ImageMaxwidth); } else { NewWidth = ImageMaxwidth; NewHeight = (int)(OriginalHeight / OriginalWidth * ImageMaxwidth); } } else { NewHeight = (int)OriginalHeight; NewWidth = (int)OriginalWidth; } System.Drawing.Image resultImage = ResizeImage(image, new Size(NewWidth, NewHeight)); resultImage.Save(physicalPath + name); string result = path + name; return result; } private System.Drawing.Image ResizeImage(System.Drawing.Image sourceImage, Size newSize) { Bitmap bitmap = new Bitmap(newSize.Width, newSize.Height); Graphics g = Graphics.FromImage((System.Drawing.Image)bitmap); g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.CompositingQuality = CompositingQuality.HighQuality; g.SmoothingMode = SmoothingMode.HighQuality; g.DrawImage(sourceImage, 0, 0, newSize.Width, newSize.Height); g.Dispose(); return (System.Drawing.Image)bitmap; }}0
Accepted
Marco Antonio
Top achievements
Rank 1
answered on 26 Sep 2013, 05:56 PM
Código adaptado para limitar largura e a altura de forma proporcional!
/****************************************************************************************************************************************************** protected void Page_Load(object sender, EventArgs e) { //pasta na qual sera arquivada imagens Editor.ImageManager.ViewPaths = new string[] { "~/Arquivos/Img" }; Editor.ImageManager.UploadPaths = new string[] { "~/Arquivos/Img" }; Editor.ImageManager.DeletePaths = new string[] { "~/Arquivos/Img" }; Editor.ImageManager.MaxUploadFileSize = 10000000; Editor.ImageManager.ContentProviderTypeName = typeof(ChangeImageSizeProvider).AssemblyQualifiedName; }//********************************************************************************************************************************* public class ChangeImageSizeProvider : Telerik.Web.UI.Widgets.FileSystemContentProvider { public ChangeImageSizeProvider(HttpContext context, string[] searchPatterns, string[] viewPaths, string[] uploadPaths, string[] deletePaths, string selectedUrl, string selectedItemTag) : base(context, searchPatterns, viewPaths, uploadPaths, deletePaths, selectedUrl, selectedItemTag) { } public override string StoreFile(UploadedFile file, string path, string name, params string[] arguments) { System.Drawing.Image image = System.Drawing.Image.FromStream(file.InputStream); string physicalPath = Context.Server.MapPath(path); //Set Maximum Width of Image int ImageMaxwidth = 700; // Finds height and width of original image float OriginalHeight = image.Height; float OriginalWidth = image.Width; float Diferenca = 0; // Finds height and width of resized image int NewWidth = 0; int NewHeight = 0; if (OriginalWidth > ImageMaxwidth) // a largura é maior que a máxima?? { Diferenca=(OriginalWidth - ImageMaxwidth); //acha a difereça Diferenca=(Diferenca / OriginalWidth); //calcula percentual NewWidth = ImageMaxwidth; //atribui a largura máxima NewHeight = (int)(OriginalHeight -(OriginalHeight * Diferenca)); //reduz altura proporcional a redução da largura } else { NewHeight = (int)OriginalHeight; NewWidth = (int)OriginalWidth; } System.Drawing.Image resultImage = ResizeImage(image, new Size(NewWidth, NewHeight)); resultImage.Save(physicalPath + name); string result = path + name; return result; } private System.Drawing.Image ResizeImage(System.Drawing.Image sourceImage, Size newSize) { Bitmap bitmap = new Bitmap(newSize.Width, newSize.Height); Graphics g = Graphics.FromImage((System.Drawing.Image)bitmap); g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.CompositingQuality = CompositingQuality.HighQuality; g.SmoothingMode = SmoothingMode.HighQuality; g.DrawImage(sourceImage, 0, 0, newSize.Width, newSize.Height); g.Dispose(); return (System.Drawing.Image)bitmap; } }//*************************************************************************************************************************