我现在要处理一系列png图片,初始尺寸为201*201,大小都只有600多字节。因为图片的右边和下边都有一个多余的白色像素,现在用C#实现去除多余像素的功能:
1、我用Bitmap类,实例化某一图片。
2、开始的时候,我得到200*200的Bitmap对象后,直接用Save(String),或是Save(String,PixelFormat)保存为png图片,结果发现得到的图片都有1.2k大,是原来的两倍。
3、后来我想用Save(String,ImageCodecInfo,EncoderParameters)方法进行保存。假设原始png图片的Bitmap对象为SourceImage,现在通过SourceImage的GetEncoderParameterlist方法获得EncoderParameters对象时总是报出(“FileNotFound”)的错误,在GetEncoderParameterlist方法中无论通过Encoder.Guid传入GUIDe对象,还是通过ImageCodeInfo.Clsid传入都报出同样的错误。
Encoder sourceImageEncoder=Encoder.Compression(或者是其他如Quality等)
ImageCodecInfo pngImageCodecInfo=GetImageCodecInfo("image/png")EncoderParameters=sourceImage.GetEncoderParameterlist(sourceImageEncoder.Guid)或者EncoderParameters=sourceImage.GetEncoderParameterlist(pngImageCodecInfo.Clsid)到报出“FileNotFound”的错误。请大家帮忙解决

解决方案 »

  1.   

    是不支持png呢,还是具体哪里没有发现原因
      

  2.   

    原因很简单,因为PNG格式去除了很多不需要的相素
    比如说白色,PNG将白色部分去除掉了,并且是严重压缩.
    再者,处理图片一般是用C、C++写的,用C#写的话,无形中增大也是可以理解的,毕竟C#比它们更高级你可以找一个FireWorks 试一试,哪怕是用Windows画板重新保存一下,它就利马变大...
      

  3.   

     //画布
                Bitmap bmp = new Bitmap(170, 100);            Graphics g = Graphics.FromImage(bmp);
                g.Clear(Color.Gray);//背景色
                //字体              Font newFont = new Font("宋体", 36);
                //画笔
                SolidBrush colorBrush = new SolidBrush(Color.Black);//字为黑色的、保存后背景也就变黑了
                //内容(名字)
                string text = "嘿嘿";
                //绘画
                g.DrawString(text, newFont, colorBrush, new PointF(0, 30));
                //清除该页输出缓存,设置该页无缓存 
                Response.Buffer = true;
                Response.ExpiresAbsolute = System.DateTime.Now.AddMilliseconds(0);
                Response.Expires = 0;
                Response.CacheControl = "no-cache";
                Response.AppendHeader("Pragma", "No-Cache");
                //将验证码图片写入内存流,并将其以 "image/png" 格式输出 
                bmp.MakeTransparent(System.Drawing.Color.Gray);
                MemoryStream ms = new MemoryStream();
                try
                {
                    bmp.Save(ms, ImageFormat.Png);                Response.ClearContent();
                   
                    Response.ContentType = "image/png";                Response.BinaryWrite(ms.ToArray());
                }
                finally
                {
                    //显式释放资源 
                    bmp.Dispose();
                    g.Dispose();            }