• GDI改图片保存的图片质量


    2009-04-05 16:21

    SmoothingMode.HighQuality,CompositingQuality.HighQuality,TextRenderingHint.ClearTypeGridFit等属性,使得生成的图片质量有所提高.但是默认值不能满足我们的需求.而默认的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;  //建立位图         
    3ImageCodecInfo myImageCodecInfo;
    4Encoder myEncoder;//这个是重点类,
    5EncoderParameter myEncoderParameter;
    6EncoderParameters 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);//保存图片
    16myEncoderParameter.Dispose();
    17myEncoderParameters.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;
    20ImageCodecInfo[] encoders;
    21encoders = ImageCodecInfo.GetImageEncoders();
    22for(j = 0; j < encoders.Length; ++j)
    23{
    24     Response.Write( encoders[j].MimeType + "<br>") ;
    25}

    26

  • 相关阅读:
    笔记04_正确使用Heterogeneous元件
    java网络通信:伪异步I/O编程(PIO)
    java网络通信:异步非阻塞I/O (NIO)
    lua源码学习篇二:语法分析
    lua源码学习篇三:赋值表达式解析的流程
    java网络通信:netty
    lua源码学习篇一:环境部署
    lua源码学习篇四:字节码指令
    java网络通信:同步阻塞式I/O模型(BIO)
    前端项目开发流程
  • 原文地址:https://www.cnblogs.com/itecho/p/2013820.html
Copyright © 2020-2023  润新知