2025-03-28 09:49:56 +08:00

205 lines
6.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Web;
namespace EShang.Common
{
/// <summary>
/// 图片相关公共方法
/// </summary>
public static class ImageHelper
{
/// <summary>
/// Image转Base64
/// </summary>
/// <param name="image"></param>
/// <returns></returns>
public static string ImageToBase64(Image image)
{
MemoryStream memoryStream = new MemoryStream();
image.Save(memoryStream, ImageFormat.Png);
byte[] inArray = memoryStream.ToArray();
memoryStream.Close();
return Convert.ToBase64String(inArray);
}
/// <summary>
/// Image转byte[]
/// </summary>
/// <param name="image"></param>
/// <returns></returns>
public static byte[] ImageToBytes(Image image)
{
ImageFormat format = image.RawFormat;
using (MemoryStream ms = new MemoryStream())
{
image.Save(ms, ImageFormat.Png);
byte[] buffer = new byte[ms.Length];
//Image.Save()会改变MemoryStream的Position需要重新Seek到Begin
ms.Seek(0, SeekOrigin.Begin);
ms.Read(buffer, 0, buffer.Length);
return buffer;
}
}
public static Image Base64ToImage(string base64String)
{
byte[] imageBytes = Convert.FromBase64String(base64String);
MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);
ms.Write(imageBytes, 0, imageBytes.Length);
System.Drawing.Image image = System.Drawing.Image.FromStream(ms, true);
return image;
}
/// <summary>
/// Byte[]转Image
/// </summary>
/// <param name="buffer"></param>
/// <returns></returns>
public static Image BytesToImage(this byte[] buffer)
{
MemoryStream ms = new MemoryStream(buffer);
Image image = Image.FromStream(ms);
return image;
}
public static Bitmap GetImageFromBase64(string base64string)
{
byte[] b = Convert.FromBase64String(base64string);
MemoryStream ms = new MemoryStream(b);
Bitmap bitmap = new Bitmap(ms);
return bitmap;
}
/// <summary>
/// Base64String转Bitmap
/// </summary>
/// <param name="base64Data"></param>
/// <returns></returns>
public static Bitmap Base64StringToBitmap(string base64String)
{
MemoryStream stream = new MemoryStream();
try
{
//过滤特殊字符即可
string dummyData = base64String.Trim().Replace("%", "").Replace(",", "").Replace(" ", "+");
if (dummyData.Length % 4 > 0)
{
dummyData = dummyData.PadRight(dummyData.Length + 4 - dummyData.Length % 4, '=');
}
byte[] arr = Convert.FromBase64String(dummyData);
stream = new MemoryStream(arr);
return new Bitmap(stream); ;
}
catch (Exception ex)
{
throw ex;
}
finally
{
stream.Close();
}
}
/// <summary>
/// Bitmap转Base64String
/// </summary>
/// <param name="bmp"></param>
/// <returns></returns>
public static string BitmapToBase64String(Bitmap bmp)
{
MemoryStream stream = null;
try
{
stream = new MemoryStream();
bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] arr = new byte[stream.Length];
stream.Position = 0;
stream.Read(arr, 0, (int)stream.Length);
return Convert.ToBase64String(arr);
}
catch (Exception ex)
{
throw ex;
}
finally
{
stream.Close();
}
}
/// <summary>
/// 获取图片编码信息
/// </summary>
private static ImageCodecInfo GetEncoderInfo(ImageFormat format)
{
ImageCodecInfo[] encoders;
encoders = ImageCodecInfo.GetImageEncoders();
for (int j = 0; j < encoders.Length; ++j)
{
if (encoders[j].FormatID == format.Guid)
{
return encoders[j];
}
}
return null;
}
/// <summary>
/// 压缩图片
/// </summary>
/// <param name="base64Data">原始图片</param>
/// <param name="quality">质量压缩比</param>
/// <param name="multiple">收缩倍数</param>
/// <param name="outputBase64Data">输出图片</param>
/// <returns></returns>
public static bool CompressedImage(string base64Data, long quality, int multiple, out string outputBase64Data)
{
outputBase64Data = base64Data;
try
{
// 获取图片信息
using (Bitmap bitmap = Base64StringToBitmap(base64Data))
{
ImageCodecInfo myImageCodecInfo = GetEncoderInfo(bitmap.RawFormat);
if (null == myImageCodecInfo)
{
return false;
}
// 压缩质量
System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;
EncoderParameters myEncoderParameters = new EncoderParameters(1);
EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, quality);
myEncoderParameters.Param[0] = myEncoderParameter;
// 按比例压缩
float _xWidth = bitmap.Width;
float _yWidth = bitmap.Height;
Bitmap newImage = new Bitmap((int)(_xWidth / multiple), (int)(_yWidth / multiple));
Graphics g = Graphics.FromImage(newImage);
// 可按需配置属性
//g.CompositingQuality = CompositingQuality.HighQuality;
//g.CompositingMode = CompositingMode.SourceCopy;
//g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(bitmap, 0, 0, (_xWidth / multiple), (_yWidth / multiple));
g.Dispose();
// 保存图片
outputBase64Data = BitmapToBase64String(newImage);
return true;
}
}
catch (Exception ex)
{
return false;
}
}
}
}