读书人

【话说有DBHper、IOHelper可有ImgHe

发布时间: 2013-01-25 15:55:29 作者: rapoo

【话说有DBHper、IOHelper,可有ImgHelper???】
前面2个Class几乎天天用。百度和谷歌搜了下,好像针对图片操作的Class(这里说ImgHelper)曝光的比较少,比如生成小图啊、水印啊、裁剪啊这些功能

小弟求这方面的Class,一个函数方法也行,我收集大家的,然后整合一下发到论坛给各位使用
【话说有DBHper、IOHelper,可有ImgHelper?】,该如何解决 图片处理的内置类型就已不错了。 不过还可以进行一下封装。 很简单,看看graphics类型就好了
[解决办法]
有微软自己的webmatrix包里就集合了WebImage工具他就是你要的ImgHelper
[解决办法]
AspJpeg dll 这个也可以
[解决办法]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

using YDSystem.ZXF.Config;

namespace YDSystem.ZXF.Common.Configurable
{
/// <summary>
/// 图像处理帮助类
/// </summary>
public class ImageWorker
{
//会产生graphics异常的PixelFormat,索引颜色
private static PixelFormat[] indexedPixelFormats = {
PixelFormat.Undefined,
PixelFormat.DontCare,
PixelFormat.Format16bppArgb1555,
PixelFormat.Format1bppIndexed,
PixelFormat.Format4bppIndexed,
PixelFormat.Format8bppIndexed


};

#region 私有方法
/// <summary>
/// 判断图片的PixelFormat 是否在 引发异常的 PixelFormat 之中
/// </summary>
/// <param name="imgPixelFormat">原图片的PixelFormat</param>
/// <returns></returns>
private static bool IsIndexedPixelFormat(PixelFormat imgPixelFormat)
{
foreach (PixelFormat pf in indexedPixelFormats)
{
if (pf.Equals(imgPixelFormat)) return true;
}
return false;
}

/// <summary>
/// 计算水印的位置
/// </summary>
/// <param name="oWidth">源图片宽度</param>
/// <param name="oHeight">源图片高度</param>
/// <param name="markWidth">水印图片宽度</param>
/// <param name="markHeight">鲨鱼图片高度</param>
/// <returns></returns>
private static PointF CountWatermarkPosition(YDSystem.ZXF.Config.WatermarkPosition position, int width, int height, int markWidth, int markHeight)
{
float padding = 15.0f; //水印与图片边框间的距离

PointF point = new PointF();

//确定水印位置
switch (position)
{
case WatermarkPosition.Center: //居中
point.X = (float)((width - markWidth) / 2);
point.Y = (float)((height - markHeight) / 2);
break;


case WatermarkPosition.NorthEast: //右上
point.X = (float)(width - markWidth - padding);
point.Y = padding;
break;
case WatermarkPosition.East: //右中
point.X = (float)(width - markWidth - padding);
point.Y = (float)((height - markHeight) / 2);
break;
case WatermarkPosition.SouthEast: //右下
point.X = (float)(width - markWidth - padding);
point.Y = (float)(height - markHeight - padding);
break;
case WatermarkPosition.South: //中下
point.X = (float)((width - markWidth) / 2);
point.Y = (float)(height - markHeight - padding);
break;
case WatermarkPosition.SouthWest: //左下
point.X = padding;
point.Y = (float)(height - markHeight - padding);
break;
case WatermarkPosition.West: //左中
point.X = padding;
point.Y = (float)((height - markHeight) / 2);
break;
case WatermarkPosition.NorthWest: //左上


point.X = padding;
point.Y = padding;
break;
case WatermarkPosition.North: //中上
point.X = (float)((width - markWidth) / 2);
point.Y = padding;
break;
}//switch

return point;
}
#endregion

/// <summary>
/// 按指定的配置添加水印
/// </summary>
/// <param name="image">待添加水印的图片</param>
/// <param name="config">指定的YDSystem.ZXF.Config.WatermarkConfigInfo水印配置实例</param>
public static void AddWatermark(ref Image image, YDSystem.ZXF.Config.WatermarkConfigInfo config)
{
if (image == null) //源图片不存在
{
return;
}

int height = image.Height; //原图片高度
int width = image.Width; //原图片宽度

if (IsIndexedPixelFormat(image.PixelFormat)) //索引色图片,必须转化为bitmap进行处理,否则会报异常
{
//创建bitmap对象
Bitmap bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb);
Graphics gr = Graphics.FromImage(bmp);
gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
gr.SmoothingMode = SmoothingMode.HighQuality;
gr.CompositingQuality = CompositingQuality.HighQuality;
//画到bitmap上


gr.DrawImage(image, new Rectangle(0, 0, width, height), new Rectangle(0, 0, width, height), GraphicsUnit.Pixel);
//复制
image = (Image)bmp.Clone();
//释放资源
gr.Dispose();
bmp.Dispose();
}

//创建Graphics对象
Graphics g = Graphics.FromImage(image);
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.SmoothingMode = SmoothingMode.HighQuality;
g.CompositingQuality = CompositingQuality.HighQuality;

PointF point = new PointF(); //水印位置

if (config.Type == WatermarkType.Text) //水印类型是文字
{
//创建字体
Font font = new Font(config.FontName, config.FontSize, config.FontStyle, GraphicsUnit.Pixel);

//测试字符串高度及宽度
SizeF textSize = g.MeasureString(config.Text, font);

//保存字符串宽及高
int markWidth = (int)textSize.Width;
int markHeight = (int)textSize.Height;

//确定水印位置
point = CountWatermarkPosition(config.Position, width, height, markWidth, markHeight);

//确定文本颜色
Color color = Color.FromArgb(Convert.ToInt32(config.FontColor.Substring(1), 16)); //删除颜色#666666前面的“#”
SolidBrush brush = new SolidBrush(Color.FromArgb(config.Opacity * 255 / 100, color));

//用白色brush画字符串阴影


g.DrawString(config.Text, font, new SolidBrush(Color.White), point.X + 1, point.Y + 1);

//画出字符串
g.DrawString(config.Text, font, brush, point);

//释放资源
g.Dispose();

}//if
else //水印类型是图片
{
//获取水印图片
Image markImage = null;
ImageAttributes attributes = new ImageAttributes();

try
{
markImage = Image.FromFile(Utils.MapPath(config.ImagePath));

//获取水印图片宽和高
int markWidth = markImage.Width;
int markHeight = markImage.Height;

//确定水印位置
point = CountWatermarkPosition(config.Position, width, height, markWidth, markHeight);

//透明水印
float[][] colorMatrixParam = {
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,config.Opacity * 1.0f / 100,0.0f}, //透明度
new float[] {0.0f,0.0f,0.0f,0.0f,1.0f}
};

ColorMatrix colorMatrix = new ColorMatrix(colorMatrixParam);

//重设图像属性
attributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

//铬上水印
g.DrawImage(markImage, new Rectangle((int)point.X, (int)point.Y, markWidth, markHeight), 0, 0, markWidth, markHeight, GraphicsUnit.Pixel, attributes);
}
catch (Exception ex)
{
Utils.ShowAdminError("水印图片不存在", ex.Message);
}
finally
{
//释放资源
attributes.Dispose();
markImage.Dispose();
g.Dispose();
}

}//else
}

/// <summary>
/// 按默认的水印配置添加水印
/// </summary>
/// <param name="image">待添加水印的图片实例</param>


public static void AddDefaultWatermark(ref Image image)
{
AddWatermark(ref image, GlobalConfigManage.LoadConfig().WatermarkSettings);
}

/// <summary>
/// 按默认的水印配置添加水印
/// </summary>
/// <param name="image">待添加水印的图片实例</param>
public static void AddArticleWatermark(ref Image image)
{
WatermarkConfigInfo config = null;
if (GlobalConfigManage.LoadConfig().UseDefaultWatermarkFirst) //默认配置优先
{
config = GlobalConfigManage.LoadConfig().WatermarkSettings;
}
else
{
config = ArticleConfigManage.LoadConfig().WatermarkSettings;
}
AddWatermark(ref image, config);
}

读书人网 >asp.net

热点推荐