zoukankan      html  css  js  c++  java
  • 图片的缩放以及剪切

    借鉴的,总结下放一起拉。

    public static class Imgs
        {
            /// <summary>
            /// 对上传的图片进行等比缩放
            /// </summary>
            /// <param name="fromFile">获取文件流Stream</param>
            /// <param name="fileSaveUrl">缩略图保存完整路径</param>
            /// <param name="targetWidth">模板宽度</param>
            /// <param name="targetHeight">模板高度</param>
            public static void ZoomPic(System.IO.Stream fromFile, string fileSaveUrl, System.Double targetWidth, System.Double targetHeight)
            {
                //原始图片(获取原始图片创建对象,并使用流中嵌入的颜色管理信息)
                Image initImage = Image.FromStream(fromFile, true);
                //原图宽高均小于模版,不作处理,直接保存
                if (initImage.Width <= targetWidth && initImage.Height <= targetHeight)
                {
                    //保存
                    initImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
                }
                else
                {
                    //缩略图宽、高计算
                    double newWidth = initImage.Width;
                    double newHeight = initImage.Height;
                    //宽大于高或宽等于高(横图或正方)
                    if (initImage.Width > initImage.Height || initImage.Width == initImage.Height)
                    {
                        //如果宽大于模版
                        if (initImage.Width > targetWidth)
                        {
                            //宽按模版,高按比例缩放
                            newWidth = targetWidth;
                            newHeight = initImage.Height * (targetWidth / initImage.Width);
                        }
                    }
                    //高大于宽(竖图)
                    else
                    {
                        //如果高大于模版
                        if (initImage.Height > targetHeight)
                        {
                            //高按模版,宽按比例缩放
                            newHeight = targetHeight;
                            newWidth = initImage.Width * (targetHeight / initImage.Height);
                        }
                    }
    
                    //生成新图
                    //新建一个bmp图片
                    Image newImage = new Bitmap((int)newWidth, (int)newHeight);
                    //新建一个画板
                    Graphics newG = Graphics.FromImage(newImage);
                    //设置质量
                    newG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                    newG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
    
                    //置背景色
                    newG.Clear(Color.White);
                    //画图
                    newG.DrawImage(initImage, new Rectangle(0, 0, newImage.Width, newImage.Height), new Rectangle(0, 0, initImage.Width, initImage.Height), GraphicsUnit.Pixel);
    
                    //保存缩略图
                    newImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
                    //释放资源
                    newG.Dispose();
                    newImage.Dispose();
                    initImage.Dispose();
                }
            }
    
    
            /// <summary>
            /// 无损压缩图片
            /// </summary>
            /// <param name="sFile">原图片</param>
            /// <param name="dFile">压缩后保存位置</param>
            /// <param name="dHeight">高度</param>
            /// <param name="dWidth">宽度</param>
            /// <param name="flag">压缩质量 1-100</param>
            /// <returns></returns>
            public static bool CompressImage(Stream stream, string dFile, int dHeight, int dWidth, int flag)
            {
    
                System.Drawing.Image iSource = System.Drawing.Image.FromStream(stream);
                ImageFormat tFormat = iSource.RawFormat;
                int sW = 0, sH = 0;
                //按比例缩放
                Size tem_size = new Size(iSource.Width, iSource.Height);
    
                if (tem_size.Width > dHeight || tem_size.Width > dWidth)
                {
                    if ((tem_size.Width * dHeight) > (tem_size.Height * dWidth))
                    {
                        sW = dWidth;
                        sH = (dWidth * tem_size.Height) / tem_size.Width;
                    }
                    else
                    {
                        sH = dHeight;
                        sW = (tem_size.Width * dHeight) / tem_size.Height;
                    }
                }
                else
                {
                    sW = tem_size.Width;
                    sH = tem_size.Height;
                }
                Bitmap ob = new Bitmap(dWidth, dHeight);
                Graphics g = Graphics.FromImage(ob);
                g.Clear(Color.WhiteSmoke);
                g.CompositingQuality = CompositingQuality.HighQuality;
                g.SmoothingMode = SmoothingMode.HighQuality;
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g.DrawImage(iSource, new Rectangle((dWidth - sW) / 2, (dHeight - sH) / 2, sW, sH), 0, 0, iSource.Width, iSource.Height, GraphicsUnit.Pixel);
                g.Dispose();
                //以下代码为保存图片时,设置压缩质量
                EncoderParameters ep = new EncoderParameters();
                long[] qy = new long[1];
                qy[0] = flag;//设置压缩的比例1-100
                EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
                ep.Param[0] = eParam;
                try
                {
                    ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
                    ImageCodecInfo jpegICIinfo = null;
                    for (int x = 0; x < arrayICI.Length; x++)
                    {
                        if (arrayICI[x].FormatDescription.Equals("JPEG"))
                        {
                            jpegICIinfo = arrayICI[x];
                            break;
                        }
                    }
                    if (jpegICIinfo != null)
                    {
                        ob.Save(dFile, jpegICIinfo, ep);//dFile是压缩后的新路径
                    }
                    else
                    {
                        ob.Save(dFile, tFormat);
                    }
                    return true;
                }
                catch
                {
                    return false;
                }
                finally
                {
                    iSource.Dispose();
                    ob.Dispose();
                }
    
            }
    
    
            public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode)
            {
                WebRequest wr = WebRequest.Create(originalImagePath);
                WebResponse res = wr.GetResponse();
                Image originalImage = Image.FromStream(res.GetResponseStream());
                //System.Drawing.Image.FromFile(originalImagePath);
                //originalImagePath 来源路径
                //thumbnailPath 目的路径
                //width 源图片宽
                //height 源图片高
                //mode 缩放模式
    
                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 "D":
                        if ((double)originalImage.Width > (double)originalImage.Height)
                        {
                            toheight = originalImage.Height * width / originalImage.Width;
                        }
                        else
                        {
                            towidth = originalImage.Width * height / originalImage.Height;
                        }
                        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(Color.Transparent);
    
                //在指定位置并且按指定大小绘制原图片的指定部分
                g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight),
                 new Rectangle(x, y, ow, oh),
                 GraphicsUnit.Pixel);
    
                try
                {
                    //以jpg格式保存缩略图
                    //bitmap.Save(Server.MapPath(".") + "\" + thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
                    bitmap.Save("new", System.Drawing.Imaging.ImageFormat.Jpeg);
                }
                catch (System.Exception e)
                {
                    throw e;
                }
                finally
                {
                    originalImage.Dispose();
                    bitmap.Dispose();
                    g.Dispose();
                }
            }
    
        }
  • 相关阅读:
    python3.6入门到高阶(全栈) day013-014 内置函数
    python3.6入门到高阶(全栈) day012 生成器
    PHP数组基本排序算法和查找算法
    02 LAMP环境下安装WordPress
    02 React Native入门——Hello World
    01 React Native入门——环境安装部署
    02 “响应式Web设计”——媒体查询
    01 “响应式Web设计”——概述
    01 Portal for ArcGIS 10.7安装部署教程(windows环境)
    06 spring boot入门——AJAX请求后台接口,实现前后端传值
  • 原文地址:https://www.cnblogs.com/dyxd/p/6265675.html
Copyright © 2011-2022 走看看