using System;using System.Drawing;using System.IO;using System.Text.RegularExpressions;using System.Threading.Tasks;namespace 图片压缩{public class Program{static void Main(string[] args){Directo...
using System;
using System.Drawing;
using System.IO;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace 图片压缩
{
public class Program
{
static void Main(string[] args)
{
DirectoryInfo root = new DirectoryInfo(@"D:\桌面\测试");
foreach (FileInfo f in root.GetFiles())
{
GetImage(f.FullName,f.Name);
Console.WriteLine(f.Name);
}
Console.WriteLine("Hello World!");
}
public static void GetImage(string path,string name)
{
var imageStr = ImageToBase64(path);
var newImageStr = GetImg(imageStr, 1);
using (var stream = new FileStream($@"D:\桌面\测试新\tu{name}", FileMode.Create))
{
var match = Regex.Match(newImageStr, "data:image/png;base64,([\\w\\W]*)$");
if (match.Success)
{
newImageStr = match.Groups[1].Value;
}
var imgByte = Convert.FromBase64String(newImageStr);
stream.Write(imgByte, 0, imgByte.Length);
stream.Flush();
}
}
/// <summary>
/// Image 转成 base64
/// </summary>
/// <param name="filePath"></param>
public static string ImageToBase64(string filePath)
{
Bitmap bmp = new Bitmap(filePath);
MemoryStream ms = new MemoryStream();
bmp.Save(ms, bmp.RawFormat);
byte[] arr = new byte[ms.Length];
ms.Position = 0;
ms.Read(arr, 0, (int)ms.Length);
ms.Close();
return Convert.ToBase64String(arr);
}
/// <summary>
/// 图片压缩
/// </summary>
/// <param name="imgstr">图片base64</param>
/// <param name="type">图片类型,默认宽高</param>
/// <param name="length">图片最大限制</param>
/// <returns></returns>
public static string GetImg(string imgstr,int type, int length = 1024 * 1536)
{
//1.5MB以内的图片,不做压缩处理
if (imgstr.Length < length)
return imgstr;
int width = 800, height = 560;
if (type == 1)
{
width = 1230;
height = 870;
}
byte[] imgBytes = Convert.FromBase64String(imgstr);
var stream = new MemoryStream(imgBytes);
var image = Image.FromStream(stream);
double newWidth, newHeight;
if (image.Width > image.Height)
{
newWidth = width;
newHeight = image.Height * (newWidth / image.Width);
}
else
{
newHeight = height;
newWidth = (newHeight / image.Height) * image.Width;
}
if (newWidth > width)
{
newWidth = width;
}
if (newHeight > height)
{
newHeight = height;
newWidth = image.Width * (newHeight / image.Height);
}
var outStream = new MemoryStream();
ImgThumbnail.Thumbnail(stream, outStream,Convert.ToInt32(newWidth),Convert.ToInt32(newHeight), 100, ImgThumbnail.ImgThumbnailType.WH);
var newImageStr = Convert.ToBase64String(outStream.ToArray());
while (newImageStr.Length>= length)
{
newImageStr= GetImg(newImageStr, type,length);
}
return newImageStr;
}
}
}
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Net.Mime;
using System.Text;
namespace 图片压缩
{
public class ImgThumbnail
{
#region 枚举
/// <summary>
/// 指定缩放类型
/// </summary>
public enum ImgThumbnailType
{
/// <summary>
/// 无
/// </summary>
Nothing = 0,
/// <summary>
/// 指定高宽缩放(可能变形)
/// </summary>
WH = 1,
/// <summary>
/// 指定宽,高按比例
/// </summary>
W = 2,
/// <summary>
/// 指定高,宽按比例
/// </summary>
H = 3,
/// <summary>
/// 指定高宽裁减(不变形)
/// </summary>
Cut = 4,
/// <summary>
/// 按照宽度成比例缩放后,按照指定的高度进行裁剪
/// </summary>
W_HCut = 5,
/// <summary>
/// 长边优先
/// </summary>
W_L = 5,
/// <summary>
/// 短边优先
/// </summary>
W_S = 5,
}
public enum ImgResize
{
/// <summary>
/// 无
/// </summary>
Nothing = 0,
/// <summary>
/// 按长边优先
/// </summary>
M_lfit = 1,
/// <summary>
/// 按短边优先
/// </summary>
M_mfit = 2,
}
#endregion
#region 图片压缩
/// <summary>
/// 无损压缩图片
/// </summary>
/// <param name="sourceFile">原图片</param>
/// <param name="height">高度</param>
/// <param name="width"></param>
/// <param name="quality">压缩质量 1-100</param>
/// <param name="type">压缩缩放类型</param>
/// <param name="tFormat"></param>
/// <returns></returns>
private static Bitmap Thumbnail(Stream sourceStream, int width, int height, int quality
, ImgThumbnailType type, out ImageFormat tFormat)
{
using (Image iSource = Image.FromStream(sourceStream))
{
tFormat = iSource.RawFormat;
//缩放后的宽度和高度
int toWidth = width;
int toHeight = height;
//
int x = 0;
int y = 0;
int oWidth = iSource.Width;
int oHeight = iSource.Height;
if (type == ImgThumbnailType.W_L) type = oWidth > oHeight ? ImgThumbnailType.W : ImgThumbnailType.H;
if (type == ImgThumbnailType.W_S) type = oWidth > oHeight ? ImgThumbnailType.H : ImgThumbnailType.W;
switch (type)
{
case ImgThumbnailType.WH://指定高宽缩放(可能变形)
{
break;
}
case ImgThumbnailType.W://指定宽,高按比例
{
toHeight = iSource.Height * width / iSource.Width;
break;
}
case ImgThumbnailType.H://指定高,宽按比例
{
toWidth = iSource.Width * height / iSource.Height;
break;
}
case ImgThumbnailType.Cut://指定高宽裁减(不变形)
{
if (iSource.Width / (double)iSource.Height > toWidth / (double)toHeight)
{
oHeight = iSource.Height;
oWidth = iSource.Height * toWidth / toHeight;
y = 0;
x = (iSource.Width - oWidth) / 2;
}
else
{
oWidth = iSource.Width;
oHeight = iSource.Width * height / toWidth;
x = 0;
y = (iSource.Height - oHeight) / 2;
}
break;
}
case ImgThumbnailType.W_HCut://按照宽度成比例缩放后,按照指定的高度进行裁剪
{
toHeight = iSource.Height * width / iSource.Width;
if (height < toHeight)
{
oHeight = oHeight * height / toHeight;
toHeight = toHeight * height / toHeight;
}
break;
}
default:
break;
}
Bitmap ob = new Bitmap(toWidth, toHeight);
//ImgWaterMark iwm = new ImgWaterMark();
//iwm.AddWaterMark(ob, towidth, toheight, "www.***.com");
Graphics g = Graphics.FromImage(ob);
g.Clear(Color.WhiteSmoke);
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(iSource
, new Rectangle(x, y, toWidth, toHeight)
, new Rectangle(0, 0, oWidth, oHeight)
, GraphicsUnit.Pixel);
g.Dispose();
return ob;
}
}
/// <summary>
/// 无损压缩图片
/// </summary>
/// <param name="sourceStream">原图片文件流</param>
/// <param name="outStream">压缩后保存到流中</param>
/// <param name="height">高度</param>
/// <param name="width"></param>
/// <param name="quality">压缩质量 1-100</param>
/// <param name="type">压缩缩放类型</param>
/// <returns></returns>
public static bool Thumbnail(Stream sourceStream, Stream outStream, int width, int height, int quality, ImgThumbnailType type)
{
ImageFormat tFormat;
Bitmap ob = Thumbnail(sourceStream, width, height, quality, type, out tFormat);
//水印
//ImgWaterMark.AddWaterMark(ob, "www.***.com");
//以下代码为保存图片时,设置压缩质量
EncoderParameters ep = new EncoderParameters();
long[] qy = new long[1] { quality };//设置压缩的比例1-100
EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
ep.Param[0] = eParam;
try
{
ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo jpegICIinfo = null;
for (int i = 0; i < arrayICI.Length; i++)
{
if (arrayICI[i].FormatDescription.Equals("JPEG"))
{
jpegICIinfo = arrayICI[i];
break;
}
}
if (jpegICIinfo != null)
{
ob.Save(outStream, jpegICIinfo, ep);//jpegICIinfo是压缩后的新路径
}
else
{
ob.Save(outStream, tFormat);
}
return true;
}
catch
{
return false;
}
finally
{
//iSource.Dispose();
ob.Dispose();
}
}
/// <summary>
/// 无损压缩图片
/// </summary>
/// <param name="sourceFile">原图片</param>
/// <param name="targetFile">压缩后保存位置</param>
/// <param name="height">高度</param>
/// <param name="width"></param>
/// <param name="quality">压缩质量 1-100</param>
/// <param name="type">压缩缩放类型</param>
/// <returns></returns>
public static bool Thumbnail(string sourceFile, string targetFile, int width, int height, int quality, ImgThumbnailType type)
{
ImageFormat tFormat = null;
var fileBytes = File.ReadAllBytes(sourceFile);
var sourceStream = new MemoryStream(fileBytes);
Bitmap ob = Thumbnail(sourceStream, width, height, quality, type, out tFormat);
//以下代码为保存图片时,设置压缩质量
EncoderParameters ep = new EncoderParameters();
long[] qy = new long[1] { quality };//设置压缩的比例1-100
EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
ep.Param[0] = eParam;
try
{
ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo jpegICIinfo = null;
for (int i = 0; i < arrayICI.Length; i++)
{
if (arrayICI[i].FormatDescription.Equals("JPEG"))
{
jpegICIinfo = arrayICI[i];
break;
}
}
if (jpegICIinfo != null)
{
ob.Save(targetFile, jpegICIinfo, ep);//jpegICIinfo是压缩后的新路径
}
else
{
ob.Save(targetFile, tFormat);
}
return true;
}
catch
{
return false;
}
finally
{
//iSource.Dispose();
ob.Dispose();
}
}
#endregion
#region 生成缩略图
/// <summary>
/// 生成缩略图
/// </summary>
/// <param name="sourceFile">原始图片文件</param>
/// <param name="quality">质量压缩比</param>
/// <param name="w"></param>
/// <param name="h"></param>
/// <param name="outputFile">输出文件名</param>
/// <returns>成功返回true,失败则返回false</returns>
public static bool GetThumImage(string sourceFile, long quality, int w, int h, string outputFile)
{
try
{
long imageQuality = quality;
Bitmap sourceImage = new Bitmap(sourceFile);
ImageCodecInfo myImageCodecInfo = GetEncoder(ImageFormat.Jpeg);
System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;
EncoderParameters myEncoderParameters = new EncoderParameters(1);
EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, imageQuality);
myEncoderParameters.Param[0] = myEncoderParameter;
sourceImage.Save(outputFile, myImageCodecInfo, myEncoderParameters);
float xWidth = sourceImage.Width;
float yWidth = sourceImage.Height;
Bitmap newImage = new Bitmap(w, h);
Graphics g = Graphics.FromImage(newImage);
g.DrawImage(sourceImage, 0, 0, w, h);
g.Dispose();
newImage.Save(outputFile, myImageCodecInfo, myEncoderParameters);
return true;
}
catch
{
return false;
}
}
private static ImageCodecInfo GetEncoder(ImageFormat format)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
foreach (ImageCodecInfo codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}
#endregion
public static ImgThumbnailType GetThumbnailType(string w, string h, string t, string sourceFile)
{
//参数只有一个
if (w == "0" || h == "0")
{
return w == "0" ? ImgThumbnailType.H : ImgThumbnailType.W;
}
else
{
return t == "0" ? ImgThumbnailType.W_L : ImgThumbnailType.W_S;
}
}
/// <summary>
/// 比较原图的高宽大小
/// </summary>
/// <param name="w">宽度</param>
/// <param name="h">高度</param>
/// <param name="t"></param>
/// <returns></returns>
public static int GetImgResize(int w, int h, int t)
{
if (w > h) return t == 0 ? w : h;
return t == 0 ? h : w;
}
}
}
沃梦达教程
本文标题为:.NetCore 图片压缩
猜你喜欢
- c# 模拟线性回归的示例 2023-03-14
- WPF使用DrawingContext实现绘制刻度条 2023-07-04
- Oracle中for循环的使用方法 2023-07-04
- .NET CORE DI 依赖注入 2023-09-27
- Unity Shader实现模糊效果 2023-04-27
- C# 使用Aspose.Cells 导出Excel的步骤及问题记录 2023-05-16
- user32.dll 函数说明小结 2022-12-26
- 在C# 8中如何使用默认接口方法详解 2023-03-29
- 如何使用C# 捕获进程输出 2023-03-10
- Unity3D实现渐变颜色效果 2023-01-16
