一個自定義的C#圖片處理類,用于生成縮略圖信息

likeo 9年前發布 | 1K 次閱讀 C# 圖片處理

這個C#類專門用于圖片縮略圖處理,除了可以將圖片縮小成指定大小的縮略圖外,還可以用于給圖片打上圖片水印,

using System;
using System.Drawing.Imaging;
using System.Collections;
using System.Drawing;
using System.IO;

namespace DotNet.Utilities { /// <summary> /// 枚舉,生成縮略圖模式 /// </summary> public enum ThumbnailMod : byte { /// <summary> /// HW /// </summary> HW, /// <summary> /// W /// </summary> W, /// <summary> /// H /// </summary> H, /// <summary> /// Cut /// </summary> Cut };

/// <summary>
/// 操作圖片類, 生成縮略圖,添加水印
/// </summary>
public static class PicDeal
{
    private static Hashtable htmimes = new Hashtable();
    internal static readonly string AllowExt = ".jpe|.jpeg|.jpg|.png|.tif|.tiff|.bmp";
    #region 生成縮略圖
    /// <summary>
    /// 生成縮略圖
    /// </summary>
    /// <param name="originalImagePath"></param>
    /// <param name="width"></param>
    /// <param name="height"></param>
    /// <param name="mode"></param>
    /// <returns></returns>
    public static bool MakeThumbnail(string originalImagePath, int width, int height, ThumbnailMod mode)
    {
        string thumbnailPath = originalImagePath.Substring(0, originalImagePath.LastIndexOf('.')) + "s.jpg";
        Image originalImage = Image.FromFile(originalImagePath);

        int towidth = width;
        int toheight = height;

        int x = 0;
        int y = 0;
        int ow = originalImage.Width;
        int oh = originalImage.Height;

        switch (mode)
        {
            case ThumbnailMod.HW://指定高寬縮放(可能變形)               
                break;
            case ThumbnailMod.W://指定寬,高按比例                   
                toheight = originalImage.Height * width / originalImage.Width;
                break;
            case ThumbnailMod.H://指定高,寬按比例
                towidth = originalImage.Width * height / originalImage.Height;
                break;
            case ThumbnailMod.Cut://指定高寬裁減(不變形)               
                if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)
                {
                    oh = originalImage.Height;
                    ow = originalImage.Height * towidth / toheight;
                    y = 0;
                    x = (originalImage.Width - ow) / 2;
                }
                else
                {
                    ow = originalImage.Width;
                    oh = originalImage.Width * height / towidth;
                    x = 0;
                    y = (originalImage.Height - oh) / 2;
                }
                break;
            default:
                break;
        }

        //新建一個bmp圖片
        Image bitmap = new Bitmap(towidth, toheight);

        //新建一個畫板
        Graphics g = Graphics.FromImage(bitmap);

        //設置高質量插值法
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

        //設置高質量,低速度呈現平滑程度
        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

        //清空畫布并以透明背景色填充
        g.Clear(System.Drawing.Color.Transparent);

        //在指定位置并且按指定大小繪制原圖片的指定部分
        g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight),
            new Rectangle(x, y, ow, oh),
            GraphicsUnit.Pixel);
        bool isok = false;
        try
        {
            //以jpg格式保存縮略圖
            bitmap.Save(thumbnailPath, ImageFormat.Jpeg);
            isok = true;
        }
        catch (Exception)
        {
            thumbnailPath = originalImagePath;
        }
        finally
        {
            originalImage.Dispose();
            bitmap.Dispose();
            g.Dispose();
        }
        return isok;
    }
    #endregion

    #region 在圖片上生成圖片水印
    ///// <summary>
    ///// 在圖片上生成圖片水印
    ///// </summary>
    ///// <param name="Path">原服務器圖片路徑</param>
    ///// <param name="Path_syp">生成的帶圖片水印的圖片路徑</param>
    ///// <param name="Path_sypf">水印圖片路徑</param>
    /// <summary>
    /// 在圖片上生成圖片水印
    /// </summary>
    /// <param name="Path">原服務器圖片路徑</param>
    /// <param name="Path_sypf">水印圖片路徑</param>
    public static void AddWaterPic(string Path, string Path_sypf)
    {
        try
        {
            Image image = Image.FromFile(Path);
            Image copyImage = Image.FromFile(Path_sypf);
            Graphics g = Graphics.FromImage(image);
            g.DrawImage(copyImage, new System.Drawing.Rectangle(image.Width - copyImage.Width, image.Height - copyImage.Height, copyImage.Width, copyImage.Height), 0, 0, copyImage.Width, copyImage.Height, System.Drawing.GraphicsUnit.Pixel);
            g.Dispose();

            image.Save(Path + ".temp");
            image.Dispose();
            System.IO.File.Delete(Path);
            File.Move(Path + ".temp", Path);
        }
        catch
        { }
    }
    #endregion

    /// <summary>
    /// 公共方法
    /// </summary>
    private static void GetImgType()
    {
        htmimes[".jpe"] = "image/jpeg";
        htmimes[".jpeg"] = "image/jpeg";
        htmimes[".jpg"] = "image/jpeg";
        htmimes[".png"] = "image/png";
        htmimes[".tif"] = "image/tiff";
        htmimes[".tiff"] = "image/tiff";
        htmimes[".bmp"] = "image/bmp";
    }


    #region 返回新圖片尺寸
    /// <summary>
    /// 返回新圖片尺寸
    /// </summary>
    /// <param name="width">原始寬</param>
    /// <param name="height">原始高</param>
    /// <param name="maxWidth">新圖片最大寬</param>
    /// <param name="maxHeight">新圖片最大高</param>
    /// <returns></returns>
    public static Size ResizeImage(int width, int height, int maxWidth, int maxHeight)
    {
        decimal MAX_WIDTH = (decimal)maxWidth;
        decimal MAX_HEIGHT = (decimal)maxHeight;
        decimal ASPECT_RATIO = MAX_WIDTH / MAX_HEIGHT;

        int newWidth, newHeight;

        decimal originalWidth = (decimal)width;
        decimal originalHeight = (decimal)height;

        if (originalWidth > MAX_WIDTH || originalHeight > MAX_HEIGHT)
        {
            decimal factor;
            // determine the largest factor
            if (originalWidth / originalHeight > ASPECT_RATIO)
            {
                factor = originalWidth / MAX_WIDTH;
                newWidth = Convert.ToInt32(originalWidth / factor);
                newHeight = Convert.ToInt32(originalHeight / factor);
            }
            else
            {
                factor = originalHeight / MAX_HEIGHT;
                newWidth = Convert.ToInt32(originalWidth / factor);
                newHeight = Convert.ToInt32(originalHeight / factor);
            }
        }
        else
        {
            newWidth = width;
            newHeight = height;
        }

        return new Size(newWidth, newHeight);

    }
    #endregion
}

}</pre>

 本文由用戶 likeo 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!