566 lines
26 KiB
C#
566 lines
26 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.IO;
|
|||
|
|
using System.Drawing;
|
|||
|
|
using System.Drawing.Drawing2D;
|
|||
|
|
using System.Drawing.Imaging;
|
|||
|
|
using System.Reflection;
|
|||
|
|
using System.Web;
|
|||
|
|
|
|||
|
|
namespace Mtxfw.Utility
|
|||
|
|
{
|
|||
|
|
public class ImageManager
|
|||
|
|
{
|
|||
|
|
#region 正方型裁剪并缩放
|
|||
|
|
/// <summary>
|
|||
|
|
/// 正方型裁剪
|
|||
|
|
/// 以图片中心为轴心,截取正方型,然后等比缩放
|
|||
|
|
/// 用于头像处理
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="originalImagePath">原图HttpPostedFile对象</param>
|
|||
|
|
/// <param name="destinationImagePath">缩略图存放地址</param>
|
|||
|
|
/// <param name="side">指定的边长(正方型)</param>
|
|||
|
|
/// <param name="quality">质量(范围0-100)</param>
|
|||
|
|
public static void CutForSquare(string originalImagePath, string destinationImagePath, int side, int quality)
|
|||
|
|
{
|
|||
|
|
//创建目录
|
|||
|
|
string dir = Path.GetDirectoryName(destinationImagePath);
|
|||
|
|
if (!Directory.Exists(dir))
|
|||
|
|
Directory.CreateDirectory(dir);
|
|||
|
|
|
|||
|
|
//原始图片(获取原始图片创建对象,并使用流中嵌入的颜色管理信息)
|
|||
|
|
System.Drawing.Image initImage = System.Drawing.Image.FromFile(originalImagePath);
|
|||
|
|
|
|||
|
|
//原图宽高均小于模版,不作处理,直接保存
|
|||
|
|
if (initImage.Width <= side && initImage.Height <= side)
|
|||
|
|
{
|
|||
|
|
initImage.Save(destinationImagePath, System.Drawing.Imaging.ImageFormat.Jpeg);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//原始图片的宽、高
|
|||
|
|
int initWidth = initImage.Width;
|
|||
|
|
int initHeight = initImage.Height;
|
|||
|
|
|
|||
|
|
//非正方型先裁剪为正方型
|
|||
|
|
if (initWidth != initHeight)
|
|||
|
|
{
|
|||
|
|
//截图对象
|
|||
|
|
System.Drawing.Image pickedImage = null;
|
|||
|
|
System.Drawing.Graphics pickedG = null;
|
|||
|
|
|
|||
|
|
//宽大于高的横图
|
|||
|
|
if (initWidth > initHeight)
|
|||
|
|
{
|
|||
|
|
//对象实例化
|
|||
|
|
pickedImage = new System.Drawing.Bitmap(initHeight, initHeight);
|
|||
|
|
pickedG = System.Drawing.Graphics.FromImage(pickedImage);
|
|||
|
|
//设置质量
|
|||
|
|
pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
|
|||
|
|
pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
|
|||
|
|
//定位
|
|||
|
|
Rectangle fromR = new Rectangle((initWidth - initHeight) / 2, 0, initHeight, initHeight);
|
|||
|
|
Rectangle toR = new Rectangle(0, 0, initHeight, initHeight);
|
|||
|
|
//画图
|
|||
|
|
pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
|
|||
|
|
//重置宽
|
|||
|
|
initWidth = initHeight;
|
|||
|
|
}
|
|||
|
|
//高大于宽的竖图
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//对象实例化
|
|||
|
|
pickedImage = new System.Drawing.Bitmap(initWidth, initWidth);
|
|||
|
|
pickedG = System.Drawing.Graphics.FromImage(pickedImage);
|
|||
|
|
//设置质量
|
|||
|
|
pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
|
|||
|
|
pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
|
|||
|
|
//定位
|
|||
|
|
Rectangle fromR = new Rectangle(0, (initHeight - initWidth) / 2, initWidth, initWidth);
|
|||
|
|
Rectangle toR = new Rectangle(0, 0, initWidth, initWidth);
|
|||
|
|
//画图
|
|||
|
|
pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
|
|||
|
|
//重置高
|
|||
|
|
initHeight = initWidth;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//将截图对象赋给原图
|
|||
|
|
initImage = (System.Drawing.Image)pickedImage.Clone();
|
|||
|
|
//释放截图资源
|
|||
|
|
pickedG.Dispose();
|
|||
|
|
pickedImage.Dispose();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//缩略图对象
|
|||
|
|
System.Drawing.Image resultImage = new System.Drawing.Bitmap(side, side);
|
|||
|
|
System.Drawing.Graphics resultG = System.Drawing.Graphics.FromImage(resultImage);
|
|||
|
|
//设置质量
|
|||
|
|
resultG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
|
|||
|
|
resultG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
|
|||
|
|
//用指定背景色清空画布
|
|||
|
|
resultG.Clear(Color.White);
|
|||
|
|
//绘制缩略图
|
|||
|
|
resultG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, side, side), new System.Drawing.Rectangle(0, 0, initWidth, initHeight), System.Drawing.GraphicsUnit.Pixel);
|
|||
|
|
|
|||
|
|
//关键质量控制
|
|||
|
|
//获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff
|
|||
|
|
|
|||
|
|
ImageCodecInfo ici = GetEncoderInfo("image/jpeg");
|
|||
|
|
|
|||
|
|
EncoderParameters ep = new EncoderParameters(1);
|
|||
|
|
ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);
|
|||
|
|
|
|||
|
|
//保存缩略图
|
|||
|
|
resultImage.Save(destinationImagePath, ici, ep);
|
|||
|
|
|
|||
|
|
//释放关键质量控制所用资源
|
|||
|
|
ep.Dispose();
|
|||
|
|
|
|||
|
|
//释放缩略图资源
|
|||
|
|
resultG.Dispose();
|
|||
|
|
resultImage.Dispose();
|
|||
|
|
|
|||
|
|
//释放原始图片资源
|
|||
|
|
initImage.Dispose();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region 固定模版裁剪并缩放
|
|||
|
|
/// <summary>
|
|||
|
|
/// 指定长宽裁剪
|
|||
|
|
/// 按模版比例最大范围的裁剪图片并缩放至模版尺寸
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="postedFile">原图HttpPostedFile对象</param>
|
|||
|
|
/// <param name="destinationImagePath">保存路径</param>
|
|||
|
|
/// <param name="maxWidth">最大宽(单位:px)</param>
|
|||
|
|
/// <param name="maxHeight">最大高(单位:px)</param>
|
|||
|
|
/// <param name="quality">质量(范围0-100)</param>
|
|||
|
|
public static void CutForCustom(string originalImagePath, string destinationImagePath, int maxWidth, int maxHeight, int quality)
|
|||
|
|
{
|
|||
|
|
//从文件获取原始图片,并使用流中嵌入的颜色管理信息
|
|||
|
|
System.Drawing.Image initImage = System.Drawing.Image.FromFile(originalImagePath);
|
|||
|
|
|
|||
|
|
//原图宽高均小于模版,不作处理,直接保存
|
|||
|
|
if (initImage.Width <= maxWidth && initImage.Height <= maxHeight)
|
|||
|
|
{
|
|||
|
|
initImage.Save(destinationImagePath, System.Drawing.Imaging.ImageFormat.Jpeg);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//模版的宽高比例
|
|||
|
|
double templateRate = (double)maxWidth / maxHeight;
|
|||
|
|
//原图片的宽高比例
|
|||
|
|
double initRate = (double)initImage.Width / initImage.Height;
|
|||
|
|
|
|||
|
|
//原图与模版比例相等,直接缩放
|
|||
|
|
if (templateRate == initRate)
|
|||
|
|
{
|
|||
|
|
//按模版大小生成最终图片
|
|||
|
|
System.Drawing.Image templateImage = new System.Drawing.Bitmap(maxWidth, maxHeight);
|
|||
|
|
System.Drawing.Graphics templateG = System.Drawing.Graphics.FromImage(templateImage);
|
|||
|
|
templateG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
|
|||
|
|
templateG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
|
|||
|
|
templateG.Clear(Color.White);
|
|||
|
|
templateG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, maxWidth, maxHeight), new System.Drawing.Rectangle(0, 0, initImage.Width, initImage.Height), System.Drawing.GraphicsUnit.Pixel);
|
|||
|
|
templateImage.Save(destinationImagePath, System.Drawing.Imaging.ImageFormat.Jpeg);
|
|||
|
|
}
|
|||
|
|
//原图与模版比例不等,裁剪后缩放
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//裁剪对象
|
|||
|
|
System.Drawing.Image pickedImage = null;
|
|||
|
|
System.Drawing.Graphics pickedG = null;
|
|||
|
|
|
|||
|
|
//定位
|
|||
|
|
Rectangle fromR = new Rectangle(0, 0, 0, 0);//原图裁剪定位
|
|||
|
|
Rectangle toR = new Rectangle(0, 0, 0, 0);//目标定位
|
|||
|
|
|
|||
|
|
//宽为标准进行裁剪
|
|||
|
|
if (templateRate > initRate)
|
|||
|
|
{
|
|||
|
|
//裁剪对象实例化
|
|||
|
|
pickedImage = new System.Drawing.Bitmap(initImage.Width, (int)Math.Floor(initImage.Width / templateRate));
|
|||
|
|
pickedG = System.Drawing.Graphics.FromImage(pickedImage);
|
|||
|
|
|
|||
|
|
//裁剪源定位
|
|||
|
|
fromR.X = 0;
|
|||
|
|
fromR.Y = (int)Math.Floor((initImage.Height - initImage.Width / templateRate) / 2);
|
|||
|
|
fromR.Width = initImage.Width;
|
|||
|
|
fromR.Height = (int)Math.Floor(initImage.Width / templateRate);
|
|||
|
|
|
|||
|
|
//裁剪目标定位
|
|||
|
|
toR.X = 0;
|
|||
|
|
toR.Y = 0;
|
|||
|
|
toR.Width = initImage.Width;
|
|||
|
|
toR.Height = (int)Math.Floor(initImage.Width / templateRate);
|
|||
|
|
}
|
|||
|
|
//高为标准进行裁剪
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
pickedImage = new System.Drawing.Bitmap((int)Math.Floor(initImage.Height * templateRate), initImage.Height);
|
|||
|
|
pickedG = System.Drawing.Graphics.FromImage(pickedImage);
|
|||
|
|
|
|||
|
|
fromR.X = (int)Math.Floor((initImage.Width - initImage.Height * templateRate) / 2);
|
|||
|
|
fromR.Y = 0;
|
|||
|
|
fromR.Width = (int)Math.Floor(initImage.Height * templateRate);
|
|||
|
|
fromR.Height = initImage.Height;
|
|||
|
|
|
|||
|
|
toR.X = 0;
|
|||
|
|
toR.Y = 0;
|
|||
|
|
toR.Width = (int)Math.Floor(initImage.Height * templateRate);
|
|||
|
|
toR.Height = initImage.Height;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//设置质量
|
|||
|
|
pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
|
|||
|
|
pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
|
|||
|
|
|
|||
|
|
//裁剪
|
|||
|
|
pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
|
|||
|
|
|
|||
|
|
//按模版大小生成最终图片
|
|||
|
|
System.Drawing.Image templateImage = new System.Drawing.Bitmap(maxWidth, maxHeight);
|
|||
|
|
System.Drawing.Graphics templateG = System.Drawing.Graphics.FromImage(templateImage);
|
|||
|
|
templateG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
|
|||
|
|
templateG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
|
|||
|
|
templateG.Clear(Color.White);
|
|||
|
|
templateG.DrawImage(pickedImage, new System.Drawing.Rectangle(0, 0, maxWidth, maxHeight), new System.Drawing.Rectangle(0, 0, pickedImage.Width, pickedImage.Height), System.Drawing.GraphicsUnit.Pixel);
|
|||
|
|
|
|||
|
|
//关键质量控制
|
|||
|
|
//获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff
|
|||
|
|
ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
|
|||
|
|
ImageCodecInfo ici = null;
|
|||
|
|
foreach (ImageCodecInfo i in icis)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
if (i.MimeType == "image/jpeg" || i.MimeType == "image/bmp" || i.MimeType == "image/png" || i.MimeType == "image/gif")
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
ici = i;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
EncoderParameters ep = new EncoderParameters(1);
|
|||
|
|
ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);
|
|||
|
|
|
|||
|
|
//保存缩略图
|
|||
|
|
templateImage.Save(destinationImagePath, ici, ep);
|
|||
|
|
//templateImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
|
|||
|
|
|
|||
|
|
//释放资源
|
|||
|
|
templateG.Dispose();
|
|||
|
|
templateImage.Dispose();
|
|||
|
|
|
|||
|
|
pickedG.Dispose();
|
|||
|
|
pickedImage.Dispose();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//释放资源
|
|||
|
|
initImage.Dispose();
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region 等比缩放
|
|||
|
|
/// <summary>
|
|||
|
|
/// 图片等比缩放
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="postedFile">原图HttpPostedFile对象</param>
|
|||
|
|
/// <param name="destinationImagePath">缩略图存放地址</param>
|
|||
|
|
/// <param name="targetWidth">指定的最大宽度(0 不做缩放)</param>
|
|||
|
|
/// <param name="targetHeight">指定的最大高度(0 不做缩放)</param>
|
|||
|
|
/// <param name="watermarkText">水印文字(为""表示不使用水印)</param>
|
|||
|
|
/// <param name="watermarkImage">水印图片路径(为""表示不使用水印)</param>
|
|||
|
|
public static void MakeWatermarkImage(string originalImagePath, string destinationImagePath, System.Double targetWidth, System.Double targetHeight, string watermarkText, string watermarkImage)
|
|||
|
|
{
|
|||
|
|
//创建目录
|
|||
|
|
string dir = Path.GetDirectoryName(destinationImagePath);
|
|||
|
|
if (!Directory.Exists(dir))
|
|||
|
|
Directory.CreateDirectory(dir);
|
|||
|
|
|
|||
|
|
//原始图片(获取原始图片创建对象,并使用流中嵌入的颜色管理信息)
|
|||
|
|
System.Drawing.Image initImage = System.Drawing.Image.FromFile(originalImagePath);
|
|||
|
|
|
|||
|
|
//原图宽高均小于模版,不作处理,直接保存
|
|||
|
|
if ((initImage.Width <= targetWidth && initImage.Height <= targetHeight) || (targetWidth == 0 || targetHeight == 0))
|
|||
|
|
{
|
|||
|
|
//文字水印
|
|||
|
|
if (watermarkText != "")
|
|||
|
|
{
|
|||
|
|
using (System.Drawing.Graphics gWater = System.Drawing.Graphics.FromImage(initImage))
|
|||
|
|
{
|
|||
|
|
System.Drawing.Font fontWater = new Font("黑体", 10);
|
|||
|
|
System.Drawing.Brush brushWater = new SolidBrush(Color.White);
|
|||
|
|
gWater.DrawString(watermarkText, fontWater, brushWater, 10, 10);
|
|||
|
|
gWater.Dispose();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//透明图片水印
|
|||
|
|
if (watermarkImage != "")
|
|||
|
|
{
|
|||
|
|
if (File.Exists(watermarkImage))
|
|||
|
|
{
|
|||
|
|
//获取水印图片
|
|||
|
|
using (System.Drawing.Image wrImage = System.Drawing.Image.FromFile(watermarkImage))
|
|||
|
|
{
|
|||
|
|
//水印绘制条件:原始图片宽高均大于或等于水印图片
|
|||
|
|
if (initImage.Width >= wrImage.Width && initImage.Height >= wrImage.Height)
|
|||
|
|
{
|
|||
|
|
Graphics gWater = Graphics.FromImage(initImage);
|
|||
|
|
|
|||
|
|
//透明属性
|
|||
|
|
ImageAttributes imgAttributes = new ImageAttributes();
|
|||
|
|
ColorMap colorMap = new ColorMap();
|
|||
|
|
colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);
|
|||
|
|
colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);
|
|||
|
|
ColorMap[] remapTable = { colorMap };
|
|||
|
|
imgAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);
|
|||
|
|
|
|||
|
|
float[][] colorMatrixElements = {
|
|||
|
|
new float[] {1.0f, 0.0f, 0.0f, 0.0f, 0.0f},
|
|||
|
|
new float[] {0.0f, 1.0f, 0.0f, 0.0f, 0.0f},
|
|||
|
|
new float[] {0.0f, 0.0f, 1.0f, 0.0f, 0.0f},
|
|||
|
|
new float[] {0.0f, 0.0f, 0.0f, 0.5f, 0.0f},//透明度:0.5
|
|||
|
|
new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements);
|
|||
|
|
imgAttributes.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
|
|||
|
|
gWater.DrawImage(wrImage, new Rectangle(initImage.Width - wrImage.Width, initImage.Height - wrImage.Height, wrImage.Width, wrImage.Height), 0, 0, wrImage.Width, wrImage.Height, GraphicsUnit.Pixel, imgAttributes);
|
|||
|
|
|
|||
|
|
gWater.Dispose();
|
|||
|
|
}
|
|||
|
|
wrImage.Dispose();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//保存
|
|||
|
|
initImage.Save(destinationImagePath, System.Drawing.Imaging.ImageFormat.Jpeg);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//缩略图宽、高计算
|
|||
|
|
double newWidth = initImage.Width;
|
|||
|
|
double newHeight = initImage.Height;
|
|||
|
|
|
|||
|
|
//宽大于高或宽等于高(横图或正方)
|
|||
|
|
if (initImage.Width > initImage.Height || initImage.Width == initImage.Height)
|
|||
|
|
{
|
|||
|
|
//如果宽大于模版
|
|||
|
|
if (initImage.Width > targetWidth)
|
|||
|
|
{
|
|||
|
|
//宽按模版,高按比例缩放
|
|||
|
|
newWidth = targetWidth;
|
|||
|
|
newHeight = initImage.Height * (targetWidth / initImage.Width);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//高大于宽(竖图)
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//如果高大于模版
|
|||
|
|
if (initImage.Height > targetHeight)
|
|||
|
|
{
|
|||
|
|
//高按模版,宽按比例缩放
|
|||
|
|
newHeight = targetHeight;
|
|||
|
|
newWidth = initImage.Width * (targetHeight / initImage.Height);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//生成新图
|
|||
|
|
//新建一个bmp图片
|
|||
|
|
System.Drawing.Image newImage = new System.Drawing.Bitmap((int)newWidth, (int)newHeight);
|
|||
|
|
//新建一个画板
|
|||
|
|
System.Drawing.Graphics newG = System.Drawing.Graphics.FromImage(newImage);
|
|||
|
|
|
|||
|
|
//设置质量
|
|||
|
|
newG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
|
|||
|
|
newG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
|
|||
|
|
|
|||
|
|
//置背景色
|
|||
|
|
newG.Clear(Color.White);
|
|||
|
|
//画图
|
|||
|
|
newG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, newImage.Width, newImage.Height), new System.Drawing.Rectangle(0, 0, initImage.Width, initImage.Height), System.Drawing.GraphicsUnit.Pixel);
|
|||
|
|
|
|||
|
|
//文字水印
|
|||
|
|
if (watermarkText != "")
|
|||
|
|
{
|
|||
|
|
using (System.Drawing.Graphics gWater = System.Drawing.Graphics.FromImage(newImage))
|
|||
|
|
{
|
|||
|
|
System.Drawing.Font fontWater = new Font("宋体", 10);
|
|||
|
|
System.Drawing.Brush brushWater = new SolidBrush(Color.White);
|
|||
|
|
gWater.DrawString(watermarkText, fontWater, brushWater, 10, 10);
|
|||
|
|
gWater.Dispose();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//透明图片水印
|
|||
|
|
if (watermarkImage != "")
|
|||
|
|
{
|
|||
|
|
if (File.Exists(watermarkImage))
|
|||
|
|
{
|
|||
|
|
//获取水印图片
|
|||
|
|
using (System.Drawing.Image wrImage = System.Drawing.Image.FromFile(watermarkImage))
|
|||
|
|
{
|
|||
|
|
//水印绘制条件:原始图片宽高均大于或等于水印图片
|
|||
|
|
if (newImage.Width >= wrImage.Width && newImage.Height >= wrImage.Height)
|
|||
|
|
{
|
|||
|
|
Graphics gWater = Graphics.FromImage(newImage);
|
|||
|
|
|
|||
|
|
//透明属性
|
|||
|
|
ImageAttributes imgAttributes = new ImageAttributes();
|
|||
|
|
ColorMap colorMap = new ColorMap();
|
|||
|
|
colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);
|
|||
|
|
colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);
|
|||
|
|
ColorMap[] remapTable = { colorMap };
|
|||
|
|
imgAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);
|
|||
|
|
|
|||
|
|
float[][] colorMatrixElements = {
|
|||
|
|
new float[] {1.0f, 0.0f, 0.0f, 0.0f, 0.0f},
|
|||
|
|
new float[] {0.0f, 1.0f, 0.0f, 0.0f, 0.0f},
|
|||
|
|
new float[] {0.0f, 0.0f, 1.0f, 0.0f, 0.0f},
|
|||
|
|
new float[] {0.0f, 0.0f, 0.0f, 0.5f, 0.0f},//透明度:0.5
|
|||
|
|
new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements);
|
|||
|
|
imgAttributes.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
|
|||
|
|
gWater.DrawImage(wrImage, new Rectangle(newImage.Width - wrImage.Width, newImage.Height - wrImage.Height, wrImage.Width, wrImage.Height), 0, 0, wrImage.Width, wrImage.Height, GraphicsUnit.Pixel, imgAttributes);
|
|||
|
|
gWater.Dispose();
|
|||
|
|
}
|
|||
|
|
wrImage.Dispose();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//保存缩略图
|
|||
|
|
newImage.Save(destinationImagePath, System.Drawing.Imaging.ImageFormat.Jpeg);
|
|||
|
|
|
|||
|
|
//释放资源
|
|||
|
|
newG.Dispose();
|
|||
|
|
newImage.Dispose();
|
|||
|
|
initImage.Dispose();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region 其它
|
|||
|
|
/// <summary>
|
|||
|
|
/// 判断文件类型是否为WEB格式图片
|
|||
|
|
/// (注:JPG,GIF,BMP,PNG)
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="contentType">HttpPostedFile.ContentType</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static bool IsWebImage(string contentType)
|
|||
|
|
{
|
|||
|
|
if (contentType == "image/pjpeg" || contentType == "image/jpeg" || contentType == "image/gif" || contentType == "image/bmp" || contentType == "image/png")
|
|||
|
|
{
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private static ImageCodecInfo GetEncoderInfo(String mimeType)
|
|||
|
|
{
|
|||
|
|
int j;
|
|||
|
|
ImageCodecInfo[] encoders;
|
|||
|
|
encoders = ImageCodecInfo.GetImageEncoders();
|
|||
|
|
for (j = 0; j < encoders.Length; ++j)
|
|||
|
|
{
|
|||
|
|
if (encoders[j].MimeType == mimeType)
|
|||
|
|
return encoders[j];
|
|||
|
|
}
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region 生成缩略图
|
|||
|
|
/// <summary>
|
|||
|
|
/// 生成缩略图
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="originalImagePath">源图路径(物理路径)</param>
|
|||
|
|
/// <param name="thumbnailPath">缩略图路径(物理路径)</param>
|
|||
|
|
/// <param name="width">缩略图宽度</param>
|
|||
|
|
/// <param name="height">缩略图高度</param>
|
|||
|
|
/// <param name="mode">生成缩略图的方式 hw|w|h|cut </param>
|
|||
|
|
|
|||
|
|
public static void CutImage(string originalImagePath, string thumbnailPath, int width, int height, string mode)
|
|||
|
|
{
|
|||
|
|
Image image = Image.FromFile(originalImagePath);
|
|||
|
|
|
|||
|
|
int cutWidth = width;
|
|||
|
|
int curHeight = height;
|
|||
|
|
int x = 0;
|
|||
|
|
int y = 0;
|
|||
|
|
int oriWidth = image.Width;
|
|||
|
|
int oriHeight = image.Height;
|
|||
|
|
string cutMode = mode;
|
|||
|
|
if (cutMode != null)
|
|||
|
|
{
|
|||
|
|
cutMode = cutMode.ToLower();
|
|||
|
|
if (cutMode != "hw")
|
|||
|
|
{
|
|||
|
|
if (cutMode == "w")
|
|||
|
|
{
|
|||
|
|
curHeight = (image.Height * width) / image.Width;
|
|||
|
|
}
|
|||
|
|
else if (cutMode == "h")
|
|||
|
|
{
|
|||
|
|
cutWidth = (image.Width * height) / image.Height;
|
|||
|
|
}
|
|||
|
|
else if (cutMode == "cut")
|
|||
|
|
{
|
|||
|
|
if ((((double)image.Width) / ((double)image.Height)) > (((double)cutWidth) / ((double)curHeight)))
|
|||
|
|
{
|
|||
|
|
oriHeight = image.Height;
|
|||
|
|
oriWidth = (image.Height * cutWidth) / curHeight;
|
|||
|
|
y = 0;
|
|||
|
|
x = (image.Width - oriWidth) / 2;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
oriWidth = image.Width;
|
|||
|
|
oriHeight = (image.Width * height) / cutWidth;
|
|||
|
|
x = 0;
|
|||
|
|
y = (image.Height - oriHeight) / 2;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
Image image2 = new Bitmap(cutWidth, curHeight);
|
|||
|
|
Graphics graphics = Graphics.FromImage(image2);
|
|||
|
|
graphics.Clear(Color.Transparent);
|
|||
|
|
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
|||
|
|
graphics.SmoothingMode = SmoothingMode.HighQuality;
|
|||
|
|
|
|||
|
|
graphics.DrawImage(image, new Rectangle(0, 0, cutWidth, curHeight), new Rectangle(x, y, oriWidth, oriHeight), GraphicsUnit.Pixel);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
image2.Save(thumbnailPath, ImageFormat.Jpeg);
|
|||
|
|
}
|
|||
|
|
catch (Exception exception)
|
|||
|
|
{
|
|||
|
|
throw exception;
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
image.Dispose();
|
|||
|
|
image2.Dispose();
|
|||
|
|
graphics.Dispose();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
}
|
|||
|
|
}
|