132 lines
3.8 KiB
C#
132 lines
3.8 KiB
C#
|
|
using System;
|
|||
|
|
using System.Drawing;
|
|||
|
|
using System.Drawing.Drawing2D;
|
|||
|
|
using System.Drawing.Imaging;
|
|||
|
|
using System.IO;
|
|||
|
|
using System.Linq;
|
|||
|
|
|
|||
|
|
namespace ChatController.Utilities
|
|||
|
|
{
|
|||
|
|
public class FileUtils
|
|||
|
|
{
|
|||
|
|
public static string ScaleImage(string pFile, string pFormat, long maxUploadSize)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
byte[] mediaFile;
|
|||
|
|
using(Stream reader = File.OpenRead(pFile))
|
|||
|
|
{
|
|||
|
|
mediaFile = Utils.ReadFully(reader);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var memoryStream = new MemoryStream(mediaFile);
|
|||
|
|
var image = Image.FromStream(memoryStream);
|
|||
|
|
|
|||
|
|
float width, height;
|
|||
|
|
|
|||
|
|
if(image.Height < image.Width)
|
|||
|
|
{
|
|||
|
|
if(image.Height > 1080)
|
|||
|
|
{
|
|||
|
|
var factor = (float)image.Height / 1080;
|
|||
|
|
|
|||
|
|
height = 1080;
|
|||
|
|
|
|||
|
|
width = image.Width / factor;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
return pFile;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if(image.Height < 1080 && image.Width < 1080)
|
|||
|
|
{
|
|||
|
|
return pFile;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if(image.Width > 1080)
|
|||
|
|
{
|
|||
|
|
var factor = (float)image.Width / 1080;
|
|||
|
|
|
|||
|
|
width = 1080;
|
|||
|
|
|
|||
|
|
height = image.Height / factor;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
return pFile;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var scaledBitmap = new Bitmap(image, new Size((int)width, (int)height));
|
|||
|
|
|
|||
|
|
const int orientationId = 0x0112;
|
|||
|
|
|
|||
|
|
if(image.PropertyIdList.Contains(orientationId))
|
|||
|
|
{
|
|||
|
|
var item = image.GetPropertyItem(orientationId);
|
|||
|
|
|
|||
|
|
scaledBitmap.SetPropertyItem(item);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
using(var graphics = Graphics.FromImage(image))
|
|||
|
|
{
|
|||
|
|
graphics.Clear(Color.Transparent);
|
|||
|
|
|
|||
|
|
graphics.InterpolationMode = InterpolationMode.Low;
|
|||
|
|
|
|||
|
|
graphics.DrawImage(scaledBitmap, (int)width, (int)height);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var filePath = Path.GetTempPath() + Guid.NewGuid() + pFormat;
|
|||
|
|
|
|||
|
|
if(pFormat.Equals(".JPG") || pFormat.Equals(".JPE") || pFormat.Equals(".JPEG") || pFormat.Equals(".BMP"))
|
|||
|
|
{
|
|||
|
|
scaledBitmap.Save(filePath, ImageFormat.Jpeg);
|
|||
|
|
}
|
|||
|
|
else if(pFormat.Equals(".PNG"))
|
|||
|
|
{
|
|||
|
|
scaledBitmap.Save(filePath, ImageFormat.Png);
|
|||
|
|
}
|
|||
|
|
else if(pFormat.Equals(".GIF"))
|
|||
|
|
{
|
|||
|
|
scaledBitmap.Save(filePath, ImageFormat.Gif);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(File.Exists(filePath))
|
|||
|
|
{
|
|||
|
|
var fileInfo = new FileInfo(filePath);
|
|||
|
|
var fileInfoLength = fileInfo.Length;
|
|||
|
|
|
|||
|
|
if(maxUploadSize < fileInfoLength)
|
|||
|
|
{
|
|||
|
|
File.Delete(filePath);
|
|||
|
|
return string.Empty;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
return string.Empty;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
memoryStream.Dispose();
|
|||
|
|
memoryStream.Close();
|
|||
|
|
|
|||
|
|
return filePath;
|
|||
|
|
}
|
|||
|
|
catch(Exception exception)
|
|||
|
|
{
|
|||
|
|
return pFile;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static bool CheckFileSize(string pathToFile, long maxFileSize)
|
|||
|
|
{
|
|||
|
|
var fileInfo = new FileInfo(pathToFile);
|
|||
|
|
|
|||
|
|
return fileInfo.Length > maxFileSize;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|