using System;
using System.IO;
using System.Web;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.Xml.Serialization; namespace ZMM.Core
{
/// <summary>
/// IO帮助类
/// </summary>
public class IOHelper
{
//是否已经加载了JPEG编码解码器
private static bool _isloadjpegcodec = false;
//当前系统安装的JPEG编码解码器
private static ImageCodecInfo _jpegcodec = null; /// <summary>
/// 获得文件物理路径
/// </summary>
/// <returns></returns>
public static string GetMapPath(string path)
{
if (HttpContext.Current != null)
{
return HttpContext.Current.Server.MapPath(path);
}
else
{
return System.Web.Hosting.HostingEnvironment.MapPath(path);
}
} #region 序列化 /// <summary>
/// XML序列化
/// </summary>
/// <param name="obj">序列对象</param>
/// <param name="filePath">XML文件路径</param>
/// <returns>是否成功</returns>
public static bool SerializeToXml(object obj, string filePath)
{
bool result = false; FileStream fs = null;
try
{
fs = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
XmlSerializer serializer = new XmlSerializer(obj.GetType());
serializer.Serialize(fs, obj);
result = true;
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (fs != null)
fs.Close();
}
return result; } /// <summary>
/// XML反序列化
/// </summary>
/// <param name="type">目标类型(Type类型)</param>
/// <param name="filePath">XML文件路径</param>
/// <returns>序列对象</returns>
public static object DeserializeFromXML(Type type, string filePath)
{
FileStream fs = null;
try
{
fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
XmlSerializer serializer = new XmlSerializer(type);
return serializer.Deserialize(fs);
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (fs != null)
fs.Close();
}
} #endregion #region 水印,缩略图 /// <summary>
/// 获得当前系统安装的JPEG编码解码器
/// </summary>
/// <returns></returns>
public static ImageCodecInfo GetJPEGCodec()
{
if (_isloadjpegcodec == true)
return _jpegcodec; ImageCodecInfo[] codecsList = ImageCodecInfo.GetImageEncoders();
foreach (ImageCodecInfo codec in codecsList)
{
if (codec.MimeType.IndexOf("jpeg") > -)
{
_jpegcodec = codec;
break;
} }
_isloadjpegcodec = true;
return _jpegcodec;
} /// <summary>
/// 生成缩略图
/// </summary>
/// <param name="imagePath">图片路径</param>
/// <param name="thumbPath">缩略图路径</param>
/// <param name="width">缩略图宽度</param>
/// <param name="height">缩略图高度</param>
/// <param name="mode">生成缩略图的方式</param>
public static void GenerateThumb(string imagePath, string thumbPath, int width, int height, string mode)
{
Image image = Image.FromFile(imagePath); string extension = imagePath.Substring(imagePath.LastIndexOf(".")).ToLower();
ImageFormat imageFormat = null;
switch (extension)
{
case ".jpg":
case ".jpeg":
imageFormat = ImageFormat.Jpeg;
break;
case ".bmp":
imageFormat = ImageFormat.Bmp;
break;
case ".png":
imageFormat = ImageFormat.Png;
break;
case ".gif":
imageFormat = ImageFormat.Gif;
break;
default:
imageFormat = ImageFormat.Jpeg;
break;
} int toWidth = width > ? width : image.Width;
int toHeight = height > ? height : image.Height; int x = ;
int y = ;
int ow = image.Width;
int oh = image.Height; switch (mode)
{
case "HW"://指定高宽缩放(可能变形)
break;
case "W"://指定宽,高按比例
toHeight = image.Height * width / image.Width;
break;
case "H"://指定高,宽按比例
toWidth = image.Width * height / image.Height;
break;
case "Cut"://指定高宽裁减(不变形)
if ((double)image.Width / (double)image.Height > (double)toWidth / (double)toHeight)
{
oh = image.Height;
ow = image.Height * toWidth / toHeight;
y = ;
x = (image.Width - ow) / ;
}
else
{
ow = image.Width;
oh = image.Width * height / toWidth;
x = ;
y = (image.Height - oh) / ;
}
break;
default:
break;
} //新建一个bmp
Image bitmap = new Bitmap(toWidth, toHeight); //新建一个画板
Graphics g = Graphics.FromImage(bitmap); //设置高质量插值法
g.InterpolationMode = InterpolationMode.High; //设置高质量,低速度呈现平滑程度
g.SmoothingMode = SmoothingMode.HighQuality; //清空画布并以透明背景色填充
g.Clear(Color.Transparent); //在指定位置并且按指定大小绘制原图片的指定部分
g.DrawImage(image,
new Rectangle(, , toWidth, toHeight),
new Rectangle(x, y, ow, oh),
GraphicsUnit.Pixel); try
{
bitmap.Save(thumbPath, imageFormat);
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (g != null)
g.Dispose();
if (bitmap != null)
bitmap.Dispose();
if (image != null)
image.Dispose();
}
} /// <summary>
/// 生成图片水印
/// </summary>
/// <param name="originalPath">源图路径</param>
/// <param name="watermarkPath">水印图片路径</param>
/// <param name="targetPath">保存路径</param>
/// <param name="position">位置</param>
/// <param name="opacity">透明度</param>
/// <param name="quality">质量</param>
public static void GenerateImageWatermark(string originalPath, string watermarkPath, string targetPath, int position, int opacity, int quality)
{
Image originalImage = null;
Image watermarkImage = null;
//图片属性
ImageAttributes attributes = null;
//画板
Graphics g = null;
try
{ originalImage = Image.FromFile(originalPath);
watermarkImage = new Bitmap(watermarkPath); if (watermarkImage.Height >= originalImage.Height || watermarkImage.Width >= originalImage.Width)
{
originalImage.Save(targetPath);
return;
} if (quality < || quality > )
quality = ; //水印透明度
float iii;
if (opacity > && opacity <= )
iii = (float)(opacity / 10.0F);
else
iii = 0.5F; //水印位置
int x = ;
int y = ;
switch (position)
{
case :
x = (int)(originalImage.Width * (float).);
y = (int)(originalImage.Height * (float).);
break;
case :
x = (int)((originalImage.Width * (float).) - (watermarkImage.Width / ));
y = (int)(originalImage.Height * (float).);
break;
case :
x = (int)((originalImage.Width * (float).) - (watermarkImage.Width));
y = (int)(originalImage.Height * (float).);
break;
case :
x = (int)(originalImage.Width * (float).);
y = (int)((originalImage.Height * (float).) - (watermarkImage.Height / ));
break;
case :
x = (int)((originalImage.Width * (float).) - (watermarkImage.Width / ));
y = (int)((originalImage.Height * (float).) - (watermarkImage.Height / ));
break;
case :
x = (int)((originalImage.Width * (float).) - (watermarkImage.Width));
y = (int)((originalImage.Height * (float).) - (watermarkImage.Height / ));
break;
case :
x = (int)(originalImage.Width * (float).);
y = (int)((originalImage.Height * (float).) - watermarkImage.Height);
break;
case :
x = (int)((originalImage.Width * (float).) - (watermarkImage.Width / ));
y = (int)((originalImage.Height * (float).) - watermarkImage.Height);
break;
case :
x = (int)((originalImage.Width * (float).) - (watermarkImage.Width));
y = (int)((originalImage.Height * (float).) - watermarkImage.Height);
break;
} //颜色映射表
ColorMap colorMap = new ColorMap();
colorMap.OldColor = Color.FromArgb(, , , );
colorMap.NewColor = Color.FromArgb(, , , );
ColorMap[] newColorMap = { colorMap }; //颜色变换矩阵,iii是设置透明度的范围0到1中的单精度类型
float[][] newColorMatrix ={
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, iii, 0.0f},
new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f}
};
//定义一个 5 x 5 矩阵
ColorMatrix matrix = new ColorMatrix(newColorMatrix); //图片属性
attributes = new ImageAttributes();
attributes.SetRemapTable(newColorMap, ColorAdjustType.Bitmap);
attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); //画板
g = Graphics.FromImage(originalImage);
//绘制水印
g.DrawImage(watermarkImage, new Rectangle(x, y, watermarkImage.Width, watermarkImage.Height), , , watermarkImage.Width, watermarkImage.Height, GraphicsUnit.Pixel, attributes);
//保存图片
EncoderParameters encoderParams = new EncoderParameters();
encoderParams.Param[] = new EncoderParameter(Encoder.Quality, new long[] { quality });
if (GetJPEGCodec() != null)
originalImage.Save(targetPath, _jpegcodec, encoderParams);
else
originalImage.Save(targetPath);
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (g != null)
g.Dispose();
if (attributes != null)
attributes.Dispose();
if (watermarkImage != null)
watermarkImage.Dispose();
if (originalImage != null)
originalImage.Dispose();
}
} /// <summary>
/// 生成文字水印
/// </summary>
/// <param name="originalPath">源图路径</param>
/// <param name="targetPath">保存路径</param>
/// <param name="text">水印文字</param>
/// <param name="textSize">文字大小</param>
/// <param name="textFont">文字字体</param>
/// <param name="position">位置</param>
/// <param name="quality">质量</param>
public static void GenerateTextWatermark(string originalPath, string targetPath, string text, int textSize, string textFont, int position, int quality)
{
Image originalImage = null;
//画板
Graphics g = null;
try
{
originalImage = Image.FromFile(originalPath);
//画板
g = Graphics.FromImage(originalImage);
if (quality < || quality > )
quality = ; Font font = new Font(textFont, textSize, FontStyle.Regular, GraphicsUnit.Pixel);
SizeF sizePair = g.MeasureString(text, font); float x = ;
float y = ; switch (position)
{
case :
x = (float)originalImage.Width * (float).;
y = (float)originalImage.Height * (float).;
break;
case :
x = ((float)originalImage.Width * (float).) - (sizePair.Width / );
y = (float)originalImage.Height * (float).;
break;
case :
x = ((float)originalImage.Width * (float).) - sizePair.Width;
y = (float)originalImage.Height * (float).;
break;
case :
x = (float)originalImage.Width * (float).;
y = ((float)originalImage.Height * (float).) - (sizePair.Height / );
break;
case :
x = ((float)originalImage.Width * (float).) - (sizePair.Width / );
y = ((float)originalImage.Height * (float).) - (sizePair.Height / );
break;
case :
x = ((float)originalImage.Width * (float).) - sizePair.Width;
y = ((float)originalImage.Height * (float).) - (sizePair.Height / );
break;
case :
x = (float)originalImage.Width * (float).;
y = ((float)originalImage.Height * (float).) - sizePair.Height;
break;
case :
x = ((float)originalImage.Width * (float).) - (sizePair.Width / );
y = ((float)originalImage.Height * (float).) - sizePair.Height;
break;
case :
x = ((float)originalImage.Width * (float).) - sizePair.Width;
y = ((float)originalImage.Height * (float).) - sizePair.Height;
break;
} g.DrawString(text, font, new SolidBrush(Color.White), x + , y + );
g.DrawString(text, font, new SolidBrush(Color.Black), x, y); //保存图片
EncoderParameters encoderParams = new EncoderParameters();
encoderParams.Param[] = new EncoderParameter(Encoder.Quality, new long[] { quality });
if (GetJPEGCodec() != null)
originalImage.Save(targetPath, _jpegcodec, encoderParams);
else
originalImage.Save(targetPath);
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (g != null)
g.Dispose();
if (originalImage != null)
originalImage.Dispose();
}
} #endregion
}
}

