2008-10-31 102 views
33

ASP.NET图片上传我有一个aspx页面,将图像上传到服务器的硬盘从客户端PC与调整大小

但现在我需要改变我的节目以这样一种方式,它可以让我调整图像大小同时上传。

有没有人有任何想法呢?我无法找到这样的属性/方法输入文件服务器控制

任何一个在那里指导我?

+2

如何从 “服务器”, “上传” 到 “客户”? – ine 2008-10-31 18:34:38

+4

我建议使用自由和开源库@ [图像大小调整在.NET](http://imageresizingin.net/)执行此操作在一个单一的代码行。其他的答案是(目前)除一个或多个[常见的陷阱]的(http://nathanaeljones.com/163/20-image-resizing-pitfalls/)。 – 2011-04-25 09:10:38

+0

ImageBuilder.Current.Build(HttpPostedFile f,string destinationFilename,new ResizeSettings(“maxwidth = 200&maxheight = 200”)); – 2011-04-25 10:45:03

回答

5

由于在执行任何图像转换之前您需要具有完整图像,因此您将无法调整“实时”。然而,上传完成后,你显示任何结果,以您的用户之前,你可以使用这个基本的图片大小,我已经在一对夫妇的我的应用程序现在使用的方法:

''' <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 
14

一旦该文件已被保存到服务器,你可以使用这样的代码来调整大小。此代码将处理调整大小的长宽比。

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; 
} 
0
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; 
    } 
} 

它使用一个FileUpload和一个FormView插入。然后我使用System.Drawing.Imaging中提供的GetThumnailImage()方法。您可以输入任何宽度和高度值,并相应地缩小/拉伸。

uploadedimage.GetThumbnailImage(W, H, myCallback, IntPtr.Zero); 

希望这会有所帮助。

0

您可以在使用ActiveX控件发送到服务器之前调整大小。有一个免费的ASP.net图像上传组件(我相信这是,Facebook的实际使用同一个)可以在这里找到:

http://forums.aurigma.com/yaf_postst2145_Image-Uploader-ASPNET-Control.aspx

让我知道,如果它的作品,我想在实现它我在这里工作。

编辑:看起来像该对象的包装是免费的,但实际的组件本身将运行您$ 200。我确认这是Facebook使用的相同组件。

2

你需要使用WebClient类下载远程图像。

之后,那么你可以调整它的大小...使用的DrawImage,不GetThumbnailImage。确保你处理你的位图和图形句柄..(使用{}使用)。将所有质量设置设置为高。

你可能想看看source code for my popular image resizer第一...这将帮助你避免一些常见的问题区域。

1
//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 [email protected] 
1

要调整下来的图像,并获得更小的尺寸只是让下面

bmpOut = new Bitmap(lnNewWidth, lnNewHeight, **System.Drawing.Imaging.PixelFormat.Format24bppRgb**); 

    Graphics g = Graphics.FromImage(bmpOut); 

为你改变一组以上的IMAGEM到Format24bppRgb的PixelFormat。

,当你保存文件,你设置的imageformat也。像这样:

bmpOut.Save(PathImage, System.Drawing.Imaging.ImageFormat.Jpeg); 
1

你可以使用它,它为我做了一件漂亮的工作。但它不适合我处理低分辨率图像。谢天谢地,我倒在其中许多人身上。刚刚发的图像byte[]和预期输出,你会好到哪里去。

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; 
} 
-1
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!"; 
    } 
} 
0

上传图像文件由ASP.NET 4.0客户端回调执行。如果你不熟悉的客户端回调那么我建议你看看ASP.Net AJAX Control Toolkit的AsyncFileUpload控制,而不在ASP.Net Web页或ASP.Net AJAX更新面板刷新页面或回传。只要用户使用文件字段控件选择文件,就会触发回调。

3

这是我怎么没在我的项目,根据您的病情(高/宽)你可以改变参数,即(MaxHeight)

查看博客文章:How to Resize image while uploading in asp.net using c#

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; 
     } 

开按钮点击:

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"); 
     } 
    } 
} 
3

如何调整&上传图片只为.JPG扩展:
在upload.aspx页

<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." /> 

而且upload.aspx.cs
对于调整

/// <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; 
      } 
     } 

和Button1_Click事件

 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 
       } 
      } 
     } 

谢谢...

0
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; }