使用GDI+绘制高质量图和字体(2)

     还记得前段时间的一篇文章写了"使用GDI+绘制高质量图和字体",里面用到了SmoothingMode.HighQuality,CompositingQuality.HighQuality,TextRenderingHint.ClearTypeGridFit等属性,使得生成的图片质量有所提高..但是上周在单位的"web大头贴"里生成图片的时候,遇到了一个小问题,就是在生成Jpeg图片的时候,默认的质量有模糊的效果,无论如何调整属性都是无法达到满意的效果..查了MSDN.找到解决的办法,并且还发现了块新的桃源胜地..

      问题的地点经过筛选,确定是出在图片保存时候,BitMap.Save();,按照一般的程序流程,只需简单的BitMap.Save(string Path,ImageFormat)就可以了.但是默认值不能满足我们的需求.而默认的jpeg保存质量应该是在60左右.这个时候我们需要修改默认值..修改的方法就是设置定义ImageCodecInfo类和EncoderParameters类,具体的代码如下:ImageCodecInfo类则指定需要保存的格式,EncoderParameters则是EncoderParameter类的集合数组,在EncoderParameter类中使用System.Drawing.Imaging.Encoder类来制定需要呈现的方式和各种参数,例如图片质量参数,扫描方法参数,色度表参数,压缩参数,颜色深度等等.到此,大家应该明白修改图片质量的步骤和方法了.主要就是对System.Drawing.Imaging.Encoder设置,然后通过System.Drawing.Imaging.Encoder构造出来EncoderParameter类,将EncoderParameter传递给EncoderParameters数组,从而得到一个完全符合自己意愿的图片!呵呵,说了一大堆.起始代码很简单.如下:
先引入:
using System;
using System.Drawing;
using System.Drawing.Imaging;

 1 None.gif
 2 None.gifBitmap myBitmap;   // 建立位图         
 3 None.gif ImageCodecInfo myImageCodecInfo;
 4 None.gifEncoder myEncoder; // 这个是重点类,
 5 None.gif EncoderParameter myEncoderParameter;
 6 None.gifEncoderParameters myEncoderParameters;
 7 None.gifmyBitmap  =   new  Bitmap( Server.MapPath( " a.bmp " ) );
 8 None.gif // 请注意这里的myImageCodecInfo声名..可以修改为更通用的.看后面
 9 None.gif ImageCodecInfo myImageCodecInfo  =  ImageCodecInfo.GetImageEncoders()[ 0 ];
10 None.gifmyEncoder  =  Encoder.Quality;
11 None.gifmyEncoderParameters  =   new  EncoderParameters( 1 );
12 None.gif //  在这里设置图片的质量等级为95L.
13 None.gif myEncoderParameter  =   new  EncoderParameter(myEncoder,  95L );
14 None.gifmyEncoderParameters.Param[ 0 =  myEncoderParameter; // 将构建出来的EncoderParameter类赋给EncoderParameters数组
15 None.gif myBitmap.Save(Server.MapPath( " ok.jpg " ), myImageCodecInfo, myEncoderParameters); // 保存图片
16 None.gif myEncoderParameter.Dispose();
17 None.gifmyEncoderParameters.Dispose();
18 None.gifmyBitmap.Dispose();

     对于这个ImageCodecInfo myImageCodecInfo = ImageCodecInfo.GetImageEncoders()[0];的设置,也可以这么写.比较通用:

 1 None.gif private   static  ImageCodecInfo GetEncoderInfo(String mimeType)
 2 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 3InBlock.gif    int j;
 4InBlock.gif    ImageCodecInfo[] encoders;
 5InBlock.gif    encoders = ImageCodecInfo.GetImageEncoders();
 6InBlock.gif    for(j = 0; j < encoders.Length; ++j)
 7ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 8InBlock.gif        if(encoders[j].MimeType == mimeType)
 9InBlock.gif            return encoders[j];
10ExpandedSubBlockEnd.gif    }

11InBlock.gif    return null;
12ExpandedBlockEnd.gif}

13 None.gif
14 None.gif // 调用的时候这么做..
15 None.gif myImageCodecInfo  =  GetEncoderInfo( " image/jpeg " );
16 None.gif
17 None.gif // ************* 如果想知道ImageCodecInfo中的其他参数,可以做如下循环,得到结果 ******************
18 None.gif
19 None.gif int  j;
20 None.gifImageCodecInfo[] encoders;
21 None.gifencoders  =  ImageCodecInfo.GetImageEncoders();
22 None.gif for (j  =   0 ; j  <  encoders.Length;  ++ j) 
23 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
24InBlock.gif    Response.Write( encoders[j].MimeType + "<br>") ;
25ExpandedBlockEnd.gif}

26 None.gif

     通过上面的设置,生成的图片效果非常不错,而最重要的是你可以通过增加EncoderParameters数组的维数来做到非常多的效果,比如,给图片整体加亮,减淡等特殊处理..

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值