怎样将8bit的bitmap类对象存储成8bit的jpeg格式?

我的最终解决方案:

参照如上的例子,要实现bitmap类save文件jpeg格式灰度图像时,不是将其按照默认设置保存为24位图像而保存为8位图像的具体方法如下:

 //将8位的灰度图片,保存为8位JPEG图片,默认是存储为24位
  {
                             
      System.Drawing.Imaging.Encoder myEncoder;
      EncoderParameter myEncoderParameter;
      EncoderParameters myEncoderParameters;

                            

 

      ImageCodecInfo myImageCodecInfo =

      ImageCodecInfo.GetImageDecoders()[0];

 

 //设置图像颜色深度参数colordepth为8位,并加入到编码器参数parameters中
      myEncoder = System.Drawing.Imaging.Encoder.ColorDepth;


      myEncoderParameters = new EncoderParameters(1);
      myEncoderParameter = new EncoderParameter(myEncoder, 8);


      myEncoderParameters.Param[0] = myEncoderParameter;


      curBitmap.Save(filename, myImageCodecInfo, myEncoderParameters);


      myEncoderParameter.Dispose();
      myEncoderParameters.Dispose();
        
                        }

参考文章

链接:http://www.cnblogs.com/lixianhuei/archive/2006/03/13/348909.html

 

对于GDI+,在正常的操作,Bitmap-- Graphcis -- DrawImage或者DrawString ,生成图片的话,会产生很多杂点,或者是图片质量不稳定..尤其是在读取图片后,生成缩略图之后,文件会被压缩而失真..

主要原因是因为没有重新设置Graphics的几个属性..

1.Graphics.SmoothingMode属性: 例如SmoothingMode.HighQuality可以产生高质量图片,但是效率低.

2.Graphics.CompositingQuality 属性: 例如:CompositingQuality.HighQuality也是产生高质量图,效率低下.

3.Graphics.InterpolationMode 属性,例如:InterpolationMode.HighQualityBicubic与前两个也是同样的效果.

这三个属性的值都是enum,具体的enum参数可以查看MSDN的说明..在这里就我不赘述..
如果是对图片进行放大,缩小,可以调整Graphics.CompositingQuality Graphics.InterpolationMode 两个属性..如果是图片生成,则可以调整Graphics.SmoothingMode属性..

另外一个问题就是关于文字生成的..按照正常的模式生成的文字,可以很明显的看到文字带有锯齿..解决的办法也是需要修改Graphics的一个属性: Graphics.TextRenderingHint...注意一点,修改TextRenderingHint的话,需要引入System.Drawing.Text,例如:Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;

 经过对这四个属性的修改,操作大部分的图片之后,产生的结果都是比较让人满意的..

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
 2Bitmap myBitmap;  //建立位图         

 3
ImageCodecInfo myImageCodecInfo;
 4Encoder myEncoder;//这个是重点类,

 5
EncoderParameter myEncoderParameter;
 6
EncoderParameters myEncoderParameters;
 7myBitmap = new Bitmap( Server.MapPath("a.bmp"
) );
 8//请注意这里的myImageCodecInfo声名..可以修改为更通用的.看后面

 9ImageCodecInfo myImageCodecInfo = ImageCodecInfo.GetImageEncoders()[0
];
10myEncoder =
 Encoder.Quality;
11myEncoderParameters = new EncoderParameters(1
);
12// 在这里设置图片的质量等级为95L.

13myEncoderParameter = new EncoderParameter(myEncoder, 95L
);
14myEncoderParameters.Param[0= myEncoderParameter;//将构建出来的EncoderParameter类赋给EncoderParameters数组

15myBitmap.Save(Server.MapPath("ok.jpg"), myImageCodecInfo, myEncoderParameters);//保存图片

16
myEncoderParameter.Dispose();
17
myEncoderParameters.Dispose();
18myBitmap.Dispose();

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

 

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

 

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

11    return null
;
12}

13

14//调用的时候这么做..

15myImageCodecInfo = GetEncoderInfo("image/jpeg"
);
16

17//************* 如果想知道ImageCodecInfo中的其他参数,可以做如下循环,得到结果 ******************

18

19int
 j;
20
ImageCodecInfo[] encoders;
21encoders =
 ImageCodecInfo.GetImageEncoders();
22for(j = 0; j < encoders.Length; ++
j) 
23
{
24    Response.Write( encoders[j].MimeType + "<br>"
) ;
25}

26

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值