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

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,那你就牛了。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
你可以使用C#System.IO.Compression和System.Drawing.Imaging命名空间来实现批量压缩文件夹下的指定文件夹内的图片,并保存。以下是一个简单的示例代码: ```csharp using System.IO.Compression; using System.Drawing.Imaging; string sourceFolder = @"C:\Images"; // 源文件夹路径 string targetFolder = @"C:\Compressed"; // 目标文件夹路径 string subFolder = "SubFolderName"; // 指定要压缩的子文件夹名称 if (!Directory.Exists(targetFolder)) { Directory.CreateDirectory(targetFolder); } string[] subFolders = Directory.GetDirectories(sourceFolder, subFolder, SearchOption.AllDirectories); foreach (string folder in subFolders) { string targetSubFolder = Path.Combine(targetFolder, Path.GetDirectoryName(folder)); Directory.CreateDirectory(targetSubFolder); string[] files = Directory.GetFiles(folder, "*.jpg", SearchOption.TopDirectoryOnly); foreach (string file in files) { string targetFile = Path.Combine(targetSubFolder, Path.GetFileName(file)); using (var bitmap = new System.Drawing.Bitmap(file)) { var encoderParams = new EncoderParameters(1); encoderParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 50L); bitmap.Save(targetFile, GetEncoderInfo("image/jpeg"), encoderParams); } } } // 获取JPEG编码器的信息 private static ImageCodecInfo GetEncoderInfo(string mimeType) { var codecs = ImageCodecInfo.GetImageEncoders(); foreach (var codec in codecs) { if (codec.MimeType == mimeType) { return codec; } } return null; } ``` 这段代码会在源文件夹下查找所有名称为"SubFolderName"的子文件夹,并批量压缩其中所有的.jpg文件,压缩后的文件保存在目标文件夹下,文件名和目录结构与源文件夹相同。你可以根据需要修改文件夹路径、子文件夹名称、文件类型和压缩质量等参数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值