您的位置:首页 > 其它

图片操作:生成缩略图、添加水印、截取图片等

2013-08-21 18:44 525 查看
using System;

using System.Drawing;

using System.Drawing.Imaging;

using System.IO;

using System.Web;

namespace XXXX.Common

{

/// <summary>

/// 图片操作:生成缩略图、添加水印、截取图片等

/// </summary>

public class ImagesHelper

{

/// <summary>

/// 根据文件流获得图片宽度

/// </summary>

/// <param name="file"></param>

/// <returns></returns>

public static int getImgWidth(Stream stream)

{

Image img = Image.FromStream(stream);

int result = img.Width;

img.Dispose();

stream.Dispose();

return result;

}

/// <summary>

/// 根据图片路径获得图片宽度

/// </summary>

/// <param name="filePath"></param>

/// <returns></returns>

public static int getImgWidth(string filePath)

{

Image img = Image.FromFile(filePath);

int result = img.Width;

img.Dispose();

return result;

}

#region 从文件流生成缩略图

/// <summary>

/// 从文件流生成缩略图

/// </summary>

/// <param name="stream">数据IO流</param>

/// <param name="savePath"></param>

/// <param name="width"></param>

/// <param name="height"></param>

/// <param name="scale"></param>

/// <returns></returns>

public static bool GetThumbNail(Stream stream, string savePath, int width, int height, ThumbNailScale scale)

{

//缩略图

Image img = Image.FromStream(stream);

stream.Dispose();

int towidth = width;

int toheight = height;

int x = 0;

int y = 0;

int ow = img.Width;

int oh = img.Height;

//如果图片小于指定宽度

if (ow < width)

width = ow;

if (oh < height)

height = oh;

switch (scale)

{

case ThumbNailScale.Appointed:

break;

case ThumbNailScale.ScaleWidth:

toheight = img.Height * width / img.Width;

break;

case ThumbNailScale.ScaleHeight:

towidth = img.Width * height / img.Height;

break;

case ThumbNailScale.Cut:

if ((double)img.Width / (double)img.Height > (double)towidth / (double)toheight)

{

oh = img.Height;

ow = img.Height * towidth / toheight;

y = 0;

x = (img.Width - ow) / 2;

}

else

{

ow = img.Width;

oh = img.Width * height / towidth;

x = 0;

y = (img.Height - oh) / 2;

}

break;

case ThumbNailScale.ScaleDown:

double Tw, Th;

Tw = width;

Th = height * (Convert.ToDouble(oh) / Convert.ToDouble(ow));

if (Th > height)

{

Th = height;

Tw = width * (Convert.ToDouble(ow) / Convert.ToDouble(oh));

}

towidth = Convert.ToInt32(Tw);

toheight = Convert.ToInt32(Th);

break;

default:

break;

}

//新建一个bmp图片

Image bitmap = new Bitmap(towidth, toheight);

//新建一个画板

Graphics g = Graphics.FromImage(bitmap);

//设置高质量插值法

g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

//设置高质量,低速度呈现平滑程度

g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

//清空画布并以透明背景色填充

g.Clear(Color.Transparent);

//在指定位置并且按指定大小绘制原图片的指定部分

g.DrawImage(img, new Rectangle(0, 0, towidth, toheight),

new Rectangle(x, y, ow, oh),

GraphicsUnit.Pixel);

try

{

//以jpg格式保存缩略图

bitmap.Save(savePath, ImageFormat.Jpeg);

}

catch (Exception ex)

{

Logger.Write(string.Format("从文件流生成缩略图:{0}", ex.Message), Logger.MsgType.Error);

return false;

}

finally

{

img.Dispose();

bitmap.Dispose();

g.Dispose();

}

return true;

}

#endregion

#region 从文件路径生成缩略图

/// <summary>

/// 从图片路径生成缩略图

/// </summary>

/// <param name="originalImagePath">图片路径</param>

/// <param name="savePath">保存路径</param>

/// <param name="width">缩略图宽度</param>

/// <param name="height">缩略图高度</param>

/// <param name="mode">HW:指定高宽缩放(可能变形) W://指定宽,高按比例 H://指定高,宽按比例 Cut://指定高宽裁减(不变形) </param>

/// <returns></returns>

public static bool GetThumbNail(string originalImagePath, string savePath, int width, int height, ThumbNailScale scale)

{

//缩略图

Image img = Image.FromFile(originalImagePath);

int towidth = width;

int toheight = height;

int x = 0;

int y = 0;

int ow = img.Width;

int oh = img.Height;

//如果图片小于指定宽度

if (ow < width)

width = ow;

switch (scale)

{

case ThumbNailScale.Appointed:

break;

case ThumbNailScale.ScaleWidth:

toheight = img.Height * width / img.Width;

break;

case ThumbNailScale.ScaleHeight:

towidth = img.Width * height / img.Height;

break;

case ThumbNailScale.Cut:

if ((double)img.Width / (double)img.Height > (double)towidth / (double)toheight)

{

oh = img.Height;

ow = img.Height * towidth / toheight;

y = 0;

x = (img.Width - ow) / 2;

}

else

{

ow = img.Width;

oh = img.Width * height / towidth;

x = 0;

y = (img.Height - oh) / 2;

}

break;

case ThumbNailScale.ScaleDown:

double Tw, Th;

Tw = width;

Th = height * (Convert.ToDouble(oh) / Convert.ToDouble(ow));

if (Th > height)

{

Th = height;

Tw = width * (Convert.ToDouble(ow) / Convert.ToDouble(oh));

}

towidth = Convert.ToInt32(Tw);

toheight = Convert.ToInt32(Th);

break;

default:

break;

}

//新建一个bmp图片

Image bitmap = new Bitmap(towidth, toheight);

//新建一个画板

Graphics g = Graphics.FromImage(bitmap);

//设置高质量插值法

g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

//设置高质量,低速度呈现平滑程度

g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

//清空画布并以透明背景色填充

g.Clear(Color.White);

//在指定位置并且按指定大小绘制原图片的指定部分

g.DrawImage(img, new Rectangle(0, 0, towidth, toheight),

new Rectangle(x, y, ow, oh),

GraphicsUnit.Pixel);

try

{

//以jpg格式保存缩略图

bitmap.Save(savePath, ImageFormat.Jpeg);

}

catch (Exception e)

{

throw e;

}

finally

{

img.Dispose();

bitmap.Dispose();

g.Dispose();

}

return true;

}

#endregion

#region 获取图片格式

/// <summary>

/// 获取图片格式

/// </summary>

/// <param name="strContentType"></param>

/// <returns>返回图片格式</returns>

public static ImageFormat GetImageType(object strContentType)

{

if ((strContentType.ToString().ToLower()) == "image/pjpeg")

{

return ImageFormat.Jpeg;

}

else if ((strContentType.ToString().ToLower()) == "image/gif")

{

return ImageFormat.Gif;

}

else if ((strContentType.ToString().ToLower()) == "image/bmp")

{

return ImageFormat.Bmp;

}

else if ((strContentType.ToString().ToLower()) == "image/tiff")

{

return ImageFormat.Tiff;

}

else if ((strContentType.ToString().ToLower()) == "image/x-icon")

{

return ImageFormat.Icon;

}

else if ((strContentType.ToString().ToLower()) == "image/x-png")

{

return ImageFormat.Png;

}

else if ((strContentType.ToString().ToLower()) == "image/x-emf")

{

return ImageFormat.Emf;

}

else if ((strContentType.ToString().ToLower()) == "image/x-exif")

{

return ImageFormat.Exif;

}

else if ((strContentType.ToString().ToLower()) == "image/x-wmf")

{

return ImageFormat.Wmf;

}

else

{

return ImageFormat.MemoryBmp;

}

}

#endregion

/// <summary>

/// 生成水印图片

/// </summary>

/// <param name="sourceFile"></param>

/// <param name="saveFile">保存文件路径</param>

/// <returns></returns>

public static bool MakeWaterImage(Stream sourceFile, string saveFile)

{

bool result = false;

//水印图片

try

{

Image imgPhoto = Image.FromStream(sourceFile);

sourceFile.Close();

sourceFile.Dispose();

int phWidth = imgPhoto.Width;

int phHeight = imgPhoto.Height;

Bitmap bmPhoto = new Bitmap(phWidth, phHeight, PixelFormat.Format24bppRgb);

bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);

Image imgWatermark = new Bitmap(System.Web.HttpContext.Current.Server.MapPath("/images/watermark.png"));

int wmWidth = imgWatermark.Width;

int wmHeight = imgWatermark.Height;

if (phWidth > (wmWidth + 100) && phHeight > (wmHeight + 100))

{

Graphics grPhoto = Graphics.FromImage(bmPhoto);

grPhoto.Clear(Color.White);

grPhoto.DrawImage(imgPhoto, new Rectangle(0, 0, phWidth, phHeight), 0, 0, phWidth, phHeight, GraphicsUnit.Pixel);

grPhoto.Dispose();

//添加水印图片

using (Bitmap bmWatermark = new Bitmap(bmPhoto))

{

bmWatermark.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);

Graphics grWatermark = Graphics.FromImage(bmWatermark);

using (ImageAttributes imageAttributes = new ImageAttributes())

{

//ColorMap colorMap = new ColorMap();

//colorMap.OldColor = Color.FromArgb(255, 255, 255,255);

//colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);

//ColorMap[] remapTable = { colorMap };

//imageAttributes.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, 1.0f, 0.0f }, new float[] { 0.0f, 0.0f, 0.0f, 0.0f, 1.0f } };

ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements);

imageAttributes.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

int xPosOfWm = ((phWidth - wmWidth) - 2);

int yPosOfWm = ((phHeight - wmHeight) - 2);

grWatermark.DrawImage(imgWatermark, new Rectangle(xPosOfWm, yPosOfWm, wmWidth, wmHeight), 0, 0, wmWidth, wmHeight, GraphicsUnit.Pixel, imageAttributes);

}

imgPhoto = bmWatermark;

grWatermark.Dispose();

imgPhoto.Save(saveFile, ImageFormat.Jpeg);

}

result = true;

}

else

{

result = false;

}

imgWatermark.Dispose();

bmPhoto.Dispose();

imgPhoto.Dispose();

}

catch(Exception ex)

{

Logger.Write(string.Format("生成水印图片错误:{0}",ex.Message), Logger.MsgType.Information);

try

{

Image imgPhoto2 = Image.FromStream(sourceFile);

imgPhoto2.Save(saveFile, ImageFormat.Jpeg);

imgPhoto2.Dispose();

result = true;

}

catch

{

result = false;

}

}

return result;

}

/// <summary>

/// 生成水印图片

/// </summary>

/// <param name="sourceFile"></param>

/// <param name="saveFile">保存文件路径</param>

/// <param name="Location">位置 0 - 右下角 1 - 居中 2 - 右上角 3 - 左下角</param>

/// <returns></returns>

public static bool MakeWaterImage(Stream sourceFile, string saveFile, ImagePosition Position)

{

bool result = false;

//水印图片

try

{

Image imgPhoto = Image.FromStream(sourceFile);

int phWidth = imgPhoto.Width;

int phHeight = imgPhoto.Height;

Bitmap bmPhoto = new Bitmap(phWidth, phHeight, PixelFormat.Format24bppRgb);

bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);

Image imgWatermark = new Bitmap(System.Web.HttpContext.Current.Server.MapPath("/images/watermark.png"));

int wmWidth = imgWatermark.Width;

int wmHeight = imgWatermark.Height;

if (phWidth > (wmWidth + 100) && phHeight > (wmHeight + 100))

{

Graphics grPhoto = Graphics.FromImage(bmPhoto);

grPhoto.Clear(Color.White);

grPhoto.DrawImage(imgPhoto, new Rectangle(0, 0, phWidth, phHeight), 0, 0, phWidth, phHeight, GraphicsUnit.Pixel);

grPhoto.Dispose();

//添加水印图片

using (Bitmap bmWatermark = new Bitmap(bmPhoto))

{

bmWatermark.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);

Graphics grWatermark = Graphics.FromImage(bmWatermark);

using (ImageAttributes imageAttributes = new ImageAttributes())

{

//ColorMap colorMap = new ColorMap();

//colorMap.OldColor = Color.FromArgb(255, 255, 255,255);

//colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);

//ColorMap[] remapTable = { colorMap };

//imageAttributes.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, 1.0f, 0.0f }, new float[] { 0.0f, 0.0f, 0.0f, 0.0f, 1.0f } };

ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements);

imageAttributes.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

int xPosOfWm = 0;

int yPosOfWm = 0;

switch (Position)

{

case ImagePosition.BottomRight:

xPosOfWm = ((phWidth - wmWidth) - 2);

yPosOfWm = ((phHeight - wmHeight) - 2);

break;

case ImagePosition.TopLeft:

xPosOfWm = 2;

yPosOfWm = 2;

break;

case ImagePosition.TopRigth:

xPosOfWm = ((phWidth - wmWidth) - 2);

yPosOfWm = 2;

break;

case ImagePosition.BottomLeft:

xPosOfWm = 2;

yPosOfWm = ((phHeight - wmHeight) - 2);

break;

case ImagePosition.Center:

xPosOfWm = ((phWidth / 2) - (wmWidth / 2));

yPosOfWm = ((phHeight / 2) - (wmHeight / 2));

break;

}

grWatermark.DrawImage(imgWatermark, new Rectangle(xPosOfWm, yPosOfWm, wmWidth, wmHeight), 0, 0, wmWidth, wmHeight, GraphicsUnit.Pixel, imageAttributes);

}

imgPhoto = bmWatermark;

grWatermark.Dispose();

imgPhoto.Save(saveFile, ImageFormat.Jpeg);

}

