ASP.NET Image uploading with Resizing - asp.net

I have an aspx page which will upload images to server harddisk from client pc
But now i need to change my program in such a way that it would allow me to resize the image while uploading.
Does anyone has any idea on this ? I couldnt not find such properties/methods with Input file server control
Any one there to guide me ?

Once the file has been saved to the server you can use code like this to resize. This code will take care of length/width ratio on the resize.
public static Bitmap CreateThumbnail(string lcFilename, int lnWidth, int lnHeight)
{
System.Drawing.Bitmap bmpOut = null;
try
{
Bitmap loBMP = new Bitmap(lcFilename);
ImageFormat loFormat = loBMP.RawFormat;
decimal lnRatio;
int lnNewWidth = 0;
int lnNewHeight = 0;
if (loBMP.Width < lnWidth && loBMP.Height < lnHeight)
return loBMP;
if (loBMP.Width > loBMP.Height)
{
lnRatio = (decimal)lnWidth / loBMP.Width;
lnNewWidth = lnWidth;
decimal lnTemp = loBMP.Height * lnRatio;
lnNewHeight = (int)lnTemp;
}
else
{
lnRatio = (decimal)lnHeight / loBMP.Height;
lnNewHeight = lnHeight;
decimal lnTemp = loBMP.Width * lnRatio;
lnNewWidth = (int)lnTemp;
}
bmpOut = new Bitmap(lnNewWidth, lnNewHeight);
Graphics g = Graphics.FromImage(bmpOut);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
g.FillRectangle(Brushes.White, 0, 0, lnNewWidth, lnNewHeight);
g.DrawImage(loBMP, 0, 0, lnNewWidth, lnNewHeight);
loBMP.Dispose();
}
catch
{
return null;
}
return bmpOut;
}

You will not be able to resize "on the fly" since you will need to have the full image before you perform any image transformations. However, after the upload is complete and before you display any results to your user, you can use this basic image resizing method that I've used in a couple of my apps now:
''' <summary>
''' Resize image with GDI+ so that image is nice and clear with required size.
''' </summary>
''' <param name="SourceImage">Image to resize</param>
''' <param name="NewHeight">New height to resize to.</param>
''' <param name="NewWidth">New width to resize to.</param>
''' <returns>Image object resized to new dimensions.</returns>
''' <remarks></remarks>
Public Shared Function ImageResize(ByVal SourceImage As Image, ByVal NewHeight As Int32, ByVal NewWidth As Int32) As Image
Dim bitmap As System.Drawing.Bitmap = New System.Drawing.Bitmap(NewWidth, NewHeight, SourceImage.PixelFormat)
If bitmap.PixelFormat = Drawing.Imaging.PixelFormat.Format1bppIndexed Or _
bitmap.PixelFormat = Drawing.Imaging.PixelFormat.Format4bppIndexed Or _
bitmap.PixelFormat = Drawing.Imaging.PixelFormat.Format8bppIndexed Or _
bitmap.PixelFormat = Drawing.Imaging.PixelFormat.Undefined Or _
bitmap.PixelFormat = Drawing.Imaging.PixelFormat.DontCare Or _
bitmap.PixelFormat = Drawing.Imaging.PixelFormat.Format16bppArgb1555 Or _
bitmap.PixelFormat = Drawing.Imaging.PixelFormat.Format16bppGrayScale Then
Throw New NotSupportedException("Pixel format of the image is not supported.")
End If
Dim graphicsImage As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(bitmap)
graphicsImage.SmoothingMode = Drawing.Drawing2D.SmoothingMode.HighQuality
graphicsImage.InterpolationMode = Drawing.Drawing2D.InterpolationMode.HighQualityBicubic
graphicsImage.DrawImage(SourceImage, 0, 0, bitmap.Width, bitmap.Height)
graphicsImage.Dispose()
Return bitmap
End Function

Another approach would to allow the user to adjust the size in the browser and then resize the image as described in other answers.
So take a look at this solution which allows you to upload and crop images with jQuery, jCrop & ASP.NET.

How to resize & Upload Image only for .jpg Extensions :
In upload.aspx page
<asp:FileUpload ID="ProductImage" runat="server"/>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Upload" />
<asp:TextBox runat="server" ID="txtProductName" CssClass="form-control" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="txtProductName" ErrorMessage="The Product name field is required." />
And upload.aspx.cs
For resize
/// <summary>
/// Created By Rajib Chowdhury Mob. 01766-306306; Web: http://onlineshoping.somee.com/
/// Complete This Page Coding On January 05, 2014
/// Programing C# By Visual Studio 2013 For Web
/// Dot Net Version 4.5
/// Database Virsion MSSQL Server 2005
/// </summary>
public bool ResizeImageAndUpload(System.IO.FileStream newFile, string folderPathAndFilenameNoExtension, double maxHeight, double maxWidth)
{
try
{
// Declare variable for the conversion
float ratio;
// Create variable to hold the image
System.Drawing.Image thisImage = System.Drawing.Image.FromStream(newFile);
// Get height and width of current image
int width = (int)thisImage.Width;
int height = (int)thisImage.Height;
// Ratio and conversion for new size
if (width > maxWidth)
{
ratio = (float)width / (float)maxWidth;
width = (int)(width / ratio);
height = (int)(height / ratio);
}
// Ratio and conversion for new size
if (height > maxHeight)
{
ratio = (float)height / (float)maxHeight;
height = (int)(height / ratio);
width = (int)(width / ratio);
}
// Create "blank" image for drawing new image
Bitmap outImage = new Bitmap(width, height);
Graphics outGraphics = Graphics.FromImage(outImage);
SolidBrush sb = new SolidBrush(System.Drawing.Color.White);
// Fill "blank" with new sized image
outGraphics.FillRectangle(sb, 0, 0, outImage.Width, outImage.Height);
outGraphics.DrawImage(thisImage, 0, 0, outImage.Width, outImage.Height);
sb.Dispose();
outGraphics.Dispose();
thisImage.Dispose();
// Save new image as jpg
outImage.Save(Server.MapPath(folderPathAndFilenameNoExtension + ".jpg"), System.Drawing.Imaging.ImageFormat.Jpeg);
outImage.Dispose();
return true;
}
catch (Exception)
{
return false;
}
}
And Button1_Click Event
string filePath = "~\\Image\\";//your normal image path
if (Page.IsValid)
{
HttpPostedFile myFile = ProductImage.PostedFile;//Get Slected Image
int nFileLen = myFile.ContentLength;//Get slected Image Size
string myimag = txtProductName.Text;//Get user input image name
Guid ImageName = Guid.NewGuid();//get unique id
if ((myFile != null) && (nFileLen > 1048576))
{
LabelAddStatus.Text = "minimum size exceed"; //If file image size 1 MB above
}
else
{
try
{
if (ProductImage.HasFile)
{
String fileExtension = System.IO.Path.GetExtension(ProductImage.FileName).ToLower();
String[] allowedExtensions = { ".jpg" };//Declare For Allowed Extension
for (int i = 0; i < allowedExtensions.Length; i++)
{
if (fileExtension == allowedExtensions[i])
{
// Read file into a data stream
byte[] myData = new Byte[nFileLen];
myFile.InputStream.Read(myData, 0, nFileLen);
myFile.InputStream.Dispose();
// Save the stream to disk as temporary file. make sure the path is unique!
System.IO.FileStream newFile
= new System.IO.FileStream(Server.MapPath(filePath + "_temp.jpg"),
System.IO.FileMode.Create);
newFile.Write(myData, 0, myData.Length);
bool success = ResizeImageAndUpload(newFile, filePath + ("thumbs"+myimag + ImageName), 100, 100);//Save image your thumb image path
success = ResizeImageAndUpload(newFile, filePath + (myimag + ImageName), 768, 1024);//Save image your normal image path
//delete the temp file.
newFile.Close();
System.IO.File.Delete(Server.MapPath(filePath + "_temp.jpg"));
LabelAddStatus.Text = "File uploaded.";
}
else
{
LabelAddStatus.Text = "Unable to accept file type..";
}
}
}
}
catch (Exception)
{
//No Exception Message
}
}
}
Thanks...

