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
{
///
/// 图片相关公共方法
///
public static class ImageHelper
{
///
/// Image转Base64
///
///
///
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);
}
///
/// Image转byte[]
///
///
///
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;
}
///
/// Byte[]转Image
///
///
///
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;
}
///
/// Base64String转Bitmap
///
///
///
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();
}
}
///
/// Bitmap转Base64String
///
///
///
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();
}
}
///
/// 获取图片编码信息
///
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;
}
///
/// 压缩图片
///
/// 原始图片
/// 质量压缩比
/// 收缩倍数
/// 输出图片
///
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;
}
}
}
}