-
Notifications
You must be signed in to change notification settings - Fork 0
/
ImageCompressor.cs
84 lines (66 loc) · 2.51 KB
/
ImageCompressor.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using System;
using System.IO;
using ImageMagick;
using NuGet;
namespace Web.Business.Helpers
{
public class ImageCompressor
{
private readonly int _compressionLevel;
public static float TotallySavedMbs = 0;
public static int OptimizedImagesCount;
public static int SkippedImagesCount;
public ImageCompressor(int compressionLevel)
{
_compressionLevel = compressionLevel;
}
public byte[] MakeCompressedPng(byte[] originalPngImage)
{
using (var memStream = new MemoryStream())
{
MagickImage imageMagic = new MagickImage(originalPngImage);
imageMagic.Quality = _compressionLevel;
imageMagic.Format = MagickFormat.Png;
imageMagic.Interlace = Interlace.Line;
imageMagic.Strip();
imageMagic.Write(memStream);
var compressedImageSize = memStream.Length;
if (compressedImageSize < originalPngImage.LongLength)
{
var difference = (originalPngImage.LongLength - compressedImageSize);
TotallySavedMbs += ConvertBytesToMegabytes(difference);
OptimizedImagesCount++;
return memStream.ReadAllBytes();
}
SkippedImagesCount++;
return null;
}
}
public byte[] MakeCompressedJpg(Byte[] originalJpgImage)
{
using (var memStream = new MemoryStream())
{
MagickImage imageMagic = new MagickImage(originalJpgImage);
imageMagic.Quality = _compressionLevel;
imageMagic.Format = MagickFormat.Jpg;
imageMagic.Interlace = Interlace.Line;
imageMagic.Strip();
imageMagic.Write(memStream);
var compressedImageSize = memStream.Length;
if (compressedImageSize < originalJpgImage.LongLength)
{
var difference = (originalJpgImage.LongLength - compressedImageSize);
TotallySavedMbs += ConvertBytesToMegabytes(difference);
OptimizedImagesCount++;
return memStream.ReadAllBytes();
}
SkippedImagesCount++;
return null;
}
}
private float ConvertBytesToMegabytes(long bytes)
{
return (bytes / 1024f) / 1024f;
}
}
}