您的位置:首页 > 编程语言 > C#

C#图片压缩裁剪处理

2015-10-27 10:14 267 查看
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Linq;

namespace TestApplicaotion
{
/// <summary>
/// 图片压缩类
/// </summary>
public static class CompressedImage
{
/// <summary>
/// 压缩图片
/// </summary>
/// <returns></returns>
public static bool GetPicThumbnail(PictureSize picSize)
{
bool reslut;

try
{
var iSource = Image.FromFile(picSize.FilePath);
GetSize(iSource, picSize);
var ob = Mapping(iSource, picSize);
reslut = Compression(iSource, ob, picSize);
}
catch
{
reslut = false;
}

return reslut;
}

/// <summary>
/// 无品质压缩图片
/// </summary>
/// <param name="iSource"></param>
/// <param name="ob"></param>
/// <param name="picSize"></param>
/// <returns></returns>
public static bool Compression(Image iSource, Bitmap ob, PictureSize picSize)
{
//以下代码为保存图片时,设置压缩质量
var ep = new EncoderParameters();
var qy = new long[1];

qy[0] = picSize.Flag;//设置压缩的比例1-100

var eParam = new EncoderParameter(Encoder.Quality, qy);

ep.Param[0] = eParam;

try
{
var array = ImageCodecInfo.GetImageEncoders();
var jpeginfo = array.FirstOrDefault(t => t.FormatDescription.Equals("JPEG"));

if (jpeginfo != null)
{
ob.Save(picSize.SavePath, jpeginfo, ep);//dFile是压缩后的新路径
}
else
{
ob.Save(picSize.SavePath, iSource.RawFormat);
}

return true;
}
catch
{
return false;
}
finally
{
iSource.Dispose();
ob.Dispose();
}
}

/// <summary>
/// 剪切并绘制缩略图
/// </summary>
/// <param name="iSource"></param>
/// <param name="picSize"></param>
/// <returns></returns>
public static Bitmap Mapping(Image iSource, PictureSize picSize)
{
var ob = new Bitmap(picSize.DWidth, picSize.DHeight);
var 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(
(picSize.DWidth - picSize.SWidth) / 2,
(picSize.DHeight - picSize.SHeight) / 2,
picSize.SWidth,
picSize.SHeight),
picSize.MarginX,
picSize.MarginY,
picSize.Width,
picSize.Height,
GraphicsUnit.Pixel);
g.Dispose();

return ob;
}

/// <summary>
/// 获取图片压缩宽高信息
/// </summary>
/// <param name="iSource"></param>
/// <param name="picSize"></param>
/// <returns></returns>
public static PictureSize GetSize(Image iSource, PictureSize picSize)
{
var temSize = new Size(iSource.Width, iSource.Height);
var proportionTemp = (float)temSize.Height / temSize.Width;
var proportionZoom = (float)picSize.DHeight / picSize.DWidth;
var value = proportionTemp / proportionZoom;

if (proportionTemp > proportionZoom)
{
picSize.Width = temSize.Width;
picSize.Height = (int)(temSize.Height / value);
picSize.SWidth = picSize.DWidth;
picSize.SHeight = (picSize.DWidth * picSize.Height) / temSize.Width;
picSize.MarginY = (temSize.Height - picSize.Height) / 2;
}
else if (proportionTemp < proportionZoom)
{
picSize.Width = (int)(temSize.Width / value);
picSize.Height = temSize.Height;
picSize.SHeight = picSize.DHeight;
picSize.SWidth = (picSize.Width * picSize.DHeight) / temSize.Height;
picSize.MarginX = (temSize.Width - picSize.Width) / 2;
}
else
{
picSize.Width = temSize.Width;
picSize.Height = temSize.Height;
picSize.SWidth = picSize.DWidth;
picSize.SHeight = picSize.DHeight;
}

return picSize;
}
}

/// <summary>
/// 图片实体信息。
/// </summary>
public class PictureSize
{
/// <summary>
/// 图片宽度
/// </summary>
public int Width { get; set; }

/// <summary>
/// 图片宽度
/// </summary>
public int Height { get; set; }

/// <summary>
/// 缩略图宽度
/// </summary>
public int SWidth { get; set; }

/// <summary>
/// 缩略图高度
/// </summary>
public int SHeight { get; set; }

/// <summary>
/// 设定缩略宽度
/// </summary>
public int DWidth { get; set; }

/// <summary>
/// 设定缩略高度
/// </summary>
public int DHeight { get; set; }

/// <summary>
/// 图片品质
/// </summary>
public int Flag { get; set; }

/// <summary>
/// 图片路径
/// </summary>
public string FilePath { get; set; }

/// <summary>
/// 缩略图保存路径
/// </summary>
public string SavePath { get; set; }

/// <summary>
/// 距离左右宽度
/// </summary>
public int MarginX { get; set; }

/// <summary>
/// 距离上下高度
/// </summary>
public int MarginY { get; set; }
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: