C# 從網絡抓取圖檔處理類,涉及到圖檔 和 Base64的互相轉換以及Base64 轉 圖檔的儲存,友善後期查漏補缺。
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace Common
{
/// <summary>
/// 網絡圖檔服務類
/// </summary>
internal class WebImageHelper
{
/// <summary>
/// 下載下傳Web網頁的圖檔,并轉換為Base64String格式
/// </summary>
/// <param name="urlAddress">圖檔URL位址</param>
/// <returns></returns>
public string WebImageToBase64(string urlAddress)
{
try
{
return ImageToBase64(urlAddress);
}
catch (Exception ex)
{
return string.Empty;
}
}
/// <summary>
/// Image 轉成 base64
/// </summary>
/// <param name="fileFullName"></param>
private string ImageToBase64(string fileFullName)
{
try
{
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"
? 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;
}
}
private static Image UrlToImage(string url)
{
WebClient mywebclient = new WebClient();
byte[] Bytes = mywebclient.DownloadData(url);
using (MemoryStream ms = new MemoryStream(Bytes))
{
Image outputImg = Image.FromStream(ms);
return outputImg;
}
}
// 處理base64字元
private static string PrefectBase64(string Base64Str)
{
string dummyData = Base64Str.Trim().Replace("%", "").Replace(",", "").Replace(" ", "+").Replace("_", "/").Replace("-", "+");
if (dummyData.Length % 4 > 0)
{
dummyData = dummyData.PadRight(dummyData.Length + 4 - dummyData.Length % 4, '=');
}
return dummyData;
}
#region 儲存base64格式圖檔
public static void SavePhotoByString(string base64, string fullPath)
{
byte[] buffer = Convert.FromBase64String(base64.Replace(" ", "+")); //儲存到指定路徑
FileStream fileStream = new FileStream(fullPath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)
{
Position = 0L
};
fileStream.Write(buffer, 0, buffer.Length);
fileStream.Close();
}
#endregion
/// <summary>
/// 檔案轉base64編碼
/// </summary>
/// <param name="FileName">檔案路徑+檔案名</param>
/// <returns>Base64字元串</returns>
public string FileJpgConvertToBase64(string FileName)
{
if (!File.Exists(FileName))
{
return "";
}
string Pub_Zp = "";
try
{
FileStream fs = File.OpenRead(FileName);
int i = (int)fs.Length;
byte[] Zp = new byte[i];
fs.Read(Zp, 0, i);
fs.Close();
Pub_Zp = Convert.ToBase64String(Zp);
}
catch (Exception ex)
{
Console.WriteLine("JpgConvertToBase64", FileName, ex);
return "";
}
return Pub_Zp;
}
#region[base64轉圖檔]
/// <summary>
/// 解析照片
/// </summary>
/// <param name="base64string">照片base64String類型</param>
/// <returns></returns>
private Bitmap GetImageFromBase64(string base64string)
{
Bitmap bitmap = null;
try
{
if (!string.IsNullOrEmpty(base64string))
{
byte[] b = Convert.FromBase64String(base64string);
MemoryStream ms = new MemoryStream(b);
bitmap = new Bitmap(ms);
}
}
catch (Exception ex)
{
Console.WriteLine("GetImageFromBase64", ex);
}
return bitmap;
}
#endregion
}
}