C#剪切生成高质量缩放图片

/// <summary>
        /// 高质量缩放图片
        /// </summary>
        /// <param name="OriginFilePath">源图的路径</param>
        /// <param name="TargetFilePath">存储缩略图的路径</param>
        /// <param name="DestWidth">缩放后图片宽度</param>
        /// <param name="DestHeight">缩放后图片高度</param>
        /// <returns>表明此次操作是否成功</returns>
        public static bool ToSuolue(System.IO.Stream oStream, string TargetFilePath, int towidth, int toheight)
        {
            //System.Drawing.Image OriginImage = System.Drawing.Image.FromFile(OriginFilePath);
            System.Drawing.Image OriginImage = System.Drawing.Image.FromStream(oStream);
            System.Drawing.Imaging.ImageFormat thisFormat = OriginImage.RawFormat;
            //按比例缩放
            int x = 0, y = 0;
            int ow = OriginImage.Width;
            int oh = OriginImage.Height;

            if ((double)ow / (double)oh > (double)towidth / (double)toheight)
            {
                oh = OriginImage.Height;
                ow = OriginImage.Height * towidth / toheight;
                y = 0;
                x = (OriginImage.Width - ow) / 2;
            }
            else
            {
                ow = OriginImage.Width;
                oh = OriginImage.Width * toheight / towidth;
                x = 0;
                y = (OriginImage.Height - oh) / 2;
            }

            Bitmap bt = new Bitmap(towidth, toheight); //根据指定大小创建Bitmap实例
            using (Graphics g = Graphics.FromImage(bt))
            {
                g.Clear(Color.White);
                //设置画布的描绘质量
                g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                g.DrawImage(OriginImage, new Rectangle(0, 0, towidth, toheight),
                    new System.Drawing.Rectangle(x, y, ow, oh),
                System.Drawing.GraphicsUnit.Pixel);
                g.Dispose();
            }

            System.Drawing.Imaging.EncoderParameters EncoderParams = new System.Drawing.Imaging.EncoderParameters(); //取得内置的编码器
            long[] Quality = new long[1];
            Quality[0] = 100;
            System.Drawing.Imaging.EncoderParameter EncoderParam = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, Quality);
            EncoderParams.Param[0] = EncoderParam;

            //try
            //{
                //获得包含有关内置图像编码解码器的信息的ImageCodecInfo 对象
                System.Drawing.Imaging.ImageCodecInfo[] arrayICI = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
                System.Drawing.Imaging.ImageCodecInfo jpegICI = null;
                for (int i = 0; i < arrayICI.Length; i++)
                {
                    if (arrayICI[i].FormatDescription.Equals("JPEG"))
                    {
                        jpegICI = arrayICI[i]; //设置为JPEG编码方式
                        break;
                    }
                }

                if (jpegICI != null) //保存缩略图
                {
                    bt.Save(TargetFilePath, jpegICI, EncoderParams);
                }
                else
                {
                    bt.Save(TargetFilePath, thisFormat);
                }
                OriginImage.Dispose();
                return true;
            //}
            //catch (System.Runtime.InteropServices.ExternalException e1)  //GDI+发生一般错误
            //{
            //    return false;
            //}
            //catch (Exception e2)
            //{
            //    return false;
            //}
        }

 

posted on 2014-12-29 11:13  Paste  阅读(364)  评论(0编辑  收藏  举报

导航