今天一朋友问我如何通过URL地址将图片保存下来。

特地找了些资源,实现了一下代码:

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Net; namespace ConsoleApp3
{
class Program
{
static void Main(string[] args)
{
var imgUrl = "http://emoji.qpic.cn/wx_emoji/haiannhLHhY7B1tX6eZ2BGNh9kzx3VCQ2MJfSQkSgE47sEXofVVoPCiaZKYbPcyQhS/";
var imgByte = GetBytesFromUrl(imgUrl);
if (imgByte.Length > 0)
{
var image = BytesToImage(imgByte);
if (image != null)
{
var mimeType = GetMimeType(image);
if (!string.IsNullOrEmpty(mimeType))
{
var fileName = AppDomain.CurrentDomain.BaseDirectory + "\\imgses\\" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "." + mimeType;
CreateImageFromBytes(fileName, imgByte);
}
}
}
} /// <summary>
/// 将http路径图片转为byte字节数据
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static byte[] GetBytesFromUrl(string url)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); byte[] bytes;
using (Stream stream = request.GetResponse().GetResponseStream())
{
using (MemoryStream mstream = new MemoryStream())
{
int count = 0;
byte[] buffer = new byte[1024];
int readNum = 0;
while ((readNum = stream.Read(buffer, 0, 1024)) > 0)
{
count = count + readNum;
mstream.Write(buffer, 0, readNum);
}
mstream.Position = 0;
using (BinaryReader br = new BinaryReader(mstream))
{
bytes = br.ReadBytes(count);
}
}
}
return bytes;
} /// <summary>
/// 将byte字节数据转为Image图片
/// </summary>
/// <param name="bytes">字节数组</param>
/// <returns>图片</returns>
public static Image BytesToImage(byte[] bytes)
{
Image image = null;
using (MemoryStream ms = new MemoryStream(bytes))
{
ms.Write(bytes, 0, bytes.Length);
image = Image.FromStream(ms, true);
}
return image;
} /// <summary>
/// 将Image图片转为byte字节数据
/// </summary>
/// <param name="image"></param>
/// <returns></returns>
public static byte[] ImageToBytes(Image image)
{
byte[] bt = null;
if (!image.Equals(null))
{
using (MemoryStream mostream = new MemoryStream())
{
Bitmap bmp = new Bitmap(image);
bmp.Save(mostream, ImageFormat.Bmp);//将图像以指定的格式存入缓存内存流
bt = new byte[mostream.Length];
mostream.Position = 0;//设置留的初始位置
mostream.Read(bt, 0, Convert.ToInt32(bt.Length));
}
}
return bt;
} /// <summary>
/// 根据Image图片获取图片类型
/// </summary>
/// <param name="image"></param>
/// <returns></returns>
public static string GetMimeType(Image image)
{
var mimeType = "";
var ImageCodec = ImageCodecInfo.GetImageDecoders();
foreach (var item in ImageCodec)
{
if (item.FormatID == image.RawFormat.Guid)
{
mimeType = item.MimeType.Split('/')[1];
break;
}
}
return mimeType;
} /// <summary>
/// 将byte[]图片保存到指定文件
/// </summary>
/// <param name="fileName">保存的完整路径(包含文件名)</param>
/// <param name="bytes"></param>
/// <returns></returns>
public static void CreateImageFromBytes(string fileName, byte[] bytes)
{
string file = fileName;
FileInfo info = new FileInfo(fileName);
Directory.CreateDirectory(info.Directory.FullName);
File.WriteAllBytes(file, bytes);
}
}
}

代码仅供参考。

最新文章

  1. [dpdk] 熟悉SDK与初步使用 (二)(skeleton源码分析)
  2. 【转】 71道经典Android面试题和答案,重要知识点都包含了
  3. dex分包变形记
  4. 当SVN服务器端IP地址发生变化时,客户端重新定位
  5. 怎样快速学会ZBrush 中的移动笔刷的运用
  6. ASP.NET母版与内容页相对路径的问题
  7. samba搭建
  8. 扩展ArcGIS API for Silverlight/WPF 中的TextSymbol支持角度标注
  9. 对象之function
  10. 【转】ArcGIS中File Geodatabase与Personal Geodatabase的区别
  11. Android launcher 壁纸 wallpaper
  12. SecureCRT标签显示IP地址
  13. Linux 进程级开启最大文件描述符 调优
  14. windbg 经典死锁调试
  15. Jackson解析XML
  16. Java编程思想 学习笔记7
  17. 火狐浏览器sqlite插件
  18. Java ENUM枚举的用法
  19. 漫谈NIO(3)之Netty实现
  20. 让AutoMapper在你的项目里飞一会儿

热门文章

  1. 833——B题题解
  2. 2022春每日一题:Day 35
  3. 5.django-模型ORM
  4. ROSIntegration ROSIntegrationVision与虚幻引擎4(Unreal Engine 4)的配置
  5. Java新特性(2):Java 10以后
  6. Java实现Excel批量导入数据库
  7. MyBatis01:框架概述、环境搭建及入门案例、自定义框架
  8. 协程- gevent模块
  9. 如何使用 System.Text.Json 序列化 DateTimeOffset 为 Unix 时间戳
  10. nuxt.js安装使用