This is how I did in my project, based on your condition (height/width) you can change the parameter ie(MaxHeight)
public static System.Drawing.Image ScaleImage(System.Drawing.Image image, int maxHeight)
{
var ratio = (double)maxHeight / image.Height;
var newWidth = (int)(image.Width * ratio);
var newHeight = (int)(image.Height * ratio);
var newImage = new Bitmap(newWidth, newHeight);
using (var g = Graphics.FromImage(newImage))
{
g.DrawImage(image, 0, 0, newWidth, newHeight);
}
return newImage;
}
On Button click:
protected void Button1_Click(object sender, EventArgs e)
{
lblmsg.Text="";
if ((File1.PostedFile != null) && (File1.PostedFile.ContentLength > 0))
{
Guid uid = Guid.NewGuid();
string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);
string SaveLocation = Server.MapPath("LogoImagesFolder") + "\\" + uid+fn;
try
{
string fileExtention = File1.PostedFile.ContentType;
int fileLenght = File1.PostedFile.ContentLength;
if (fileExtention == "image/png" || fileExtention == "image/jpeg" || fileExtention == "image/x-png")
{
if (fileLenght <= 1048576)
{
System.Drawing.Bitmap bmpPostedImage = new System.Drawing.Bitmap(File1.PostedFile.InputStream);
System.Drawing.Image objImage = ScaleImage(bmpPostedImage, 81);
objImage.Save(SaveLocation,ImageFormat.Png);
lblmsg.Text = "The file has been uploaded.";
lblmsg.Style.Add("Color", "Green");
}
else
{
lblmsg.Text = "Image size cannot be more then 1 MB.";
lblmsg.Style.Add("Color", "Red");
}
}
else {
lblmsg.Text = "Invaild Format!";
lblmsg.Style.Add("Color", "Red");
}
}
catch (Exception ex)
{
lblmsg.Text= "Error: " + ex.Message;
lblmsg.Style.Add("Color", "Red");
}
}
}

You'll need to use the WebClient class to download the remote image.
After that, then you can resize it...Use DrawImage, not GetThumbnailImage. Make sure you dispose of your bitmap and graphics handles.. (use using{}). Set all quality settings to high.
You might want to take a look at the source code for my popular image resizer first... It will help you avoid some common trouble areas.

//Here is another WAY fox!!! i have actually modify the code from You all. HIHI
//First, add one textBox and one FileUpload Control, and a button
//paste this in your code behind file... after public partial class admin : System.Web.UI.Page
string OriPath;
string ImageName;
public Size NewImageSize(int OriginalHeight, int OriginalWidth, double FormatSize)
{
Size NewSize;
double tempval;
if (OriginalHeight > FormatSize && OriginalWidth > FormatSize)
{
if (OriginalHeight > OriginalWidth)
tempval = FormatSize / Convert.ToDouble(OriginalHeight);
else
tempval = FormatSize / Convert.ToDouble(OriginalWidth);
NewSize = new Size(Convert.ToInt32(tempval * OriginalWidth), Convert.ToInt32(tempval * OriginalHeight));
}
else
NewSize = new Size(OriginalWidth, OriginalHeight); return NewSize;
}
//Now, On Button click add the folwing code.
if (FileUpload1.PostedFile != null)
{
ImageName = TextBox1.Text+".jpg";
OriPath = Server.MapPath("pix\\") + ImageName;
//Gets the Full Path using Filecontrol1 which points to actual location in the hardisk :)
using (System.Drawing.Image Img = System.Drawing.Image.FromFile(System.IO.Path.GetFullPath(FileUpload1.PostedFile.FileName)))
{
Size ThumbNailSize = NewImageSize(Img.Height, Img.Width, 800);
using (System.Drawing.Image ImgThnail = new Bitmap(Img, ThumbNailSize.Width, ThumbNailSize.Height))
{
ImgThnail.Save(OriPath, Img.RawFormat);
ImgThnail.Dispose();
}
Img.Dispose();
}
}
//Enjoy. If any problem,, mail me at izacmail#gmail.com

To resize down a image and get smaller sizes just make the changes below
bmpOut = new Bitmap(lnNewWidth, lnNewHeight, **System.Drawing.Imaging.PixelFormat.Format24bppRgb**);
Graphics g = Graphics.FromImage(bmpOut);
as you above a set the imagem to Format24bppRgb PixelFormat.
and when you save the file, you set the ImageFormat also. Like this:
bmpOut.Save(PathImage, System.Drawing.Imaging.ImageFormat.Jpeg);

You can use this, it does a dandy job for me. But it does not handle low res images well for me. Thankfully I down use to many of them. Just sent it the image byte[] and the expected output and you'll be good to go.
public static byte[] ResizeImageFile(byte[] imageFile, int targetSize)
{
using (System.Drawing.Image oldImage = System.Drawing.Image.FromStream(new MemoryStream(imageFile)))
{
Size newSize = CalculateDimensions(oldImage.Size, targetSize);
using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, PixelFormat.Format32bppRgb))
{
newImage.SetResolution(oldImage.HorizontalResolution, oldImage.VerticalResolution);
using (Graphics canvas = Graphics.FromImage(newImage))
{
canvas.SmoothingMode = SmoothingMode.AntiAlias;
canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
canvas.PixelOffsetMode = PixelOffsetMode.HighQuality;
canvas.DrawImage(oldImage, new Rectangle(new Point(0, 0), newSize));
MemoryStream m = new MemoryStream();
newImage.Save(m, ImageFormat.Jpeg);
return m.GetBuffer();
}
}
}
}
private static Size CalculateDimensions(Size oldSize, int targetSize)
{
Size newSize = new Size();
if (oldSize.Width > oldSize.Height)
{
newSize.Width = targetSize;
newSize.Height = (int)(oldSize.Height * (float)targetSize / (float)oldSize.Width);
}
else
{
newSize.Width = (int)(oldSize.Width * (float)targetSize / (float)oldSize.Height);
newSize.Height = targetSize;
}
return newSize;
}

