212 lines
7.5 KiB
C#
212 lines
7.5 KiB
C#
|
|
using System;
|
|||
|
|
using System.Drawing.Drawing2D;
|
|||
|
|
using System.Drawing.Imaging;
|
|||
|
|
using System.Drawing;
|
|||
|
|
using System.IO;
|
|||
|
|
|
|||
|
|
namespace umbraco.editorControls.imagecropper
|
|||
|
|
{
|
|||
|
|
public class ImageTransform
|
|||
|
|
{
|
|||
|
|
public static void Execute(string sourceFile, string name, int cropX, int cropY, int cropWidth, int cropHeight, int sizeWidth, int sizeHeight, long quality)
|
|||
|
|
{
|
|||
|
|
if (!File.Exists(sourceFile)) return;
|
|||
|
|
|
|||
|
|
string path = sourceFile.Substring(0, sourceFile.LastIndexOf('\\'));
|
|||
|
|
|
|||
|
|
// TODO: Make configurable and move to imageInfo
|
|||
|
|
//if(File.Exists(String.Format(@"{0}\{1}.jpg", path, name))) return;
|
|||
|
|
|
|||
|
|
byte[] buffer = null;
|
|||
|
|
|
|||
|
|
using(FileStream fs = new FileStream(sourceFile, FileMode.Open, FileAccess.Read))
|
|||
|
|
{
|
|||
|
|
buffer = new byte[fs.Length];
|
|||
|
|
fs.Read(buffer, 0, (int)fs.Length);
|
|||
|
|
fs.Close();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Image image = Image.FromStream(new MemoryStream(buffer));
|
|||
|
|
|
|||
|
|
DirectoryInfo di = new DirectoryInfo(path);
|
|||
|
|
if (!di.Exists) di.Create();
|
|||
|
|
|
|||
|
|
using(Image croppedImage = cropImage(image, new Rectangle(cropX, cropY, cropWidth, cropHeight)))
|
|||
|
|
{
|
|||
|
|
using(Image resizedImage = resizeImage(croppedImage, new Size(sizeWidth, sizeHeight)))
|
|||
|
|
{
|
|||
|
|
using (Bitmap b = new Bitmap(resizedImage))
|
|||
|
|
{
|
|||
|
|
saveJpeg(String.Format("{0}/{1}.jpg", path, name), b, quality);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//saveJpeg(
|
|||
|
|
// String.Format("{0}/{1}.jpg", path, name),
|
|||
|
|
// new Bitmap(
|
|||
|
|
// resizeImage(cropImage(image, new Rectangle(cropX, cropY, cropWidth, cropHeight)), new Size(sizeWidth, sizeHeight))),
|
|||
|
|
// quality
|
|||
|
|
// );
|
|||
|
|
|
|||
|
|
//using (FileStream stm = new FileStream(sourceFile, FileMode.Open, FileAccess.Read))
|
|||
|
|
//{
|
|||
|
|
//using (Image image = Image.FromStream(stm))
|
|||
|
|
//{
|
|||
|
|
|
|||
|
|
//}
|
|||
|
|
//stm.Close();
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//using (Image image = Image.FromFile(sourceFile))
|
|||
|
|
//{
|
|||
|
|
// //image = cropImage(image, new Rectangle(cropX, cropY, cropWidth, cropHeight));
|
|||
|
|
// //cropImage(image, new Rectangle(cropX, cropY, cropWidth, cropHeight));
|
|||
|
|
// //image = resizeImage(image, new Size(sizeWidth, sizeHeight));
|
|||
|
|
// //resizeImage(image, new Size(sizeWidth, sizeHeight));
|
|||
|
|
// string path = sourceFile.Substring(0, sourceFile.LastIndexOf('\\') + 1) + "Crops";
|
|||
|
|
// DirectoryInfo di = new DirectoryInfo(path);
|
|||
|
|
// if (!di.Exists) di.Create();
|
|||
|
|
// saveJpeg(
|
|||
|
|
// String.Format("{0}/{1}.jpg", path, name),
|
|||
|
|
// new Bitmap(
|
|||
|
|
// resizeImage(cropImage(image, new Rectangle(cropX, cropY, cropWidth, cropHeight)), new Size(sizeWidth, sizeHeight))),
|
|||
|
|
// quality
|
|||
|
|
// );
|
|||
|
|
|
|||
|
|
// image.Dispose();
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private static void saveJpeg(string path, Bitmap img, long quality)
|
|||
|
|
{
|
|||
|
|
// Encoder parameter for image quality
|
|||
|
|
EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, quality);
|
|||
|
|
|
|||
|
|
// Jpeg image codec
|
|||
|
|
ImageCodecInfo jpegCodec = getEncoderInfo("image/jpeg");
|
|||
|
|
|
|||
|
|
if (jpegCodec == null)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
EncoderParameters encoderParams = new EncoderParameters(1);
|
|||
|
|
encoderParams.Param[0] = qualityParam;
|
|||
|
|
|
|||
|
|
img.Save(path, jpegCodec, encoderParams);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private static ImageCodecInfo getEncoderInfo(string mimeType)
|
|||
|
|
{
|
|||
|
|
// Get image codecs for all image formats
|
|||
|
|
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
|
|||
|
|
|
|||
|
|
// Find the correct image codec
|
|||
|
|
for (int i = 0; i < codecs.Length; i++)
|
|||
|
|
if (codecs[i].MimeType == mimeType)
|
|||
|
|
return codecs[i];
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private static Image cropImage(Image img, Rectangle cropArea)
|
|||
|
|
{
|
|||
|
|
Bitmap bmpImage = new Bitmap(img);
|
|||
|
|
Bitmap bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat);
|
|||
|
|
return (Image)(bmpCrop);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private static Image resizeImage(Image imgToResize, Size size)
|
|||
|
|
{
|
|||
|
|
//int sourceWidth = imgToResize.Width;
|
|||
|
|
//int sourceHeight = imgToResize.Height;
|
|||
|
|
|
|||
|
|
//float nPercent = 0;
|
|||
|
|
//float nPercentW = 0;
|
|||
|
|
//float nPercentH = 0;
|
|||
|
|
|
|||
|
|
//nPercentW = ((float)size.Width / (float)sourceWidth);
|
|||
|
|
//nPercentH = ((float)size.Height / (float)sourceHeight);
|
|||
|
|
|
|||
|
|
//if (nPercentH < nPercentW)
|
|||
|
|
// nPercent = nPercentH;
|
|||
|
|
//else
|
|||
|
|
// nPercent = nPercentW;
|
|||
|
|
|
|||
|
|
//int destWidth = (int)(sourceWidth * nPercent);
|
|||
|
|
//int destHeight = (int)(sourceHeight * nPercent);
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
int destWidth = size.Width;
|
|||
|
|
int destHeight = size.Height;
|
|||
|
|
|
|||
|
|
Bitmap b = new Bitmap(destWidth, destHeight);
|
|||
|
|
|
|||
|
|
ImageAttributes ia = new ImageAttributes();
|
|||
|
|
ia.SetWrapMode(WrapMode.TileFlipXY);
|
|||
|
|
|
|||
|
|
Graphics g = Graphics.FromImage(b);
|
|||
|
|
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
|
|||
|
|
g.Clear(Color.White);
|
|||
|
|
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
|||
|
|
g.CompositingQuality = CompositingQuality.HighQuality;
|
|||
|
|
g.SmoothingMode = SmoothingMode.HighQuality;
|
|||
|
|
g.DrawImage(imgToResize, new Rectangle(0, 0, destWidth, destHeight), 0, 0, imgToResize.Width,
|
|||
|
|
imgToResize.Height, GraphicsUnit.Pixel, ia);
|
|||
|
|
|
|||
|
|
ia.Dispose();
|
|||
|
|
g.Dispose();
|
|||
|
|
|
|||
|
|
return b;
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#if false
|
|||
|
|
|
|||
|
|
int destWidth = size.Width;
|
|||
|
|
int destHeight = size.Height;
|
|||
|
|
|
|||
|
|
using (Bitmap b = new Bitmap(destWidth, destHeight))
|
|||
|
|
{
|
|||
|
|
using (Graphics g = Graphics.FromImage(b))
|
|||
|
|
{
|
|||
|
|
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
|
|||
|
|
using (ImageAttributes ia = new ImageAttributes())
|
|||
|
|
{
|
|||
|
|
ia.SetWrapMode(WrapMode.TileFlipXY);
|
|||
|
|
g.Clear(Color.White);
|
|||
|
|
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
|||
|
|
g.CompositingQuality = CompositingQuality.HighQuality;
|
|||
|
|
g.SmoothingMode = SmoothingMode.HighQuality;
|
|||
|
|
g.DrawImage(imgToResize, new Rectangle(0, 0, destWidth, destHeight), 0, 0, imgToResize.Width,
|
|||
|
|
imgToResize.Height, GraphicsUnit.Pixel, ia);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return b;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#if false
|
|||
|
|
int destWidth = size.Width;
|
|||
|
|
int destHeight = size.Height;
|
|||
|
|
|
|||
|
|
Bitmap b = new Bitmap(destWidth, destHeight);
|
|||
|
|
Graphics g = Graphics.FromImage((Image)b);
|
|||
|
|
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
|||
|
|
|
|||
|
|
g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
|
|||
|
|
g.Dispose();
|
|||
|
|
|
|||
|
|
return (Image)b;
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|