C# System.Drawing.Imaging下的 Encoder 的一些属性

转载 2012年03月29日 09:57:46

Quality:

using System;
using System.Drawing;
using System.Drawing.Imaging;
class Example_SetJPEGQuality
{
    public static void Main()
    {
        Bitmap myBitmap;
        ImageCodecInfo myImageCodecInfo;
        Encoder myEncoder;
        EncoderParameter myEncoderParameter;
        EncoderParameters myEncoderParameters;

        // Create a Bitmap object based on a BMP file.
        myBitmap = new Bitmap("Shapes.bmp");

        // Get an ImageCodecInfo object that represents the JPEG codec.
        myImageCodecInfo = GetEncoderInfo("image/jpeg");

        // Create an Encoder object based on the GUID

        // for the Quality parameter category.
        myEncoder = Encoder.Quality;

        // Create an EncoderParameters object.

        // An EncoderParameters object has an array of EncoderParameter

        // objects. In this case, there is only one

        // EncoderParameter object in the array.
        myEncoderParameters = new EncoderParameters(1);

        // Save the bitmap as a JPEG file with quality level 25.
        myEncoderParameter = new EncoderParameter(myEncoder, 25L);
        myEncoderParameters.Param[0] = myEncoderParameter;
        myBitmap.Save("Shapes025.jpg", myImageCodecInfo, myEncoderParameters);

        // Save the bitmap as a JPEG file with quality level 50.
        myEncoderParameter = new EncoderParameter(myEncoder, 50L);
        myEncoderParameters.Param[0] = myEncoderParameter;
        myBitmap.Save("Shapes050.jpg", myImageCodecInfo, myEncoderParameters);

        // Save the bitmap as a JPEG file with quality level 75.
        myEncoderParameter = new EncoderParameter(myEncoder, 75L);
        myEncoderParameters.Param[0] = myEncoderParameter;
        myBitmap.Save("Shapes075.jpg", myImageCodecInfo, myEncoderParameters);
    }
    private static ImageCodecInfo GetEncoderInfo(String mimeType)
    {
        int j;
        ImageCodecInfo[] encoders;
        encoders = ImageCodecInfo.GetImageEncoders();
        for(j = 0; j < encoders.Length; ++j)
        {
            if(encoders[j].MimeType == mimeType)
                return encoders[j];
        }
        return null;
    }
}

ColorDepth:

using System;
using System.Drawing;
using System.Drawing.Imaging;
class Example_SetColorDepth
{
    public static void Main()
    {
        Bitmap myBitmap;
        ImageCodecInfo myImageCodecInfo;
        Encoder myEncoder;
        EncoderParameter myEncoderParameter;
        EncoderParameters myEncoderParameters;

        // Create a Bitmap object based on a BMP file.
        myBitmap = new Bitmap(@"C:\Documents and Settings\All Users\Documents\My Music\music.bmp");

        // Get an ImageCodecInfo object that represents the TIFF codec.
        myImageCodecInfo = GetEncoderInfo("image/tiff");

        // Create an Encoder object based on the GUID
        // for the ColorDepth parameter category.
        myEncoder = Encoder.ColorDepth;

        // Create an EncoderParameters object.
        // An EncoderParameters object has an array of EncoderParameter
        // objects. In this case, there is only one
        // EncoderParameter object in the array.
        myEncoderParameters = new EncoderParameters(1);

        // Save the image with a color depth of 24 bits per pixel.
        myEncoderParameter =
            new EncoderParameter(myEncoder, 24L);
        myEncoderParameters.Param[0] = myEncoderParameter;
        myBitmap.Save("Shapes24bpp.tiff", myImageCodecInfo, myEncoderParameters);
    }

    private static ImageCodecInfo GetEncoderInfo(String mimeType)
    {
        int j;
        ImageCodecInfo[] encoders;
        encoders = ImageCodecInfo.GetImageEncoders();
        for(j = 0; j < encoders.Length; ++j)
        {
            if(encoders[j].MimeType == mimeType)
                return encoders[j];
        }
        return null;
    }
}

Compression:

using System;
using System.Drawing;
using System.Drawing.Imaging;
class Example_SetTIFFCompression
{
    public static void Main()
    {
        Bitmap myBitmap;
        ImageCodecInfo myImageCodecInfo;
        Encoder myEncoder;
        EncoderParameter myEncoderParameter;
        EncoderParameters myEncoderParameters;

        // Create a Bitmap object based on a BMP file.
        myBitmap = new Bitmap("Shapes.bmp");

        // Get an ImageCodecInfo object that represents the TIFF codec.
        myImageCodecInfo = GetEncoderInfo("image/tiff");

        // Create an Encoder object based on the GUID
        // for the Compression parameter category.
        myEncoder = Encoder.Compression;

        // Create an EncoderParameters object.
        // An EncoderParameters object has an array of EncoderParameter
        // objects. In this case, there is only one
        // EncoderParameter object in the array.
        myEncoderParameters = new EncoderParameters(1);

        // Save the bitmap as a TIFF file with LZW compression.
        myEncoderParameter = new EncoderParameter(
            myEncoder,
            (long)EncoderValue.CompressionLZW);
        myEncoderParameters.Param[0] = myEncoderParameter;
        myBitmap.Save("ShapesLZW.tif", myImageCodecInfo, myEncoderParameters);
    }
    private static ImageCodecInfo GetEncoderInfo(String mimeType)
    {
        int j;
        ImageCodecInfo[] encoders;
        encoders = ImageCodecInfo.GetImageEncoders();
        for(j = 0; j < encoders.Length; ++j)
        {
            if(encoders[j].MimeType == mimeType)
                return encoders[j];
        }
        return null;
    }
}


