C# 图片,字节流,路径文件的转换

24 篇文章 0 订阅
 /// <summary>
    /// 图片,字节流,路径文件的转换
    /// </summary>
    class BitmapImageHelper
    {
        //待测试
        public Image GetImageHttp(string url, int width)
        {
            Image image = null;
            int BytesToRead = 100;
            if (!string.IsNullOrEmpty(url))
            {
                WebRequest request = WebRequest.Create(new Uri(url, UriKind.Absolute));
                request.Timeout = -1;
                WebResponse response = request.GetResponse();
                if (response != null)
                {
                    Stream responseStream = response.GetResponseStream();

                    BinaryReader reader = new BinaryReader(responseStream);
                    MemoryStream memoryStream = new MemoryStream();

                    byte[] bytebuffer = new byte[BytesToRead];
                    int bytesRead = reader.Read(bytebuffer, 0, BytesToRead);

                    while (bytesRead > 0)
                    {
                        memoryStream.Write(bytebuffer, 0, bytesRead);
                        bytesRead = reader.Read(bytebuffer, 0, BytesToRead);
                    }

                    memoryStream.Close();
                    reader.Close();
                    responseStream.Close();
                    response.Close();
                }
            }
            return image;
        }

        /// <summary>
        /// 获取远程地址的图片(经测试显示参数无效,可以保存到指定文件夹下),需进一步测试
        /// </summary>
        /// <param name="url">远程地址</param>
        /// <returns></returns>
        public static Image GetImageHttp(string url)
        {
            try
            {
                LogerHelper.CreateLogTxt($"GetImageHttp 照片地址{url}");
                WebRequest webreq = WebRequest.Create(new Uri(url, UriKind.Absolute));
                WebResponse webres = webreq.GetResponse();
                // 以字符流的方式读取HTTP响应,使用Using// 释放资源
                using (Stream stream = webres.GetResponseStream())
                {
                    //string path = Directory.GetCurrentDirectory() + "\\Photos";
                    string path = @"D:\Photos";//photos为保存到的照片名称
                    Image.FromStream(stream).Save(path);
                    return Image.FromStream(stream);
                }
            }
            catch (Exception ex)
            {
                LogerHelper.CreateLogTxt($"获取照片错误{ex.Message}");
            }
            return null;
        }

        /// <summary>
        /// 获取远程地址的图片
        /// </summary>
        /// <param name="url">远程地址</param>
        /// <returns></returns>
        public static Image GetImagePath(string url)
        {
           return UrlToImage(url);
        }
        /// <summary>
        /// 根据远程地址获取图片流
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static byte[] GetImageBytePath(string url)
        {
            WebClient mywebclient = new WebClient();
            byte[] Bytes = mywebclient.DownloadData(url);
            return Bytes;
        }


        #region 把在线图片转为base64
        /// <summary>
        /// 
        /// </summary>
        /// <param name="fileFullName">远程成在线图片地址</param>
        /// <returns></returns>
        public static string ImageToBase64(string fileFullName)
        {
            try
            {
                LogerHelper.CreateLogTxt($"ImageToBase64 照片地址{fileFullName}");
                Image img = UrlToImage(fileFullName);
                Bitmap bmp = new Bitmap(img);
                MemoryStream ms = new MemoryStream();
                var suffix = fileFullName.Substring(fileFullName.LastIndexOf('.') + 1,
                    fileFullName.Length - fileFullName.LastIndexOf('.') - 1).ToLower();
                var suffixName = suffix == "png" || suffix == "jpng"
                    ? ImageFormat.Png
                    : suffix == "jpg" || suffix == "jpeg" 
                        ? ImageFormat.Jpeg
                        : suffix == "bmp"
                            ? ImageFormat.Bmp
                            : suffix == "gif"
                                ? ImageFormat.Gif
                                : ImageFormat.Jpeg;

                bmp.Save(ms, suffixName);
                byte[] arr = new byte[ms.Length]; ms.Position = 0;
                ms.Read(arr, 0, (int)ms.Length); ms.Close();
                string base64Str = Convert.ToBase64String(arr);
                return PrefectBase64(base64Str);
            }
            catch (Exception ex)
            {
                return null;
            }
        }

        /// <summary>
        /// 通过远程地址获取图片, 会出现(GDI+中发生一般性错误的解决方法:释放图片资源)错误,未解决
        /// </summary>
        /// <param name="url">远程地址串</param>
        /// <returns></returns>
        private static Image UrlToImage(string url)
        {
            WebClient mywebclient = new WebClient();
            byte[] Bytes = mywebclient.DownloadData(url);
            MemoryStream ms = new MemoryStream(Bytes);
            Image outputImg = Image.FromStream(ms);
            return outputImg;
            //using (MemoryStream ms = new MemoryStream(Bytes))
            //{
            //    Image outputImg = Image.FromStream(ms);
            //    //GetBytes(outputImg);
            //    return outputImg;
               
            //}
        }

        private static string PrefectBase64(string Base64Str)
        {
            string dummyData = Base64Str.Replace("%", "").Replace(",", "").Replace(" ", "+");
            if (dummyData.Length % 4 > 0)
            {
                dummyData = dummyData.PadRight(dummyData.Length + 4 - dummyData.Length % 4, '=');
            }
            return dummyData;
        }


        #region Image To base64      
        /// <summary>
        /// Image 转成 base64
        /// </summary>
        /// <param name="fileFullName"></param>
        public static string ImageToBase64E(Image img)
        {
            try
            {
                Bitmap bmp = new Bitmap(img);
                MemoryStream ms = new MemoryStream();
                bmp.Save(ms, ImageFormat.Jpeg);
                byte[] arr = new byte[ms.Length];
                ms.Position = 0;
                ms.Read(arr, 0, (int)ms.Length);
                ms.Close();
                return Convert.ToBase64String(arr);
            }
            catch (Exception ex)
            {
                return null;
            }
        }
        public static string ImageToBase64E(string url)
        {
            return ImageToBase64E(UrlToImage(url));
        }
        #endregion

        #endregion


        /// <summary>
        /// base64转图片
        /// </summary>
        /// <param name="base64"></param>
        public static Image Base64ToImage(string base64)
        {
            try
            {
                base64 = base64.Replace("data:image/png;base64,", "").Replace("data:image/jgp;base64,", "").Replace("data:image/jpg;base64,", "").Replace("data:image/jpeg;base64,", "").Replace("data:image/jpng;base64,", "").Replace("data:image/jpng;base64;", "");//将base64头部信息替换
                byte[] bytes = Convert.FromBase64String(base64);
                MemoryStream memStream = new MemoryStream(bytes);
                Image mImage = Image.FromStream(memStream);
                return mImage;

                //Bitmap bp = new Bitmap(mImage);
                //string path = @"D:\uploads";
                //if (!Directory.Exists(path))
                //{
                //    Directory.CreateDirectory(path);
                //}
                //DateTime now = DateTime.Now;
                //string fileName = "images";
                //string filePath = path + "\\" + fileName;
                //bp.Save(filePath, System.Drawing.Imaging.ImageFormat.Jpeg);//注意保存路径
            }
            catch (Exception ex)
            {
                LogerHelper.CreateLogTxt($"base64转图片失败,错误详情:  {ex.Message}");
                throw;
            }
        }

        /// <summary>
        /// 图片转字节数组
        /// </summary>
        /// <param name="Picture"></param>
        /// <returns></returns>
        public static byte[] ImageToByte(Image Pic)
        {
            MemoryStream ms = new MemoryStream();
            if (Pic == null)
                return new byte[ms.Length];
            Pic.Save(ms, ImageFormat.Jpeg);
            byte[] BPicture = new byte[ms.Length];
            BPicture = ms.GetBuffer();
            return BPicture;
        }

        /// <summary>
        /// 字节流转图片
        /// </summary>
        /// <param name="btImage"></param>
        /// <returns></returns>
        public static Image ByteToImage(byte[] byImage)
        {
            if (byImage.Length == 0)
                return null;
            MemoryStream ms = new MemoryStream(byImage);
            Image image = Image.FromStream(ms);
            return image;
        }

        /// <summary> 
        /// 根据图片路径返回图片的字节流byte[] 
        /// </summary> 
        /// <param name="imagePath">图片路径</param> 
        /// <returns>返回的字节流</returns> 
        public static byte[] getImageByte(string imagePath)
        {
            FileStream files = new FileStream(imagePath, FileMode.Open);
            byte[] imgByte = new byte[files.Length];
            files.Read(imgByte, 0, imgByte.Length);
            files.Close();
            return imgByte;
        }

        /// <summary>
        /// GDI+中发生一般性错误的解决方法:释放图片资源
        /// </summary>
        /// <param name="image"></param>
        /// <returns></returns>
        private static byte[] GetBytes(Image image)
        {
            try
            {
                if (image == null) return null;
                using (Bitmap bitMap = new Bitmap(image))
                {
                    using (MemoryStream stream = new MemoryStream())
                    {
                        bitMap.Save(stream,ImageFormat.Jpeg);
                        return stream.GetBuffer();
                    }
                }
            }           
            finally
            {
                if (image != null)
                {
                    image.Dispose();
                    image = null;
                }
            }
        }
    }
    
    LogerHelper类见链接:https://mp.csdn.net/mp_blog/creation/editor/89875205
    ​

​​​​​​​转LogerHelper链接icon-default.png?t=L9C2https://blog.csdn.net/cn_514/article/details/89875205​​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值