asp.net 高质量缩略图

2012-7-12:

 protected void Page_Load(object sender, EventArgs e)
 {
     string OriginalImgPath = @"C:\Users\LHTC\Desktop\ttttimg\ttttimg\imgtt\tt.jpg";
  //   string savepath = Path.ChangeExtension(OriginalImgPath, "jpg");
     string savepath = @"C:\Users\LHTC\Desktop\ttttimg\ttttimg\imgtt\tt1.jpg";
     System.Drawing.Image image = System.Drawing.Image.FromFile(OriginalImgPath);

     //System.Web.HttpPostedFile postedFile=Request.Files[0];
     
//System.Drawing.Image originalImage = System.Drawing.Image.FromStream(postedFile.InputStream, true);  

     SaveJpg(image, savepath, 1578475L);
     Response.Write("ok");
 }

 /// <summary>
 
///  自适应按比例 上传保存
 
/// </summary>
 
/// <param name="OriginalImgPath">上传图片路径</param>
 
/// <param name="SavePath">保存路径</param>
 
/// <param name="Width">缩略图宽</param>
 
/// <param name="Height">缩略图高</param>
 
/// <param name="Quality">质量 75L</param>
 private static void SaveJpg(System.Drawing.Image OriginalImage, string SavePath, int Width, int Height, long Quality)
 {
     var rotatedImage = OriginalImage.Clone() as System.Drawing.Image;
     Size thumbnailSize = GetThumbnailSize(rotatedImage, Width, Height);
     Bitmap newImage = new Bitmap(thumbnailSize.Width, thumbnailSize.Height, PixelFormat.Format24bppRgb);
     newImage.SetResolution(7272);
     using (Graphics gr = Graphics.FromImage(newImage))
     {
         gr.Clear(Color.Transparent);
         gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
         gr.SmoothingMode = SmoothingMode.AntiAlias;
         gr.CompositingQuality = CompositingQuality.HighQuality;
         gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
         gr.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
         using (var attribute = new ImageAttributes())
         {
             attribute.SetWrapMode(WrapMode.TileFlipXY);
             gr.DrawImage(OriginalImage, new Rectangle(new Point(00), thumbnailSize), 00, OriginalImage.Width, OriginalImage.Height, GraphicsUnit.Pixel, attribute);
         }
     }
     ImageCodecInfo myImageCodecInfo = GetEncoderInfo("image/jpeg");
     Encoder myEncoder = Encoder.Quality;
     EncoderParameters myEncoderParameters = new EncoderParameters(1);
     EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, Quality);
     myEncoderParameters.Param[0] = myEncoderParameter;
     newImage.Save(SavePath, myImageCodecInfo, myEncoderParameters);
 }


 //根据长宽自适应 按原图比例缩放 
 private static Size GetThumbnailSize(System.Drawing.Image original, int desiredWidth, int desiredHeight)
 {
     var widthScale = (double)desiredWidth / original.Width;
     var heightScale = (double)desiredHeight / original.Height;
     var scale = widthScale < heightScale ? widthScale : heightScale;
     return new Size
                    {
                        Width = (int)(scale * original.Width),
                        Height = (int)(scale * original.Height)
                    };
 }
 private static ImageCodecInfo GetEncoderInfo(String mimeType)
 {
     int j;
     ImageCodecInfo[] encoders;
     encoders = ImageCodecInfo.GetImageEncoders();
     for (j = 0; j < encoders.Length; ++j)
     {
         if (encoders[j].MimeType == mimeType)
             return encoders[j];
     }
     return null;
 }


 public static void imgSmo(string strPath, string strName, string strType, int i)
    {
        try
        {              
            string path = strPath + strName + strType;
            System.Drawing.Image oImage = System.Drawing.Image.FromFile(path);

            Size imageSize = GetImageSize(oImage,160,70);
            System.Drawing.Imaging.ImageFormat thisFormat = oImage.RawFormat;


            int oWidth = oImage.Width; //原图宽度
              int oHeight = oImage.Height; //原图高度

              Bitmap tImage = new Bitmap(imageSize.Width, imageSize.Height);
            Graphics g = Graphics.FromImage(tImage);
            
            //质量
              g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

            g.Clear(Color.Transparent);
            g.DrawImage(oImage, new Rectangle(0, 0, imageSize.Width, imageSize.Height), new Rectangle(0, 0, oWidth, oHeight), GraphicsUnit.Pixel);
            g.Dispose();

            //JPEG
            System.Drawing.Imaging.EncoderParameters encoderParams = new System.Drawing.Imaging.EncoderParameters();
            long[] quality = new long[1];
            quality[0] = 75;
            System.Drawing.Imaging.EncoderParameter encoderParam = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
            encoderParams.Param[0] = encoderParam;

            System.Drawing.Imaging.ImageCodecInfo[] arrayICI = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
            System.Drawing.Imaging.ImageCodecInfo jpegICI = null;
            for (int x = 0; x < arrayICI.Length; x++)
            {
                if (arrayICI[x].FormatDescription.Equals("JPEG"))
                {
                    jpegICI = arrayICI[x];
                    break;
                }
            }


            string newPath = strPath + strName + i + strType;
  
            if (jpegICI != null)
            {
                tImage.Save(newPath, jpegICI, encoderParams);
            }
            else
            {
                tImage.Save(newPath, thisFormat);
            }


            oImage.Dispose();
            tImage.Dispose();
         
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }

    }





 public static Size GetImageSize(System.Drawing.Image picture,int width,int height)
    {
        Size imageSize=new Size(width,height);//初始化

      
        //按比例缩小放大

         double heightRatio = (double)picture.Height / picture.Width;
        double widthRatio = (double)picture.Width / picture.Height;

        int desiredHeight = imageSize.Height;
        int desiredWidth = imageSize.Width;

        imageSize.Height = desiredHeight;
        if (widthRatio > 0)
            imageSize.Width = Convert.ToInt32(imageSize.Height * widthRatio);

        if (imageSize.Width > desiredWidth)
        {
            imageSize.Width = desiredWidth;
            imageSize.Height = Convert.ToInt32(imageSize.Width * heightRatio);
        }

        return imageSize;
    }






此颜色量化类库的使用,也非常简单:

using (Bitmap bmp = new Bitmap(...))
 {
    OctreeQuantizer quantizer = new OctreeQuantizer ( 255 , 8 ) ;
//两个参数为颜色值,和颜色深度
using ( Bitmap quantized = quantizer.Quantize ( image ) )
        {
Response.ContentType = "image/gif" ;
quantized.Save ( Response.OutputStream , ImageFormat.Gif ) ;
}
}

posted @ 2009-09-17 15:16  曾祥展  阅读(1082)  评论(0编辑  收藏  举报