IO帮助类的更多相关文章

  1. System.IO.Directory类

    1.参考的博客:System.IO.Directory类和System.DirectoryInfo类(http://blog.sina.com.cn/s/blog_614f473101017du4.h ...

  2. java.io.File类

    java.io.File类 1.凡是与输入.输出相关的类.接口等都定义在java.io包下 2.File是一个类.能够有构造器创建其对象.此对象相应着一个文件(.txt .avi .doc .ppt ...

  3. 详解C#中System.IO.File类和System.IO.FileInfo类的用法

    System.IO.File类和System.IO.FileInfo类主要提供有关文件的各种操作,在使用时需要引用System.IO命名空间.下面通过程序实例来介绍其主要属性和方法. (1) 文件打开 ...

  4. java.io.File类操作

    一.java.io.File类 String path="E:/222/aaa";//路径 String path1="aaa.txt"; File file= ...

  5. JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码

    JAVA之旅(三十)--打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码 三十篇了,又是一个 ...

  6. Java输入输出流(IO)-----文件类File详解

       1.java.io.File类简介 凡是与输入.输出相关的类.接口等都定义在java.io包下 File是一个类,可以有构造器创建其对象.此对象对应着一个文件(.txt .avi .doc .p ...

  7. XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)

    XML序列化   #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...

  8. System.IO.File类和System.IO.FileInfo类

    1.System.IO.File类 ※文件create, copy,move,SetAttributes,open,exists ※由于File.Create方法默认向所有用户授予对新文件的完全读写. ...

  9. 33.JAVA编程思想——JAVA IO File类

    33.JAVA编程思想--JAVA IO File类 RandomAccessFile用于包括了已知长度记录的文件.以便我们能用 seek()从一条记录移至还有一条:然后读取或改动那些记录. 各记录的 ...

随机推荐

  1. 一些 NSArray 的基本操作代码例子

    一些 NSArray 的基本操作代码例子 数组可以说是软件开发人员每天都要面对的基本操作,下面就分享一些 NSArray 的基本操作代码例子供苹果开发初学者参考,每段代码第一行会以注释方式说明该段代码 ...

  2. Java课程之团队开发(团队介绍)

    一.介绍团队和团队成员 团队名称:凯域软创 团队成员介绍:张某某,崔某某,焦某某,陈某 二.关于团队作品 1.作品名称:课程表 2.你的创意解决了用户的什么需求:查看课程信息的需求 3.你有什么招数用 ...

  3. Springboot中关于跨域问题的一种解决方法

    前后端分离开发中,跨域问题是很常见的一种问题.本文主要是解决 springboot 项目跨域访问的一种方法,其他 javaweb 项目也可参考. 1.首先要了解什么是跨域 由于前后端分离开发中前端页面 ...

  4. git 本地同步分支数,删除远程已经删除掉的多余分支

    git remote show orgin  (展示当前本地分支和远程上的分支差异,多余分支后会被标注 use 'git remote prune' to remove.) git remote pr ...

  5. 干货分享: 长达150页的openvswitch的ppt,不实验无真相

    下载链接: Openvswitch实验教程 http://files.cnblogs.com/popsuper1982/Openvswtich.pptx 一.概论 Software Defined N ...

  6. [Swift]LeetCode388. 文件的最长绝对路径 | Longest Absolute File Path

    Suppose we abstract our file system by a string in the following manner: The string "dir\n\tsub ...

  7. the python challenge闯关记录(9-16)

    9 第九关 是一张图,上面有很多的黑点,查看网页源代码发现了上一关的提示: 还发现了一大串的数字 感觉又是一个使用PIL库进行图像处理的题,百度后知道要将这些点连接起来并重新画图.但是不能在原始图上修 ...

  8. Spring Data Jpa接口简介

    Repository接口 public interface Repository<T, ID> {....} 提供了按方法名称的查询方式: 提供了@Query的查询方式 可能遇到的错误: ...

  9. Docker基础命令和时区问题

    Docker 命令 1. 安装Docker # ubuntu系统安装 $ sudo apt install docker-ce # 启动docker $ sudo systemctl start do ...

  10. 设置radio选中

    选中: $('.viewradio:input[name="istop"][value="' + getSelected().istop + '"]').pro ...