C# 图片处理帮助类(压缩,裁剪,缩略图)

时间:2018-12-25 15:40 作者:Mr.Pan 阅读数:884


//C#图片操作帮助类
public class ImageHelper
{
    /// <summary>
    /// 生成缩略图
    /// </summary>
    /// <param name="sourceFile">原始图片文件</param>
    /// <param name="quality">质量压缩比 (1-100,越大越清晰)</param>
    /// <param name="multiple">收缩倍数(1:原始比例,2:缩小两倍)</param>
    /// <param name="outputFile">输出文件名</param>
    /// <returns>成功返回true,失败则返回false</returns>
    public static bool getThumbnail(String sourceFile, long quality, int multiple, String outputFile)
    {
        try
        {
            long imageQuality = quality;
            Bitmap sourceImage = new Bitmap(sourceFile);
            ImageCodecInfo myImageCodecInfo = GetEncoderInfo("image/jpeg");
            System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;
            EncoderParameters myEncoderParameters = new EncoderParameters(1);
            EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, imageQuality);
            myEncoderParameters.Param[0] = myEncoderParameter;
            float xWidth = sourceImage.Width;
            float yWidth = sourceImage.Height;
            Bitmap newImage = new Bitmap((int)(xWidth / multiple), (int)(yWidth / multiple));
            Graphics g = Graphics.FromImage(newImage);
            g.DrawImage(sourceImage, 0, 0, xWidth / multiple, yWidth / multiple);
            g.Dispose();
            newImage.Save(outputFile, myImageCodecInfo, myEncoderParameters);
            return true;
        }
        catch
        {
            return false;
        }
    }
    /**/
    /// <summary>
    /// 获取图片编码信息
    /// </summary>
    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;
    }
    /// <summary>
    /// 从大图中截取一部分图片
    /// </summary>
    /// <param name="fromImagePath">来源图片地址</param>        
    /// <param name="offsetX">从偏移X坐标位置开始截取</param>
    /// <param name="offsetY">从偏移Y坐标位置开始截取</param>
    /// <param name="toImagePath">保存图片地址</param>
    /// <param name="width">保存图片的宽度</param>
    /// <param name="height">保存图片的高度</param>
    /// <returns></returns>
    public static void CaptureImage(string fromImagePath, int offsetX, int offsetY, string toImagePath, int width, int height)
    {
        //原图片文件
        Image fromImage = Image.FromFile(fromImagePath);
        //创建新图位图
        Bitmap bitmap = new Bitmap(width, height);
        //创建作图区域
        Graphics graphic = Graphics.FromImage(bitmap);
        //截取原图相应区域写入作图区
        graphic.DrawImage(fromImage, 0, 0, new Rectangle(offsetX, offsetY, width, height), GraphicsUnit.Pixel);
        //从作图区生成新图
        Image saveImage = Image.FromHbitmap(bitmap.GetHbitmap());
        //保存图片
        saveImage.Save(toImagePath, ImageFormat.Png);
        //释放资源   
        saveImage.Dispose();
        graphic.Dispose();
        bitmap.Dispose();
    }
}


调用方式

string source = "D:\\1.png";
string pathPerc = "D:\\2.png";
ImageHelper.getThumbnail(source, 100, 5, pathPerc);
ImageHelper.CaptureImage(source, 0, 0, pathPerc, 1000, 800);




推荐文章

[推荐] C# 设置Excel数据自适应行高、列宽的2种情况 (转)

[推荐] C# 图片处理帮助类(压缩,裁剪,缩略图)

[推荐] C# 通过AForge.dll 调用摄像头设备

[推荐] C#创建Word并填充内容

[推荐] C# UDP 通讯 简单例子

[推荐] 8天玩转并行开发——第七天 简要分析任务与线程池

[推荐] 8天玩转并行开发——第六天 异步编程模型

[推荐] 8天玩转并行开发——第四天 同步机制(上)

[推荐] 8天玩转并行开发——第一天 Parallel的使用

[推荐] c# 个人总结

[推荐] 8天玩转并行开发——第五天 同步机制(下)

[推荐] 将DataRow[]转换成DataTable的两种写法

[推荐] 8天玩转并行开发——第三天 plinq的使用

[推荐] Bitmap与byte[] 互转

[推荐] 关于.net登录前端加密传输


评论列表



注册用户登录后才能发表评论,请登录注册,访问 博客首页