还记得前段时间的一篇文章写了"使用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
2
Bitmap myBitmap;
//
建立位图
3
ImageCodecInfo myImageCodecInfo;
4
Encoder myEncoder;
//
这个是重点类,
5
EncoderParameter myEncoderParameter;
6
EncoderParameters myEncoderParameters;
7
myBitmap
=
new
Bitmap( Server.MapPath(
"
a.bmp
"
) );
8
//
请注意这里的myImageCodecInfo声名..可以修改为更通用的.看后面
9
ImageCodecInfo myImageCodecInfo
=
ImageCodecInfo.GetImageEncoders()[
0
];
10
myEncoder
=
Encoder.Quality;
11
myEncoderParameters
=
new
EncoderParameters(
1
);
12
//
在这里设置图片的质量等级为95L.
13
myEncoderParameter
=
new
EncoderParameter(myEncoder,
95L
);
14
myEncoderParameters.Param[
0
]
=
myEncoderParameter;
//
将构建出来的EncoderParameter类赋给EncoderParameters数组
15
myBitmap.Save(Server.MapPath(
"
ok.jpg
"
), myImageCodecInfo, myEncoderParameters);
//
保存图片
16
myEncoderParameter.Dispose();
17
myEncoderParameters.Dispose();
18
myBitmap.Dispose();
对于这个ImageCodecInfo myImageCodecInfo = ImageCodecInfo.GetImageEncoders()[0];的设置,也可以这么写.比较通用:
1
private
static
ImageCodecInfo GetEncoderInfo(String mimeType)
2
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
3
int j;
4
ImageCodecInfo[] encoders;
5
encoders = ImageCodecInfo.GetImageEncoders();
6
for(j = 0; j < encoders.Length; ++j)
7![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
8
if(encoders[j].MimeType == mimeType)
9
return encoders[j];
10
}
11
return null;
12
}
13
![None.gif](/Images/OutliningIndicators/None.gif)
14
//
调用的时候这么做..
15
myImageCodecInfo
=
GetEncoderInfo(
"
image/jpeg
"
);
16
![None.gif](/Images/OutliningIndicators/None.gif)
17
//
************* 如果想知道ImageCodecInfo中的其他参数,可以做如下循环,得到结果 ******************
18
19
int
j;
20
ImageCodecInfo[] encoders;
21
encoders
=
ImageCodecInfo.GetImageEncoders();
22
for
(j
=
0
; j
<
encoders.Length;
++
j)
23
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
24
Response.Write( encoders[j].MimeType + "<br>") ;
25
}
26
通过上面的设置,生成的图片效果非常不错,而最重要的是你可以通过增加EncoderParameters数组的维数来做到非常多的效果,比如,给图片整体加亮,减淡等特殊处理..