You could resize before sending to the server using an ActiveX control. There is a free ASP.net image uploading component (I believe this is the same one that Facebook actually uses) available here:
http://forums.aurigma.com/yaf_postst2145_Image-Uploader-ASPNET-Control.aspx
Let me know if it works, I am thinking about implementing it in my projects here at work.
Edit: Looks like the wrapper for the object is free, however the actual component itself is going to run you about $200. I confirmed it is the same component Facebook is using though.

using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
public partial class admin_AddPhoto : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string reportPath = Server.MapPath("../picnic");
if (!Directory.Exists(reportPath))
{
Directory.CreateDirectory(Server.MapPath("../picnic"));
}
}
protected void PhotoForm_ItemInserting(object sender, FormViewInsertEventArgs e)
{
FormView uploadForm = sender as FormView;
FileUpload uploadedFile = uploadForm.FindControl("uploadedFile") as FileUpload;
if (uploadedFile != null)
{
string fileName = uploadedFile.PostedFile.FileName;
string pathFile = System.IO.Path.GetFileName(fileName);
try
{
uploadedFile.SaveAs(Server.MapPath("../picnic/") + pathFile);
}
catch (Exception exp)
{
//catch exception here
}
try
{
Bitmap uploadedimage = new Bitmap(uploadedFile.PostedFile.InputStream);
e.Values["ImageWidth"] = uploadedimage.Width.ToString();
e.Values["ImageHeight"] = uploadedimage.Height.ToString();
// Make output File Name
char[] splitter = { '.' };
string[] splitFile = pathFile.Split(splitter);
string OutputFilename = splitFile[0] + "s";
System.Drawing.Image.GetThumbnailImageAbort myCallback = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
System.Drawing.Image thumbImage = uploadedimage.GetThumbnailImage(74, 54, myCallback, IntPtr.Zero);
thumbImage.Save(Server.MapPath("../picnic/") + OutputFilename + ".jpg");
e.Values["Thumbnail"] = "./picnic/" + OutputFilename + ".jpg";
}
catch (Exception ex)
{
//catch exception here
}
e.Values["Pic"] = "./picnic/" + pathFile;
e.Values["Url"] = "./picnic/" + pathFile;
e.Values["dateEntered"] = DateTime.Now.ToString();
}
}
public bool ThumbnailCallback()
{
return false;
}
}
This uses a FileUpload and a FormView to insert. Then I use the GetThumnailImage() method provided in System.Drawing.Imaging. You can enter any Width and Height values and it will shrink/stretch accordingly.
uploadedimage.GetThumbnailImage(W, H, myCallback, IntPtr.Zero);
Hope this helps.

The uploading of the image file is performed by ASP.NET 4.0 Client Callbacks. If you are not familiar with client callbacks then I suggest that you take a look at ASP.Net AJAX Control Toolkit AsyncFileUpload Control without page refresh or PostBack in ASP.Net Web Page or ASP.Net AJAX Update Panel. The callback is fired as soon as the file is selected by the user using the file field control.

public string ResizeImageAndSave(int Width, int Height, string imageUrl, string destPath)
{
System.Drawing.Image fullSizeImg = System.Drawing.Image.FromFile(imageUrl);
double widthRatio = (double)fullSizeImg.Width / (double)Width;
double heightRatio = (double)fullSizeImg.Height / (double)Height;
double ratio = Math.Max(widthRatio, heightRatio);
int newWidth = (int)(fullSizeImg.Width / ratio);
int newHeight = (int)(fullSizeImg.Height / ratio);
//System.Drawing.Image.GetThumbnailImageAbort dummyCallBack = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
System.Drawing.Image thumbNailImg = fullSizeImg.GetThumbnailImage(newWidth, newHeight, new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback), IntPtr.Zero);
//DateTime MyDate = DateTime.Now;
//String MyString = MyDate.ToString("ddMMyyhhmmss") + imageUrl.Substring(imageUrl.LastIndexOf("."));
thumbNailImg.Save(destPath, ImageFormat.Jpeg);
thumbNailImg.Dispose();
return "";
}
public bool ThumbnailCallback() { return false; }