result = true;

}

else

{

Image imgPhoto2 = Image.FromStream(sourceFile);

imgPhoto2.Save(saveFile, ImageFormat.Jpeg);

imgPhoto2.Dispose();

result = true;

}

imgWatermark.Dispose();

bmPhoto.Dispose();

imgPhoto.Dispose();

}

catch

{

try

{

Image imgPhoto2 = Image.FromStream(sourceFile);

imgPhoto2.Save(saveFile, ImageFormat.Jpeg);

imgPhoto2.Dispose();

result = true;

}

catch

{

result = false;

}

}

sourceFile.Close();

sourceFile.Dispose();

return result;

}

#region 从图片中截取一张指定大小的图片

/// <summary>

/// 从图片中截取部分生成新图

/// </summary>

/// <param name="sFromFilePath">原始图片</param>

/// <param name="saveFilePath">生成新图</param>

/// <param name="width">截取图片宽度</param>

/// <param name="height">截取图片高度</param>

/// <param name="spaceX">截图图片X坐标</param>

/// <param name="spaceY">截取图片Y坐标</param>

public static void CaptureImage(string sFromFilePath, string saveFilePath, int width, int height, int spaceX, int spaceY)

{

//载入底图

Image fromImage = Image.FromFile(sFromFilePath);

int x = 0; //截取X坐标

int y = 0; //截取Y坐标

//原图宽与生成图片宽 之差

//当小于0(即原图宽小于要生成的图)时,新图宽度为较小者 即原图宽度 X坐标则为0

//当大于0(即原图宽大于要生成的图)时,新图宽度为设置值 即width X坐标则为 sX与spaceX之间较小者

//Y方向同理

int sX = fromImage.Width - width;

int sY = fromImage.Height - height;

if (sX > 0)

{

x = sX > spaceX ? spaceX : sX;

}

else

{

width = fromImage.Width;

}

if (sY > 0)

{

y = sY > spaceY ? spaceY : sY;

}

else

{

height = fromImage.Height;

}

//创建新图位图

Bitmap bitmap = new Bitmap(width, height);

//创建作图区域

Graphics graphic = Graphics.FromImage(bitmap);

//截取原图相应区域写入作图区

graphic.DrawImage(fromImage, 0, 0, new Rectangle(x, y, width, height), GraphicsUnit.Pixel);

//从作图区生成新图

Image saveImage = Image.FromHbitmap(bitmap.GetHbitmap());

//保存图象

saveImage.Save(saveFilePath, ImageFormat.Jpeg);

//释放资源

saveImage.Dispose();

bitmap.Dispose();

graphic.Dispose();

}

#endregion

public enum ImagePosition

{

/// <summary>

/// 居中

/// </summary>

Center,

/// <summary>

/// 左上角

/// </summary>

TopLeft,

/// <summary>

/// 左下角

/// </summary>

BottomLeft,

/// <summary>

/// 右下角

/// </summary>

BottomRight,

/// <summary>

/// 右上角

/// </summary>

TopRigth

}

/// <summary>

/// 图片

/// </summary>

public enum ThumbNailScale

{

/// <summary>

/// 指定高宽缩放,图片长宽不一致会变形

/// </summary>

Appointed,

/// <summary>

/// 指定宽,高按比例

/// </summary>

ScaleWidth,

/// <summary>

/// 指定高,宽按比例

/// </summary>

ScaleHeight,

/// <summary>

/// 指定高宽裁减,可能只显示部分图片

/// </summary>

Cut,

/// <summary>

/// 按图片比例缩放,不变形,显示全部图片(推荐)

/// </summary>

ScaleDown

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: