zoukankan      html  css  js  c++  java
  • Asp.net真正生成高质量不变形缩略图片

    方法一:

    C# 代码
    /// <summary>
    /// 生成缩略图
    /// </summary>
    /// <param name="originalImagePath">源图路径(物理路径)</param>
    /// <param name="thumbnailPath">缩略图路径(物理路径)</param>
    /// <param name="width">缩略图宽度</param>
    /// <param name="height">缩略图高度</param>
    /// <param name="mode">生成缩略图的方式</param>

    public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode)
    ...{
    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 "HW"://指定高宽缩放(可能变形)
    break;
    case "W"://指定宽,高按比例
    toheight = originalImage.Height * width/originalImage.Width;
    break;
    case "H"://指定高,宽按比例
    towidth = originalImage.Width * height/originalImage.Height;
    break;
    case "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;
    case "CutA"://指定高宽裁减(不变形)自定义
    if(ow<=towidth&&oh<=toheight)
    ...{
    x
    =-(towidth-ow)/2;
    y
    =-(toheight-oh)/2;
    ow
    =towidth;
    oh
    =toheight;
    }

    else
    ...{
    if(ow>oh)//宽大于高
    ...{
    x
    =0;
    y
    =-(ow-oh)/2;
    oh
    =ow;
    }

    else//高大于宽
    ...{
    y
    =0;
    x
    =-(oh-ow)/2;
    ow
    =oh;
    }

    }

    break;
    default :
    break;
    }


    //新建一个bmp图片
    Image bitmap = new System.Drawing.Bitmap(towidth,toheight);

    //新建一个画板
    Graphics g = System.Drawing.Graphics.FromImage(bitmap);

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

    //设置高质量,低速度呈现平滑程度
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

    //清空画布并以白色背景色填充
    g.Clear(Color.White);

    //在指定位置并且按指定大小绘制原图片的指定部分
    g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight),
    new Rectangle(x, y, ow,oh),
    GraphicsUnit.Pixel);

    try
    ...{
    //以jpg格式保存缩略图
    bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
    }

    catch(System.Exception e)
    ...{
    throw e;
    }

    finally
    ...{
    originalImage.Dispose();
    bitmap.Dispose();
    g.Dispose();
    }

    }


    方法二:

    C# 代码
    /// <summary>
    ///Class1 的摘要说明
    /// </summary>

    public class Class1
    ...{
    public static void SendSmallImage(string fileName, string newFile, int maxHeight, int maxWidth)
    ...{
    System.Drawing.Image img
    = System.Drawing.Image.FromFile(fileName);
    System.Drawing.Imaging.ImageFormat thisFormat
    = img.RawFormat;

    Size newSize
    = NewSize(maxWidth, maxHeight, img.Width, img.Height);
    Bitmap outBmp
    = new Bitmap(newSize.Width, newSize.Height);
    Graphics g
    = Graphics.FromImage(outBmp);

    // 设置画布的描绘质量
    g.CompositingQuality = CompositingQuality.HighQuality;
    g.SmoothingMode
    = SmoothingMode.HighQuality;
    g.InterpolationMode
    = InterpolationMode.HighQualityBicubic;

    g.DrawImage(img,
    new Rectangle(0, 0, newSize.Width, newSize.Height),
    0, 0, img.Width, img.Height, GraphicsUnit.Pixel);
    g.Dispose();

    // 以下代码为保存图片时,设置压缩质量
    EncoderParameters encoderParams = new EncoderParameters();
    long[] quality = new long[1];
    quality[
    0] = 80;

    EncoderParameter encoderParam
    = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
    encoderParams.Param[
    0] = encoderParam;

    //获得包含有关内置图像编码解码器的信息的ImageCodecInfo 对象。
    ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
    ImageCodecInfo jpegICI
    = null;
    for (int x = 0; x < arrayICI.Length; x++)
    ...{
    string Format = arrayICI[x].FormatDe script _ ion;
    if (arrayICI[x].FormatDe script _ ion.Equals("JPEG"))
    ...{
    jpegICI
    = arrayICI[x];//设置JPEG编码
    break;
    }

    }


    if (jpegICI != null)
    ...{
    outBmp.Save(newFile, jpegICI, encoderParams);
    }

    else
    ...{
    outBmp.Save(newFile, thisFormat);
    }


    img.Dispose();
    outBmp.Dispose();
    }


    private static Size NewSize(int maxWidth, int maxHeight, int width, int height)
    ...{
    double w = 0.0;
    double h = 0.0;
    double sw = Convert.ToDouble(width);
    double sh = Convert.ToDouble(height);
    double mw = Convert.ToDouble(maxWidth);
    double mh = Convert.ToDouble(maxHeight);

    if (sw < mw && sh < mh)
    ...{
    w
    = sw;
    h
    = sh;
    }

    else if ((sw / sh) > (mw / mh))
    ...{
    w
    = maxWidth;
    h
    = (w * sh) / sw;
    }

    else
    ...{
    h
    = maxHeight;
    w
    = (h * sw) / sh;
    }


    return new Size(Convert.ToInt32(w), Convert.ToInt32(h));
    }



    }
  • 相关阅读:
    java server: all kinds of errors
    fragment使用的错误
    unity3d+vuforia开发增强现实例子编译
    android遇到的几个问题
    cocos2dx 特效
    cchttpclient中停止网络请求的方法
    cocos2dx 2.2.5 hitWidget->onTouchEnded(pTouch, pEvent); 异常
    将博客搬至CSDN
    ffmpeg 编译Android
    常用注解
  • 原文地址:https://www.cnblogs.com/leeolevis/p/1383132.html
Copyright © 2011-2022 走看看