2010-05-11 197 views
83

我想從文件位置的gridview中顯示縮略圖圖像。如何生成.jpeg文件? 我使用C#語言,asp.net創建縮略圖

+5

[ImageResizer](http://imageresizing.net)是一個服務器安全庫,旨在完全滿足您的需求。與GetThumbnailImage不同,它可以產生高質量的結果,與代碼示例不同,它不會像篩子那樣泄漏內存。你現在可能並不在意,但是在覈心轉儲時你將會在幾個月時間內屈膝。 – 2013-02-12 14:27:32

+1

http://www.codeproject.com/Articles/20971/Thumbnail-Images-in-GridView-using-C – Freelancer 2013-05-24 10:21:50

回答

198

你必須使用GetThumbnailImage方法在Image類:

https://msdn.microsoft.com/en-us/library/8t23aykb%28v=vs.110%29.aspx

這裏有一個粗略的例子,它接受一個圖像文件,然後從它使一個縮略圖,然後將其保存回磁盤。

Image image = Image.FromFile(fileName); 
Image thumb = image.GetThumbnailImage(120, 120,()=>false, IntPtr.Zero); 
thumb.Save(Path.ChangeExtension(fileName, "thumb")); 
+3

@ktsixit - 它在System.Drawing命名空間(在System.Drawing.dll中) – 2011-01-13 09:33:28

+12

你是認真的嗎?已經嵌入縮略圖的圖像GetThumbnailImage會產生可怕的結果。 [不要'犯這些錯誤],(請http://nathanaeljones.com/163/20-image-resizing-pitfalls/)。 http://imageresizing.net是開源的,免費,快速,並會給你高質量的結果。 – 2012-01-09 21:05:46

+3

它一般只能用於JPG圖片。如果您嘗試像這樣調整PNG圖像的大小,則會出現此錯誤。 – HBlackorby 2015-06-04 21:45:27

22

下面的代碼將在比例寫的圖像響應,您可以修改代碼以實現你的目的:

public void WriteImage(string path, int width, int height) 
{ 
    Bitmap srcBmp = new Bitmap(path); 
    float ratio = srcBmp.Width/srcBmp.Height; 
    SizeF newSize = new SizeF(width, height * ratio); 
    Bitmap target = new Bitmap((int) newSize.Width,(int) newSize.Height); 
    HttpContext.Response.Clear(); 
    HttpContext.Response.ContentType = "image/jpeg"; 
    using (Graphics graphics = Graphics.FromImage(target)) 
    { 
     graphics.CompositingQuality = CompositingQuality.HighSpeed; 
     graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
     graphics.CompositingMode = CompositingMode.SourceCopy; 
     graphics.DrawImage(srcBmp, 0, 0, newSize.Width, newSize.Height); 
     using (MemoryStream memoryStream = new MemoryStream()) 
     { 
      target.Save(memoryStream, ImageFormat.Jpeg); 
      memoryStream.WriteTo(HttpContext.Response.OutputStream); 
     } 
    } 
    Response.End(); 
} 
+0

我給了我的本地文件路徑在字符串路徑。它返回「不支持給定的路徑格式」。 – 2018-03-01 05:09:31

+0

我給了這樣的... var path = @「C:\ Users \ Gopal \ Desktop \ files.jpeg」; 位圖srcBmp =新的位圖(路徑); – 2018-03-01 05:10:51

0

下面是如何創建一個更小的圖像的完整的例子(縮略圖)。這段代碼調整圖像的大小,在需要時將其旋轉(如果手機垂直放置),如果要創建方形拇指則填充圖像。這段代碼創建了一個JPEG,但可以輕鬆修改其他文件類型。即使圖像小於允許的最大尺寸,圖像仍會被壓縮,並會更改分辨率以創建相同dpi和壓縮級別的圖像。

using System; 
using System.Drawing; 
using System.Drawing.Drawing2D; 
using System.Drawing.Imaging; 
using System.IO; 

//set the resolution, 72 is usually good enough for displaying images on monitors 
float imageResolution = 72; 

//set the compression level. higher compression = better quality = bigger images 
long compressionLevel = 80L; 


public Image resizeImage(Image image, int maxWidth, int maxHeight, bool padImage) 
{ 
    int newWidth; 
    int newHeight; 

    //first we check if the image needs rotating (eg phone held vertical when taking a picture for example) 
    foreach (var prop in image.PropertyItems) 
    { 
     if (prop.Id == 0x0112) 
     { 
      int orientationValue = image.GetPropertyItem(prop.Id).Value[0]; 
      RotateFlipType rotateFlipType = getRotateFlipType(orientationValue); 
      image.RotateFlip(rotateFlipType); 
      break; 
     } 
    } 

    //apply the padding to make a square image 
    if (padImage == true) 
    { 
     image = applyPaddingToImage(image, Color.Red); 
    } 

    //check if the with or height of the image exceeds the maximum specified, if so calculate the new dimensions 
    if (image.Width > maxWidth || image.Height > maxHeight) 
    { 
     double ratioX = (double)maxWidth/image.Width; 
     double ratioY = (double)maxHeight/image.Height; 
     double ratio = Math.Min(ratioX, ratioY); 

     newWidth = (int)(image.Width * ratio); 
     newHeight = (int)(image.Height * ratio); 
    } 
    else 
    { 
     newWidth = image.Width; 
     newHeight = image.Height; 
    } 

    //start the resize with a new image 
    Bitmap newImage = new Bitmap(newWidth, newHeight); 

    //set the new resolution 
    newImage.SetResolution(imageResolution, imageResolution); 

    //start the resizing 
    using (var graphics = Graphics.FromImage(newImage)) 
    { 
     //set some encoding specs 
     graphics.CompositingMode = CompositingMode.SourceCopy; 
     graphics.CompositingQuality = CompositingQuality.HighQuality; 
     graphics.SmoothingMode = SmoothingMode.HighQuality; 
     graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
     graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 

     graphics.DrawImage(image, 0, 0, newWidth, newHeight); 
    } 

    //save the image to a memorystream to apply the compression level 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     EncoderParameters encoderParameters = new EncoderParameters(1); 
     encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, compressionLevel); 

     newImage.Save(ms, getEncoderInfo("image/jpeg"), encoderParameters); 

     //save the image as byte array here if you want the return type to be a Byte Array instead of Image 
     //byte[] imageAsByteArray = ms.ToArray(); 
    } 

    //return the image 
    return newImage; 
} 


//=== image padding 
public Image applyPaddingToImage(Image image, Color backColor) 
{ 
    //get the maximum size of the image dimensions 
    int maxSize = Math.Max(image.Height, image.Width); 
    Size squareSize = new Size(maxSize, maxSize); 

    //create a new square image 
    Bitmap squareImage = new Bitmap(squareSize.Width, squareSize.Height); 

    using (Graphics graphics = Graphics.FromImage(squareImage)) 
    { 
     //fill the new square with a color 
     graphics.FillRectangle(new SolidBrush(backColor), 0, 0, squareSize.Width, squareSize.Height); 

     //put the original image on top of the new square 
     graphics.DrawImage(image, (squareSize.Width/2) - (image.Width/2), (squareSize.Height/2) - (image.Height/2), image.Width, image.Height); 
    } 

    //return the image 
    return squareImage; 
} 


//=== get encoder info 
private ImageCodecInfo getEncoderInfo(string mimeType) 
{ 
    ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders(); 

    for (int j = 0; j < encoders.Length; ++j) 
    { 
     if (encoders[j].MimeType.ToLower() == mimeType.ToLower()) 
     { 
      return encoders[j]; 
     } 
    } 

    return null; 
} 


//=== determine image rotation 
private RotateFlipType getRotateFlipType(int rotateValue) 
{ 
    RotateFlipType flipType = RotateFlipType.RotateNoneFlipNone; 

    switch (rotateValue) 
    { 
     case 1: 
      flipType = RotateFlipType.RotateNoneFlipNone; 
      break; 
     case 2: 
      flipType = RotateFlipType.RotateNoneFlipX; 
      break; 
     case 3: 
      flipType = RotateFlipType.Rotate180FlipNone; 
      break; 
     case 4: 
      flipType = RotateFlipType.Rotate180FlipX; 
      break; 
     case 5: 
      flipType = RotateFlipType.Rotate90FlipX; 
      break; 
     case 6: 
      flipType = RotateFlipType.Rotate90FlipNone; 
      break; 
     case 7: 
      flipType = RotateFlipType.Rotate270FlipX; 
      break; 
     case 8: 
      flipType = RotateFlipType.Rotate270FlipNone; 
      break; 
     default: 
      flipType = RotateFlipType.RotateNoneFlipNone; 
      break; 
    } 

    return flipType; 
} 


//== convert image to base64 
public string convertImageToBase64(Image image) 
{ 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     //convert the image to byte array 
     image.Save(ms, ImageFormat.Jpeg); 
     byte[] bin = ms.ToArray(); 

     //convert byte array to base64 string 
     return Convert.ToBase64String(bin); 
    } 
} 

對於asp.net用戶如何上傳文件,調整其大小和在頁面上顯示的結果一個小例子。

//== the button click method 
protected void Button1_Click(object sender, EventArgs e) 
{ 
    //check if there is an actual file being uploaded 
    if (FileUpload1.HasFile == false) 
    { 
     return; 
    } 

    using (Bitmap bitmap = new Bitmap(FileUpload1.PostedFile.InputStream)) 
    { 
     try 
     { 
      //start the resize 
      Image image = resizeImage(bitmap, 256, 256, true); 

      //to visualize the result, display as base64 image 
      Label1.Text = "<img src=\"data:image/jpg;base64," + convertImageToBase64(image) + "\">"; 

      //save your image to file sytem, database etc here 
     } 
     catch (Exception ex) 
     { 
      Label1.Text = "Oops! There was an error when resizing the Image.<br>Error: " + ex.Message; 
     } 
    } 
}