private void ResizeImage(FileUpload fileUpload)
{
// First we check to see if the user has selected a file
if (fileUpload.HasFile)
{
// Find the fileUpload control
string filename = fileUpload.FileName;
// Check if the directory we want the image uploaded to actually exists or not
if (!Directory.Exists(MapPath(#"Uploaded-Files")))
{
// If it doesn't then we just create it before going any further
Directory.CreateDirectory(MapPath(#"Uploaded-Files"));
}
// Specify the upload directory
string directory = Server.MapPath(#"Uploaded-Files\");
// Create a bitmap of the content of the fileUpload control in memory
Bitmap originalBMP = new Bitmap(fileUpload.FileContent);
// Calculate the new image dimensions
int origWidth = originalBMP.Width;
int origHeight = originalBMP.Height;
int sngRatio = origWidth / origHeight;
int newWidth = 100;
int newHeight = newWidth / sngRatio;
// Create a new bitmap which will hold the previous resized bitmap
Bitmap newBMP = new Bitmap(originalBMP, newWidth, newHeight);
// Create a graphic based on the new bitmap
Graphics oGraphics = Graphics.FromImage(newBMP);
// Set the properties for the new graphic file
oGraphics.SmoothingMode = SmoothingMode.AntiAlias;
oGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
// Draw the new graphic based on the resized bitmap
oGraphics.DrawImage(originalBMP, 0, 0, newWidth, newHeight);
// Save the new graphic file to the server
newBMP.Save(directory + "tn_" + filename);
// Once finished with the bitmap objects, we deallocate them.
originalBMP.Dispose();
newBMP.Dispose();
oGraphics.Dispose();
// Write a message to inform the user all is OK
label.Text = "File Name: <b style='color: red;'>" + filename + "</b><br>";
label.Text += "Content Type: <b style='color: red;'>" + fileUpload.PostedFile.ContentType + "</b><br>";
label.Text += "File Size: <b style='color: red;'>" + fileUpload.PostedFile.ContentLength.ToString() + "</b>";
// Display the image to the user
Image1.Visible = true;
Image1.ImageUrl = #"Uploaded-Files/tn_" + filename;
}
else
{
label.Text = "No file uploaded!";
}
}

Related

asp.net file upload control upload external image URL

I am calling an external API which return me URL of an image , I want to upload that image to file upload control as soon as I get response from API and after that user can crop and make adjustment to image and then save it.
Please help me if someone has done something like before.
I have done this before:
using..
using System.Net;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
download, crop+resize the image:
string imgurl = "https://seeklogo.net/wp-content/uploads/2015/10/stack-overflow-logo-vector-download.jpg";
// download the image
WebClient wc = new WebClient();
byte[] ba = wc.DownloadData(imgurl);
// convert it into image
MemoryStream ms = new MemoryStream(ba);
System.Drawing.Image img = System.Drawing.Image.FromStream(ms);
// crop and resize
System.Drawing.Image img2 = ResizeCropFitToSize(img, 200, 80);
// convert it into byte[]
MemoryStream ms2 = new MemoryStream();
img2.Save(ms2, ImageFormat.Jpeg);
byte[] ba2 = ms2.ToArray();
// save the file
string filepath = Server.MapPath("~/logo.jpg");
File.WriteAllBytes(filepath, ba2);
other library coding (some of my personal collection of imaging codes)
public static System.Drawing.Image ResizeCropFitToSize(System.Drawing.Image fullSizeImage, int width, int height)
{
System.Drawing.Image img = ResizeImageMinSize(fullSizeImage, width, height);
System.Drawing.Image img2 = CropImageCenter(img, width, height);
img.Dispose();
return img2;
}
public static System.Drawing.Image ResizeImageMinSize(System.Drawing.Image FullsizeImage, int MinimumWidth, int MinimumHeight)
{
// Prevent using images internal thumbnail
FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
int NewWidth = 0;
int NewHeight = 0;
NewHeight = MinimumWidth * FullsizeImage.Height / FullsizeImage.Width;
NewWidth = MinimumWidth;
if (NewHeight < MinimumHeight)
{
NewHeight = MinimumHeight;
NewWidth = MinimumHeight * FullsizeImage.Width / FullsizeImage.Height;
}
System.Drawing.Image NewImage = (System.Drawing.Image)(new Bitmap(FullsizeImage, NewWidth, NewHeight));
return NewImage;
}
public static System.Drawing.Image CropImageCenter(System.Drawing.Image image, int Width, int Height)
{
int StartAtX = (image.Width - Width) / 2;
int StartAtY = (image.Height - Height) / 2;
return CropImage(image, StartAtX, StartAtY, Width, Height);
}
public static System.Drawing.Image CropImage(System.Drawing.Image image, int StartAtX, int StartAtY, int Width, int Height)
{
System.Drawing.Image outimage;
MemoryStream mm = null;
try
{
//check the image height against our desired image height
if (image.Height < Height)
{
Height = image.Height;
}
if (image.Width < Width)
{
Width = image.Width;
}
//create a bitmap window for cropping
Bitmap bmPhoto = new Bitmap(Width, Height, PixelFormat.Format24bppRgb);
bmPhoto.SetResolution(72, 72);
//create a new graphics object from our image and set properties
Graphics grPhoto = Graphics.FromImage(bmPhoto);
grPhoto.SmoothingMode = SmoothingMode.AntiAlias;
grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;
grPhoto.PixelOffsetMode = PixelOffsetMode.HighQuality;
//now do the crop
grPhoto.DrawImage(image, new Rectangle(0, 0, Width, Height), StartAtX, StartAtY, Width, Height, GraphicsUnit.Pixel);
// Save out to memory and get an image from it to send back out the method.
mm = new MemoryStream();
bmPhoto.Save(mm, System.Drawing.Imaging.ImageFormat.Jpeg);
image.Dispose();
bmPhoto.Dispose();
grPhoto.Dispose();
outimage = System.Drawing.Image.FromStream(mm);
return outimage;
}
catch (Exception ex)
{
throw new Exception("Error cropping image, the error was: " + ex.Message);
}
}

How to compress height and width of a photo during the time of upload [asp.net]

I want to compress the uploading photo to size Height =600px & Width= 800px [only if actual size is greater than this] during the time of upload.photos are saving on sql server2008 with a datatype image !
public byte[] imagetoByte()
{
if (FileUpload1.HasFile)
{
int imageFilelength = FileUpload1.PostedFile.ContentLength;
byte[] ph = new byte[imageFilelength];
HttpPostedFile ima = FileUpload1.PostedFile;
MemoryStream memoryStream = new MemoryStream();
ima.InputStream.Read(ph, 0, imageFilelength);
return ph;
}
else
{
return null;
}
}
function is used for image upload !! somebody help me to fix this..
Possible solution can be as:
int imageFilelength = FileUpload1.PostedFile.ContentLength;
byte[] ph = new byte[imageFilelength];
MemoryStream ms = new MemoryStream(ph);
Image img = System.Drawing.Image.FromStream(ms);
//Call function to resize
Image ResizedImage = RezizeImage(img, 500, 500);
//Save Image
ResizedImage.Save("IMAGELOCATION.png", System.Drawing.Imaging.ImageFormat.Gif);
private Image RezizeImage(Image img, int maxWidth, int maxHeight)
{
if(img.Height < maxHeight && img.Width < maxWidth) return img;
using (img)
{
Double xRatio = (double)img.Width / maxWidth;
Double yRatio = (double)img.Height / maxHeight;
Double ratio = Math.Max(xRatio, yRatio);
int nnx = (int)Math.Floor(img.Width / ratio);
int nny = (int)Math.Floor(img.Height / ratio);
Bitmap cpy = new Bitmap(nnx, nny, PixelFormat.Format32bppArgb);
using (Graphics gr = Graphics.FromImage(cpy))
{
gr.Clear(Color.Transparent);
// This is said to give best quality when resizing images
gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
gr.DrawImage(img,
new Rectangle(0, 0, nnx, nny),
new Rectangle(0, 0, img.Width, img.Height),
GraphicsUnit.Pixel);
}
return cpy;
}
}

How to pass image to Eval method from handler.ashx to imageurl?

I want to retrieve image from database and display in an aspx page. I use Linq to SQL. And a Generic handler.
Handler2.ashx code:
public void ProcessRequest(HttpContext context)
{
if (context.Request.QueryString["id"] != null)
{
int id;
string sid = context.Request.QueryString["id"];
if (int.TryParse(sid, out id))
{
Stream strm = getImage(id);
byte[] buffer = new byte[4096];
int i = strm.Read(buffer, 0, 4096);
while (i > 0)
{
context.Response.OutputStream.Write(buffer, 0, 4096);
i = strm.Read(buffer, 0, 4096);
}
}
else
{
//
}
}
}
public Stream getImage(int id)
{
using (DummyDBEntities cntx = new DummyDBEntities())
{
var db = from c in cntx.Images
where c.imageId == id
select c.imageData;
MemoryStream ms = new MemoryStream();
byte[] byteArray = new byte[db.ToArray().Length];
ms.Write(byteArray, 0, db.ToArray().Length);
return new MemoryStream(byteArray);
}
}
And a button control in Default.aspx page when I click, redirects to handler1.ashx. Gets the id of image from database and supposed to Show it in Default.aspx asp:image control
protected void btnGetID_Click(object sender, EventArgs e)
{
int id=Convert.ToInt32(txtGetID.Text);
Response.Redirect("Handler2.ashx?id="+id);
Image1.ImageUrl = '<%# "~/Handler2.ashx?id=" + Eval("imageData"); %>';
}
How do i supposed to write Eval method and the querystring to pass the image to imageurl?
Image1.ImageUrl = '<%# "~/Handler2.ashx?id=" + Eval("imageData"); %>';
Please help, thanks.
I hope I understood your problem right.
You want to display the image from your handler in the Image1. For that you can just do the following
Image1.ImageUrl = ResolveUrl("~/Handler2.ashx?id=" + id);

ASP.NET error when uploading, renaming and resizing an image

Afternoon, i am trying to upload a file using the asp.net FileUpload control. Before saving the image i need to rename the file with the users GUID, then resize the image to 128px.
However when it goes to save i am getting the error A generic error occurred in GDI+. and i can not work out how to get this sorted.
Could someone look over my code and provide some guidance please
protected void btnUpload_Click(object sender, EventArgs e)
{
Guid userGuid = (Guid)Membership.GetUser().ProviderUserKey;
string directory = Server.MapPath("imgs/users");
string fileExt = Path.GetExtension(fuSample.PostedFile.FileName);
string fileName = userGuid + fileExt;
//Check File ext, make sure its an image!
if (fileExt == ".jpeg" || fileExt == ".jpg" || fileExt == ".png" || fileExt == ".gif")
{
//Now we check to make sure its less than 600kb
if (fuSample.PostedFile.ContentLength < 614400)
{
//Delete an existing file.
if (File.Exists(directory + fileName))
File.Delete(directory + fileName);
// Create a bitmap of the content of the fileUpload control in memory
Bitmap originalBMP = new Bitmap(fuSample.FileContent);
// Calculate the new image dimensions
int origWidth = originalBMP.Width;
int origHeight = originalBMP.Height;
int sngRatio = origWidth / origHeight;
int newWidth = 128;
int newHeight = newWidth / sngRatio;
// Create a new bitmap which will hold the previous resized bitmap
Bitmap newBMP = new Bitmap(originalBMP, newWidth, newHeight);
// Create a graphic based on the new bitmap
Graphics oGraphics = Graphics.FromImage(newBMP);
// Set the properties for the new graphic file
oGraphics.SmoothingMode = SmoothingMode.AntiAlias; oGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
// Draw the new graphic based on the resized bitmap
oGraphics.DrawImage(originalBMP, 0, 0, newWidth, newHeight);
// Save the new graphic file to the server
newBMP.Save(directory + fileName);
// Once finished with the bitmap objects, we deallocate them.
originalBMP.Dispose();
newBMP.Dispose();
oGraphics.Dispose();
//Success!
}
else
{
//error here, img too big
}
}
else
{
notifybar.Attributes.Add("style", "display:block;");
notifybar.Attributes.Add("class", "failed");
notifyText.Text = "Valid Image files only please! (.png, .jpg, .jpeg, or .gif)";
}
}
It could be something as simple as a file overwrite conflict. There are many dangerous bugs in this code, however, and it's not using RAM very efficiently.
I would suggest a different approach (using the ImageResizer NuGet package):
var j = new ImageJob(fuSample,"~/imgs/users/<guid>.<ext>",
new ResizeSettings("maxwidth=128;maxheight=128"));
j.Build();
string imageUrl = PathUtils.GuessVirtualPath(j.FinalPath)

Not able to display an image in repeater control for [thumbnail images]

i have imgae path in datatable[id, path] now this would a value like
ex: id path
1 F:\R&D\RD\RD\Images\a1.JPG;
2 F:\R&D\RD\RD\Images\a2.JPG;
3 F:\R&D\RD\RD\Images\a3.JPG;
now these images are in size width*height (1018*768). now i need to convert these images into thumnail
caling the function
**C_Thumbnails(100, "F:\R&D\RD\RD\Images\a1.JPG", "F:\R&D\RD\RD\Images]thum.jpg")**
public static void C_Thumbnails(int size, string FilePath, string ThumbPath)
{
System.Drawing.Image image = System.Drawing.Image.FromFile(FilePath);
try
{
int thumbHeight, thumbWidth;
decimal h = image.Height;
decimal w = image.Width;
if (image.Height > image.Width)
{
thumbHeight = size;
decimal tWidth = (w / h) * thumbHeight;
thumbWidth = Convert.ToInt32(tWidth);
}
else
{
thumbWidth = size;
decimal tHeight = (h / w) * thumbWidth;
thumbHeight = Convert.ToInt32(tHeight);
}
System.Drawing.Image thumbnailImage = image.GetThumbnailImage(thumbWidth, thumbHeight, null, IntPtr.Zero);
image.Dispose();
thumbnailImage.Save(ThumbPath, System.Drawing.Imaging.ImageFormat.Jpeg);
}
catch (Exception ex)
{
image.Dispose();
throw ex;
}
}
like this i am coverting into thumbnail image. but here i am saving the thumbnail image under the path F:\R&D\RD\RD\Images\thum.jpg .
so is there any way without saving the thumbnail in the disk and how to bind the new thumbnail image in the repeater control and i need to show image there. but if once user clicks on the thumnail image a orignal image should pop up.
if any one have did this functionlity any where let me know
working on this solution from past 2 days.
any help would be greatly appreciated
now after changing code
like this
public void ProcessRequest(HttpContext context)
{
string imageid = context.Request.Params["ImageID"];
string thumbnail = context.Request.Params["thumbnail"];
SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString);
connection.Open();
SqlCommand command = new SqlCommand("select Image from Image where ImageID=" + imageid, connection);
SqlDataReader dr = command.ExecuteReader();
dr.Read();
string filePath = dr["image"].ToString();
dr.Close();
if (!System.IO.File.Exists(filePath))
{
//you have a problem
return;
}
if (context.Request.Params["thumbnail"] == "true")
{
//TODO: the thumbnail
// Image thumbnailImage = originalImage.GetThumbnailImage to generate thumbnail then
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "image/" + format;
thumbnailImage.Save(Response.OutputStream, imageFormat);
thumbnailImage.Dispose();
}
else
{ //stream directly the image fromdisk
System.IO.FileStream fs = System.IO.File.OpenRead(filepath);
const int ChunkSize = 10000;
Byte[] buffer = new Byte[ChunkSize];
long dataLengthToRead = fs.Length;
while (dataLengthToRead > 0)
{
int lengthRead = fs.Read(buffer, 0, ChunkSize);
Response.OutputStream.Write(buffer, 0, lengthRead);
System.Web.HttpContext.Current.Response.Flush();
dataLengthToRead = dataLengthToRead - lengthRead;
}
fs.Close();
}
}
}
in repeater control i have added this line of code
','_blank','toolbar=no,menubar=no'))" > '/>
my thumbnail image is not displayed still but once i click my thumbnail image i am able to see the entire image in new pop up
You should use a Photo Image Handler to serve the pages from your disk to the clients.
Then in the repeater control
<a href="ImageHandler.ashx?thumbnail=false&id='<%# Eval("ID")%>'>
<img src="ImageHandler.ashx?thumbnail=true&id='<%# Eval("ID")%>' border='0'/>
</a>
The ideea is not to pass in the actual path/name of the file, but the ID of the item you wish to view. Then the handler will:
public void ProcessRequest(System.Web.HttpContext context)
{
string filePath = //TODO: Get File Path from ItemID = context.Request.Params["id"]
if (!System.IO.File.Exists(filePath))
{
//you have a problem
return;
}
if(context.Request.Params["thumbnail"]=="true")
{
//TODO: the thumbnail
// Image thumbnailImage = originalImage.GetThumbnailImage to generate thumbnail then
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "image/" + format;
thumbnailImage.Save(Response.OutputStream, imageFormat);
thumbnailImage.Dispose();
} else
{ //stream directly the image fromdisk
System.IO.FileStream fs = System.IO.File.OpenRead(filepath);
const int ChunkSize = 10000;
Byte[] buffer = new Byte[ChunkSize];
long dataLengthToRead = fs.Length;
while (dataLengthToRead > 0)
{
int lengthRead = fs.Read(buffer, 0, ChunkSize);
Response.OutputStream.Write(buffer, 0, lengthRead);
System.Web.HttpContext.Current.Response.Flush();
dataLengthToRead = dataLengthToRead - lengthRead;
}
fs.Close();
}
}

Resources