不过经过自己的一系列测试,本来做一些对图片的裁剪,导出时、设置质量、对文件大小压缩的。

谁不知道,原来C#.net封装的System.Drawing.Imaging下的图形处理类不是支持的。

即使我上面已写好有两个参数可以设置,但对.png图片来说,都木有反应。很悲剧!


代码如下:

			S_MyImageCodecInfo = S_GetEncoderInfo("image/png");//ImageCodecInfo.GetImageEncoders()[0];//
			S_MyEncodeParameters = new EncoderParameters(3);
			EncoderParameter myEncoderParameter1 = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 50L);
			EncoderParameter myEncoderParameter2 = new EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth, 32L);//想设置为8位色深,完全无反应,NND
			EncoderParameter myEncoderParameter3 = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionLZW);//压缩参数设置为0,还是不行。
			S_MyEncodeParameters.Param[0] = myEncoderParameter1;
			S_MyEncodeParameters.Param[1] = myEncoderParameter2;
			S_MyEncodeParameters.Param[2] = myEncoderParameter3;

			_bitmap.Save(_exportFileName, S_MyImageCodecInfo, S_MyEncodeParameters);

从这看,C#.net并不支持导出时、设置质量、对文件大小压缩的。

如果要非要自己写,那要多大能耐啊。。。汗。


另外,我还自己测试过,我把PhotoShop自己随机编辑一个.png文件(带alpha,有些像素位置没有填颜色)。

文件大小是:519kb

用C#Bitmap读取后,字节数:780.8799kb,导出后,发现字节数为:822.3057kb

变大了,悲剧吧!?


http://topic.csdn.net/u/20120311/18/83e0a879-cf2d-4a89-8b17-5008131270a7.htmlCSDN贴子:这里是我之前发问的。


然后我再试过,把该导出后822.3057kb大小的文件:使用PhotoShop来打开,在导出.png,发现,文件大小为:590kb,虽然比原来的519kb大了。

但可以说明PhotoShop是可以压缩的,处理了一些压缩处理,C#目前的内置类库是不支持的。除非你有这么大能耐,和Adobe 的PhotoShop写出一样可以压缩.png,那你就牛了。

C#图片压缩

#region getThumImage /**/ /// /// 生成缩略图 /// /// 原始图片文件 ...
  • shuyizhi
  • shuyizhi
  • 2015年10月20日 19:21
  • 620

C#处理TIFF格式

using   System; using   System.IO; using   System.Drawing; using   System.Drawing.Imaging;   using  ...
  • Devillyd
  • Devillyd
  • 2010年06月30日 13:34
  • 5413

C#图片压缩处理

最近在做相册功能遇到一个问题,就是加载图片的时候然后放大,感觉有点卡。图片可能有点大,所以考虑用缩略图来实现。 也就是在查询出来一个相册图片  ,一页显示几十张,这几十张用缩略图来显示,看相信情况的...
  • qq_16542775
  • qq_16542775
  • 2016年06月30日 17:34
  • 1673

c# GDI+ Image.Save()或者Bitmap.Save()方法保存高质量图片

GDI+保存质量比较高的图片的方法,使用Image或者Bitmap的Save方法调节图像保存的质量。 Image.Save方法共有五种重载  其中Save(String, ImageCod...
  • u012835905
  • u012835905
  • 2014年11月17日 17:39
  • 16686

GDI+学习及代码总结之------图像的编码与解码

一、获取编、解码器信息 获取编码器信息 开发人员可以使用诸如GetImageEncodes来获取系统可用的编码器,用GetImageDecodes来获得系统可用的解码器;由于这两个函数都是...
  • harvic880925
  • harvic880925
  • 2013年06月24日 21:20
  • 3209

GDI入门实例(在VC++6.0中将JPG格式图片转换成BMP格式)

在 VC++6.0 中将 JPG 格式图片转换成 BMP 格式 思路:利用 GDI+来完成 难点: (1)配置 GDI 开发环境,添加配置代码 (2)在当文档程序中添加转换代码 注意:本文...
  • Cashey1991
  • Cashey1991
  • 2012年03月29日 15:51
  • 12279

C#中的bitmap类的使用方法

封装 GDI+ 位图,此位图由图形图像及其特性的像素数据组成。 Bitmap 是用于处理由像素数据定义的图像的对象。 继承层次结构 System.Object ...
  • yingzhaom
  • yingzhaom
  • 2012年07月13日 11:35
  • 31765

解析HL7协议

前段时间一个项目中用到了HL7协议,这个协议一般只用在医院的项目中。不与医院合作的一般还都不知道,我自己刚接触这个的时候也是一脸的懵逼,其实仔细看看就能看出点门道,主要是协议,肯定都是有一定标准的。H...
  • c914620529
  • c914620529
  • 2017年06月20日 20:37
  • 1806

dcm4che2-Java Library for DICOM

1 前言:       DICOM是所有医疗行业工作者都熟知的标准医学图像格式,但它又不止是一个图像格式那么简单。DICOM标准是一套医疗影像行业内必须遵守的标准,不管是医学影像设备制造商,还是医疗...
  • inter_peng
  • inter_peng
  • 2015年05月18日 22:47
  • 7200

HL7学习3

HL7 V3种最重要的是三个东西,其中 RIM模型是毋庸置疑的,另外两个是数据类型及词汇表了。从RIM模型图中,可以看出某个活动相关的角色是那些,他们是如何组合在一起的。数据类型对XML中每个元素得类...
  • fengbangyue
  • fengbangyue
  • 2011年09月04日 16:29
  • 1567
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# System.Drawing.Imaging下的 Encoder 的一些属性
举报原因:
原因补充:

(最多只允许输入30个字)