在写一个多张图片拼合的程序时,遇到个问题,生成后的PNG图高达370多KB,任务需求里要求必须在100KB左右,我试了Graphics里的几个属性,输出的图片还是370KB,小弟学艺不精,请各位指点下。
附上代码:Image Idol_Bg = Image.FromFile(pde.Idol_Bg);//背景图片                Image Idol_Face = Image.FromFile(pde.Idol_Face);//偶像脸图层                Image Idol_Hair = Image.FromFile(pde.Idol_Hair);//偶像头发图层                Image Idol_Eyes = Image.FromFile(pde.Idol_Eyes);//偶像眼睛图层                Image Idol_Mouth = Image.FromFile(pde.Idol_Mouth);//偶像嘴巴图层                Graphics gs = Graphics.FromImage(Idol_Bg);                gs.SmoothingMode = SmoothingMode.AntiAlias;
                gs.CompositingQuality = CompositingQuality.HighSpeed;
                gs.InterpolationMode = InterpolationMode.Bilinear;
                //gs.Clear(Color.Transparent);                gs.DrawImage(Idol_Face, new System.Drawing.Point(0, 0));
                gs.DrawImage(Idol_Hair, new System.Drawing.Point(0, 0));
                gs.DrawImage(Idol_Eyes, new System.Drawing.Point(0, 0));
                gs.DrawImage(Idol_Mouth, new System.Drawing.Point(0, 0));                gs.DrawString("Photo By Yzone", new System.Drawing.Font("宋体", 18), System.Drawing.Brushes.Black, new System.Drawing.PointF(1,1));                Idol_Bg.Save(HttpContext.Current.Server.MapPath("images/PaperDol/"+pde.Idol_Id+"_Big.png"),ImageFormat.Png);
                Idol_Face.Dispose();
                Idol_Hair.Dispose();
                Idol_Eyes.Dispose();
                Idol_Eyes.Dispose();
                Idol_Mouth.Dispose();
                Idol_Bg.Dispose();
                gs.Dispose();

解决方案 »

  1.   

    可以考试生产文件的缩略图,当然这样会损失一定的图像质量。/**//**//// <summary>
             /// 生成缩略图
             /// </summary>
             /// <param name="originalImagePath">源图路径(物理路径)</param>
             /// <param name="thumbnailPath">缩略图路径(物理路径)</param>
             /// <param name="width">缩略图宽度</param>
             /// <param name="height">缩略图高度</param>
             /// <param name="mode">生成缩略图的方式</param>    
             public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode)
             {
                 Image originalImage = Image.FromFile(originalImagePath);
                
                 int towidth = width;
                 int toheight = height;
            
                 int x = 0;
                 int y = 0;
                 int ow = originalImage.Width;
                 int oh = originalImage.Height;                     switch (mode)
                 {        
                     case "HW"://指定高宽缩放(可能变形)                
                         break;
                     case "W"://指定宽,高按比例                    
                         toheight = originalImage.Height * width/originalImage.Width;
                         break;
                     case "H"://指定高,宽按比例
                         towidth = originalImage.Width * height/originalImage.Height;                    
                         break;        
                     case "Cut"://指定高宽裁减(不变形)                
                         if((double)originalImage.Width/(double)originalImage.Height > (double)towidth/(double)toheight)
                         {
                             oh = originalImage.Height;
                             ow = originalImage.Height*towidth/toheight;
                             y = 0;
                             x = (originalImage.Width - ow)/2;
                         }
                         else
                         {
                             ow = originalImage.Width;
                             oh = originalImage.Width*height/towidth;
                             x = 0;
                             y = (originalImage.Height - oh)/2;
                         }
                         break;                    
                     default :
                         break;
                 }    
                
                 //新建一个bmp图片
                 Image bitmap = new System.Drawing.Bitmap(towidth,toheight);             //新建一个画板
                 Graphics g = System.Drawing.Graphics.FromImage(bitmap);             //设置高质量插值法
                 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;             //设置高质量,低速度呈现平滑程度
                 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;             //清空画布并以透明背景色填充
                 g.Clear(Color.Transparent);                     //在指定位置并且按指定大小绘制原图片的指定部分
                 g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight), 
                     new Rectangle(x, y, ow,oh),
                     GraphicsUnit.Pixel);             try
                 {            
                     //以jpg格式保存缩略图
                     bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
                 }
                 catch(System.Exception e)
                 {
                     throw e;
                 }
                 finally
                 {
                     originalImage.Dispose();
                     bitmap.Dispose();                        
                     g.Dispose();
                 }
             }
      

  2.   

    生成PNG图片,貌似不能压缩太多。
      

  3.   

     图像压缩比例是可以控制的你百度一下。
     System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)100)