2012-09-14 84 views
0

我想调整我一般的处理程序中的图像服务器侧将其转换回从数据库中的BLOB的图像之后...这是我处理代码:如何在从BLOB转换图像后调整图像大小?

<%@ WebHandler Language="C#" Class="Image" %> 

using System; 
using System.Web; 
using System.Data; 
using System.Data.SqlClient; 
using System.IO; 

public class Image : IHttpHandler { 

    public void ProcessRequest (HttpContext context) { 
     Guid id = new Guid(context.Request.QueryString["Id"]); 
     int column = 7; 

     if (context.Request.QueryString["img"] == "tbn") 
     { 
      column = 6; 
     } 

     context.Response.ContentType = "image/png"; 
     MemoryStream strm = new MemoryStream(returnImage(id, column)); 
     byte[] buffer = new byte[4096]; 
     int byteSeq = strm.Read(buffer, 0, 4096); 
     while (byteSeq > 0) 
     { 
      context.Response.OutputStream.Write(buffer, 0, byteSeq); 
      byteSeq = strm.Read(buffer, 0, 4096); 
     } 
    } 

    public Byte[] returnImage(Guid id, int column) 
    { 
     SqlConnection sqlCn = new SqlConnection("Data Source=localhost;Initial Catalog=database;User ID=user;Password=password"); 

     string qry = "SELECT * FROM Project WHERE [email protected]"; 
     SqlCommand cmd = new SqlCommand(qry, sqlCn); 
     cmd.Parameters.Add("@id", SqlDbType.UniqueIdentifier).Value = id; 
     sqlCn.Open(); 
     SqlDataReader dr = cmd.ExecuteReader(); 
     dr.Read(); 
     Byte[] ar = (Byte[])(dr[column]); 
     dr.Close(); 
     cmd.Dispose(); 
     sqlCn.Close(); 
     return ar; 
    } 

    public bool IsReusable { 
     get { 
      return false; 
     } 
    } 

} 

看起来应该wheter图像宽度高于其高度,相反,根据设置的高度或宽度和其他值(高度/宽度)应按比例设置,因此它不会被拉伸。

我发现这是什么:http://www.codeproject.com/Articles/25838/A-Simple-Image-Handler

但我真的不知道如何使用它...有什么建议?感谢所有提前的帮助!

回答

0

这可能有点冗长,但它适用于我。给定blob中的内存流,再加上目标宽度和高度尺寸,它将返回一个新的流,其中包含调整大小的图像副本。

public static Stream CreateThumbnail(Stream input, Int32 targetWidth, Int32 targetHeight) 
    { 
     output = new MemoryStream(); 
      using (Bitmap bitmap = new Bitmap(input)) 
      { 
       ImageFormat format = bitmap.RawFormat; 
       Boolean isJpeg = (format.Equals(ImageFormat.Jpeg)); 
       Boolean isPng = (format.Equals(ImageFormat.Png)); 
       Int32 width = bitmap.Width; 
       Int32 height = bitmap.Height; 
       getTargetSizes(out width, out height, bitmap, targetWidth, targetHeight); 
       using (Bitmap thumbnailBitmap = new Bitmap(width, height)) 
       { 
        Graphics G = Graphics.FromImage(thumbnailBitmap); 
        G.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
        G.DrawImage(bitmap, 0, 0, width, height); 
        thumbnailBitmap.SetResolution(72, 72); 
        if (isJpeg) 
        { 
         var codecParams = new EncoderParameters(1); 
         codecParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 80L); 
         ImageCodecInfo[] arrayICI; 
         ImageCodecInfo jpegICI = null; 
         arrayICI = ImageCodecInfo.GetImageEncoders(); 
         for (int i = 0; i < arrayICI.Length; i++) 
         { 
          if (arrayICI[i].FormatDescription.Equals("JPEG")) 
          { 
           jpegICI = arrayICI[i]; 
           break; 
          } 
         } 
         thumbnailBitmap.Save(output, jpegICI, codecParams); 
        } 
        else 
        { 
         thumbnailBitmap.Save(output, ImageFormat.Png); 
        } 
       } 
      } 
     return output; 
    } 

    private static void getTargetSizes(out Int32 targetWidth, out Int32 targetHeight, Bitmap BM, Int32 maxWidth = 150, Int32 maxHeight = 150) 
    { 
     Int32 startWidth = BM.Width; 
     Int32 startHeight = BM.Height; 
     targetWidth = startWidth; 
     targetHeight = startHeight; 
     Boolean resizeByWidth = false; 
     Boolean resizeByHeight = false; 
     if ((maxWidth > 0) && (maxHeight > 0)) 
     { 
      if ((startWidth > maxWidth) || (startHeight > maxHeight)) 
      { 
       if (startHeight <= startWidth) 
       { 
        if(targetWidth > maxWidth) resizeByWidth = true; 
       } 
       else 
       { 
        if(targetHeight > maxHeight) resizeByHeight = true; 
       } 
      } 
     } 
     else if (maxWidth > 0) 
     { 
      // Resize within width only 
      if (startWidth > maxWidth) 
      { 
       if (targetWidth > maxWidth) resizeByWidth = true; 
      } 
     } 
     else if (maxHeight > 0) 
     { 
      // Resize by height only 
      if (startHeight > maxHeight) 
      { 
       if (targetHeight > maxHeight) resizeByHeight = true; 
      } 
     } 
     if (resizeByWidth) 
     { 
      targetWidth = maxWidth; 
      targetHeight = (Int32)(startHeight * ((Decimal)targetWidth/(Decimal)startWidth)); 
     } 
     if (resizeByHeight) 
     { 
      targetHeight = maxHeight; 
      targetWidth = (Int32)(startWidth * ((Decimal)targetHeight/(Decimal)startHeight)); 
     } 
    } 
} 

并且用类似称呼它:

MemoryStream strm = new MemoryStream(returnImage(id, column)); 
strm = CreateThumbnail(strm, 100, 100); 
+0

嗯...这个代码是巨大的:)和非常混乱......我怎么会用这个跟我的代码? – webster69

+0

代码可以变得更紧凑,我会授予你 - 我只是从一个旧项目中抓取它,我没有时间为你重写它。你可以通过调用第一个函数,将它传递给你的内存流,以及想要调整图像大小的宽度和高度,并将结果放回到内存流中来使用它。我会添加一个例子。 – JcFx