C#图片格式转换

这篇文章详细描述了一个C#方法,用于将不同格式的图片转换为JPEG,进行缩放处理,并能处理Base64编码。涉及的类和方法包括图片路径管理、图像格式转换、缩略图生成以及文件操作。
摘要由CSDN通过智能技术生成

  #region 其他图片格式转换为jpg图片格式,并进行缩放处理
        private static string mypPath;
        /// <summary>
        /// 图片路径
        /// </summary>
        public static string MypPath
        {
            get
            {
                JHPubClass.mypPath = Application.StartupPath + "\\图片测试\\";
                return JHPubClass.mypPath;
            }
            set { JHPubClass.mypPath = value; }
        }
        /// <summary>
        /// 其他图片格式转换为jpg并进行缩放处理
        /// </summary>
        /// <param name="picWidth"></param>
        /// <param name="picHeight"></param>
        /// <param name="strBase64"></param>
        /// <param name="iMode">0png图片 1jpg图片</param>
        /// <param name="hospitalNO"></param>
        /// <returns></returns>
        public byte[] GetPicToJPG(int picWidth, int picHeight, string strBase64, int iMode, string hospitalNO)
        {
            byte[] byt = null;
            try
            {
              
                byte[] byPat = Convert.FromBase64String(strBase64);
                using (MemoryStream msPIC = new MemoryStream(byPat))
                {
                    Bitmap bmpJpg = new Bitmap(msPIC);
                    if (iMode == 1)
                    {
                        //jpg格式
                        bmpJpg.Save(MypPath + "Dest.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
                        bmpJpg.Dispose();

                        msPIC.Close();
                        msPIC.Dispose();
                    }
                    else if (iMode == 0)
                    {
                        bmpJpg.Save(MypPath + "Source.png", System.Drawing.Imaging.ImageFormat.Png);
                        bmpJpg.Dispose();//避免 GDI+ 中发生一般性错误

                        #region png图片格式转换为jpg格式
                        Image img = Image.FromFile(MypPath + "Source.png");
                        using (var bmp = new Bitmap(img.Width, img.Height))
                        {
                            bmp.SetResolution(img.HorizontalResolution, img.VerticalResolution);
                            using (var g = Graphics.FromImage(bmp))
                            {
                                g.Clear(Color.White);
                                g.DrawImageUnscaled(img, 0, 0);
                                g.Dispose();
                            }
                            img.Dispose();//避免 GDI+ 中发生一般性错误
                          
                            bmp.Save(MypPath + "Dest.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
                            bmp.Dispose(); //避免 GDI+ 中发生一般性错误
                        }

                        msPIC.Dispose();
                        #endregion
                    }

                    if (File.Exists(MypPath + "Dest.jpg"))
                    {
                        #region 缩放图片
                        //取图片通过
                        Bitmap oImage = new Bitmap(MypPath + "Dest.jpg");
                        Bitmap newTmep = new Bitmap(oImage);
                        oImage.Dispose();
                        Image imgTemp = newTmep;

                        Image imgJpg = PictureHandle.Instance().GetReducedImage(picWidth, picHeight, imgTemp, MypPath + "DestTmp.jpg");
                        imgJpg.Dispose();

                   
                        if (File.Exists(JHPubClass.PicPath + "DestTmp.jpg"))
                        {
                            try
                            {
                                byt = File.ReadAllBytes(MypPath + "DestTmp.jpg");

                                if (byt == null)
                                {
                                    MessageBox.Show("未获取到图片数据");
                                }
                                else
                                { 
                                 
                                }
                            }
                            catch (Exception ex)
                            {
                               MessageBox.Show("读取图片:" + ex.Message);
                            }
                        }
                        else
                        {
                           
                        }
                        #endregion


                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("转换图片格式出现问题:" + ex.Message);
            }


            return byt;
        }
        #endregion
 public class PictureHandle
    {
        public static PictureHandle picUtils;

        public static PictureHandle Instance()
        {
            if (picUtils == null)
            {
                picUtils = new PictureHandle();
            }
            return picUtils;
        }

        #region 采用双三次插值法,执行预筛选以确保高质量的收缩,此模式可产生质量教高的转换图像
        /// <summary>
        /// 按照指定的高和宽生成相应的规格的图片,采用此方法生成的缩略图片不会失真
        /// </summary>
        /// <param name="width">指定宽度</param>
        /// <param name="height">指定高度</param>
        /// <param name="imageFrom">原图片</param>
        /// <returns>返回新生成的图</returns>
        public Image GetReducedImage(int width, int height, Image imageFrom, string path)
        {
            // 源图宽度及高度 
            int imageFromWidth = imageFrom.Width;
            int imageFromHeight = imageFrom.Height;

            // 生成的缩略图实际宽度及高度.如果指定的高和宽比原图大,则返回原图;否则按照指定高宽生成图片
            if (width >= imageFromWidth && height >= imageFromHeight)
            {
                imageFrom.Save(@path, ImageFormat.Jpeg);
                return imageFrom;
            }
            else
            {
                // 生成的缩略图在上述"画布"上的位置
                int X = 0;
                int Y = 0;

                // 创建画布
                Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb);
                bmp.SetResolution(imageFrom.HorizontalResolution, imageFrom.VerticalResolution);
                using (Graphics g = Graphics.FromImage(bmp))
                {
                    // 用白色清空 
                    g.Clear(Color.White);

                    // 指定高质量的双三次插值法。执行预筛选以确保高质量的收缩。此模式可产生质量最高的转换图像。 
                    g.InterpolationMode = InterpolationMode.HighQualityBicubic;

                    // 指定高质量、低速度呈现。 
                    g.SmoothingMode = SmoothingMode.HighQuality;
                    g.CompositingQuality = CompositingQuality.HighQuality;
                    //清空一下画布
                    g.Clear(Color.White);
                    防止出现渐变
                    //var imgAtt = new ImageAttributes();
                    //imgAtt.SetWrapMode(WrapMode.TileFlipXY);
                    // 在指定位置并且按指定大小绘制指定的 Image 的指定部分。 
                    g.DrawImage(imageFrom, new Rectangle(X, Y, width, height),
                        new Rectangle(0, 0, imageFromWidth, imageFromHeight), GraphicsUnit.Pixel);
                    //  g.DrawImage(imageFrom, new Rectangle(0, 0, imageFromWidth, imageFromHeight), X, Y, width, height,
                    // GraphicsUnit.Pixel, imgAtt);

                    //将图片以指定的格式保存到到指定的位置
                    bmp.Save(@path, ImageFormat.Jpeg);
                    Image afterImg = Image.FromHbitmap(bmp.GetHbitmap());
                    return afterImg;
                }
            }
        }

        /// <summary>
        /// 按照指定的高和宽生成相应的规格的图片,采用此方法生成的缩略图片不会失真
        /// </summary>
        /// <param name="width">指定宽度</param>
        /// <param name="height">指定高度</param>
        /// <param name="imageFrom">原图片</param>
        /// <returns>返回新生成的图</returns>
        public Image GetReducedImage(int width, int height, Image imageFrom)
        {
            // 源图宽度及高度 
            int imageFromWidth = imageFrom.Width;
            int imageFromHeight = imageFrom.Height;

            // 生成的缩略图实际宽度及高度.如果指定的高和宽比原图大,则返回原图;否则按照指定高宽生成图片
            if (width >= imageFromWidth && height >= imageFromHeight)
            {
                //imageFrom.Save(@path, ImageFormat.Jpeg);
                return imageFrom;
            }
            else
            {
                // 生成的缩略图在上述"画布"上的位置
                int X = 0;
                int Y = 0;

                // 创建画布
                Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb);
                bmp.SetResolution(imageFrom.HorizontalResolution, imageFrom.VerticalResolution);
                using (Graphics g = Graphics.FromImage(bmp))
                {
                    // 用白色清空 
                    g.Clear(Color.White);

                    // 指定高质量的双三次插值法。执行预筛选以确保高质量的收缩。此模式可产生质量最高的转换图像。 
                    g.InterpolationMode = InterpolationMode.HighQualityBicubic;

                    // 指定高质量、低速度呈现。 
                    g.SmoothingMode = SmoothingMode.HighQuality;
                    g.CompositingQuality = CompositingQuality.HighQuality;
                    //清空一下画布
                    g.Clear(Color.White);
                    防止出现渐变
                    //var imgAtt = new ImageAttributes();
                    //imgAtt.SetWrapMode(WrapMode.TileFlipXY);
                    // 在指定位置并且按指定大小绘制指定的 Image 的指定部分。 
                    g.DrawImage(imageFrom, new Rectangle(X, Y, width, height),
                        new Rectangle(0, 0, imageFromWidth, imageFromHeight), GraphicsUnit.Pixel);
                    //  g.DrawImage(imageFrom, new Rectangle(0, 0, imageFromWidth, imageFromHeight), X, Y, width, height,
                    // GraphicsUnit.Pixel, imgAtt);

                    将图片以指定的格式保存到到指定的位置
                    //bmp.Save(@path, ImageFormat.Jpeg);
                    Image afterImg = Image.FromHbitmap(bmp.GetHbitmap());
                    return afterImg;
                }
            }
        }

        #endregion

        //缩放图片
        public Image GetThumbnail(Image b, int destHeight, int destWidth)
        {
            System.Drawing.Image imgSource = b;
            System.Drawing.Imaging.ImageFormat thisFormat = imgSource.RawFormat;

            int sW = 0, sH = 0;
            // 按比例缩放
            int sWidth = imgSource.Width;
            int sHeight = imgSource.Height;
            if (sHeight > destHeight || sWidth > destWidth)
            {
                if ((sWidth * destHeight) > (sHeight * destWidth))
                {
                    sW = destWidth;
                    sH = (destWidth * sHeight) / sWidth;
                }
                else
                {
                    sH = destHeight;
                    sW = (sWidth * destHeight) / sHeight;
                }
            }
            else
            {
                sW = sWidth;
                sH = sHeight;
            }
            Bitmap outBmp = new Bitmap(destWidth, destHeight);
            Graphics g = Graphics.FromImage(outBmp);
            g.Clear(Color.Transparent);
            // 设置画布的描绘质量       
            g.CompositingQuality = CompositingQuality.HighQuality;
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.DrawImage(imgSource, new Rectangle((destWidth - sW) / 2, (destHeight - sH) / 2, sW, sH), 0, 0, imgSource.Width, imgSource.Height, GraphicsUnit.Pixel);
            g.Dispose();
            // 以下代码为保存图片时,设置压缩质量    
            EncoderParameters encoderParams = new EncoderParameters();
            long[] quality = new long[1];
            quality[0] = 100;
            EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
            encoderParams.Param[0] = encoderParam;
            imgSource.Dispose();
            return outBmp;
        }

        /// <summary>
        /// 转换jpg图片
        /// </summary>
        /// <param name="btGif"></param>
        /// <returns></returns>
        public byte[] CovertGifToJpg(byte[] btGif)
        {
            string currentDirectory = Environment.CurrentDirectory;
            MemoryStream memoryStream = new MemoryStream(btGif);
            Image image = Image.FromStream(memoryStream);
            memoryStream.Close();
            MemoryStream memoryStream2 = new MemoryStream();
            using (Bitmap bitmap = new Bitmap(image.Width, image.Height))
            {
                bitmap.SetResolution(image.HorizontalResolution, image.VerticalResolution);
                using (Graphics graphics = Graphics.FromImage(bitmap))
                {
                    graphics.Clear(Color.White);
                    graphics.DrawImageUnscaled(image, 0, 0);
                }
                bitmap.Save(memoryStream2, ImageFormat.Jpeg);
            }
            return memoryStream2.ToArray();
        }


        /// <summary>
        /// 图片合成(单张,或者2张)
        /// </summary>
        /// <param name="bmp1">手写轨迹图片</param>
        /// <param name="bmp2">指纹图片</param>
        /// <param name="width">图片宽度</param>
        /// <param name="height">图片高度</param>
        /// <returns></returns>
        public Image MergerImg(string bmp1, string bmp2, int width, int height, string path)
        {
            if (string.IsNullOrEmpty(bmp1) && string.IsNullOrEmpty(bmp2))
            {
                return null;
            }
            Bitmap img1 = null;
            Bitmap img2 = null;
            Bitmap backgroudImg = null;
            Image backImg = null;
            if (File.Exists(path + "\\sign.jpg"))
            {
                File.Delete(path + "\\sign.jpg");
            }
            if (File.Exists(path + "\\fig.jpg"))
            {
                File.Delete(path + "\\fig.jpg");
            }
            if (!string.IsNullOrEmpty(bmp1))
            {
                img1 = new Bitmap(GetReducedImage(width, height, ToImage(bmp1), path + "\\sign.jpg"));
            }
            if (!string.IsNullOrEmpty(bmp2))
            {
                img2 = new Bitmap(GetReducedImage(width, height, ToImage(bmp2), path + "\\fig.jpg"));
            }
            if (!string.IsNullOrEmpty(bmp2) && !string.IsNullOrEmpty(bmp1))
            {
                创建要显示的图片对象,根据参数的个数设置宽度
                backgroudImg = new Bitmap(width * 2, height);
                Graphics g = Graphics.FromImage(backgroudImg);
                清除画布,背景设置为白色
                g.Clear(System.Drawing.Color.White);
                //g.Clear(Color.Transparent);
                g.DrawImageUnscaled(img1, 0, 0);
                g.DrawImageUnscaled(img2, width, 0);
                g.Dispose();
                backImg = backgroudImg;
            }
            else
            {
                backgroudImg = new Bitmap(width, height);
                Graphics g = Graphics.FromImage(backgroudImg);
                清除画布,背景设置为白色
                g.Clear(System.Drawing.Color.White);
                //g.Clear(Color.Transparent);
                if (string.IsNullOrEmpty(bmp1))
                {
                    g.DrawImageUnscaled(img2, 0, 0);
                }
                else if (string.IsNullOrEmpty(bmp2))
                {
                    g.DrawImageUnscaled(img1, 0, 0);
                }
                //g.DrawImageUnscaled(img2, width, 0);
                g.Dispose();
                backImg = backgroudImg;
            }
            backgroudImg = (Bitmap)GetReducedImage(width, height, backImg, path + "\\PadSign.jpg");

            return backgroudImg;
        }

        //base64转成图片
        private Image ToImage(string base64code)
        {
            byte[] imageBytes = Convert.FromBase64String(base64code);
            //读入MemoryStream对象
            MemoryStream memoryStream = new MemoryStream(imageBytes, 0, imageBytes.Length);
            memoryStream.Write(imageBytes, 0, imageBytes.Length);
            //转成图片
            Image image = Image.FromStream(memoryStream);
            return image;
        }

        /// <summary>
        /// 通过FileStream 来打开文件,这样就可以实现不锁定Image文件,到时可以让多用户同时访问Image文件
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        public static Bitmap ReadImageFile(string path)
        {
            FileStream fs = File.OpenRead(path); //OpenRead
            int filelength = 0;
            filelength = (int)fs.Length; //获得文件长度 
            Byte[] image = new Byte[filelength]; //建立一个字节数组 
            fs.Read(image, 0, filelength); //按字节流读取 
            System.Drawing.Image result = System.Drawing.Image.FromStream(fs);
            fs.Close();
            Bitmap bit = new Bitmap(result);
            return bit;
        }


        /// <summary>
        /// 图片转byte
        /// </summary>
        /// <param name="imagefile"></param>
        /// <returns></returns>
        public byte[] GetBytesFromImage(string imagefile)
        {
          
            try
            {
                FileStream fs = new FileStream(imagefile, FileMode.Open, FileAccess.Read); //将图片以文件流的形式进行保存
                BinaryReader br = new BinaryReader(fs);
                byte[] imgBytesIn = br.ReadBytes((int)fs.Length); //将流读入到字节数组中
                return imgBytesIn;
            }
            catch (Exception e)
            {
                throw new Exception("转换失败!" + e.Message);
            }
        }


     
        /// <summary>
        /// Image转换为base64字符串
        /// </summary>
        /// <param name="bmp"></param>
        /// <returns></returns>
        public string ImageToBase64(Image img)
        {
            try
            {
                byte[] byt = null;
                using (MemoryStream ms = new MemoryStream())
                {
                    img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                    byt = new byte[ms.Length];
                    ms.Position = 0;
                    ms.Read(byt, 0, (int)ms.Length);
                    ms.Close();
                }
                if (byt == null)
                {
                    MessageBox.Show("ImageToBase64转换失败");
                    return "";
                }
                else
                {
                    return Convert.ToBase64String(byt);
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show("转换失败:" + ex.Message);
              
                return "";
            }
        }

      

        /// <summary>
        /// 缩放图片(缩放PNG)
        /// </summary>
        /// <param name="imgToResize"></param>
        /// <param name="size"></param>
        /// <returns></returns>
        public System.Drawing.Image ResizeImage(System.Drawing.Image imgToResize, Size size)
        {
            //获取图片宽度
            int sourceWidth = imgToResize.Width;
            //获取图片高度
            int sourceHeight = imgToResize.Height;

            float nPercent = 0;
            float nPercentW = 0;
            float nPercentH = 0;
            //计算宽度的缩放比例
            nPercentW = ((float)size.Width / (float)sourceWidth);
            //计算高度的缩放比例
            nPercentH = ((float)size.Height / (float)sourceHeight);

            if (nPercentH < nPercentW)
                nPercent = nPercentH;
            else
                nPercent = nPercentW;
            //期望的宽度
            int destWidth = (int)(sourceWidth * nPercent);
            //期望的高度
            int destHeight = (int)(sourceHeight * nPercent);

            Bitmap b = new Bitmap(destWidth, destHeight);
            Graphics g = Graphics.FromImage((System.Drawing.Image)b);
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            //绘制图像
            g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
            g.Dispose();
            return (System.Drawing.Image)b;
        }
    }

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值