老早以前写的,害怕以后忘了或找不到了,发到这里以备忘。
using
System;
using
System.IO;
using
System.Drawing;
using
System.Drawing.Imaging;
///
<summary>
///
PictureMarker 的摘要说明。
///
</summary>
public
class
PictureMarker
{
///
<summary>
///
PictureMarker的构造函数
///
</summary>
public
PictureMarker()
{
}
///
<summary>
///
PictureMarker的构造函数
///
</summary>
///
<param name="width">
缩略图的宽度
</param>
///
<param name="height">
缩略图的高度
</param>
///
<param name="ismust">
是否一定要生成缩略图,推荐为false
</param>
public
PictureMarker(
int
width,
int
height,
bool
ismust)
{
this
.width
=
width;
this
.height
=
height;
this
.ismust
=
ismust;
}
///
<summary>
///
PictureMarker的构造函数
///
</summary>
///
<param name="width">
缩略图的宽度
</param>
///
<param name="height">
缩略图的高度
</param>
///
<param name="ismust">
是否一定要生成缩略图,推荐为false
</param>
///
<param name="isSavePrimaryPic">
是否要保存源图片
</param>
///
<param name="primaryPicPath">
源图片的保存目录
</param>
public
PictureMarker(
int
width,
int
height,
bool
ismust,
bool
isSavePrimaryPic,
string
primaryPicPath)
:
this
(width, height, ismust)
{
this
.isSavePrimaryPic
=
isSavePrimaryPic;
this
.primaryPicPath
=
primaryPicPath;
}
private
int
width;
private
int
height;
private
bool
ismust
=
false
;
private
bool
isSavePrimaryPic
=
false
;
private
string
primaryPicPath;
///
<summary>
///
缩略图的宽度
///
</summary>
public
int
Width
{
get
{
return
width; }
set
{ width
=
value; }
}
///
<summary>
///
缩略图的高度
///
</summary>
public
int
Height
{
get
{
return
height; }
set
{ height
=
value; }
}
///
<summary>
///
是否一定要生成缩略图,推荐为false
///
</summary>
public
bool
IsMust
{
get
{
return
ismust; }
set
{ ismust
=
value; }
}
///
<summary>
///
是否要保存源图片
///
</summary>
public
bool
IsSavePrimaryPic
{
get
{
return
isSavePrimaryPic; }
set
{ isSavePrimaryPic
=
value; }
}
///
<summary>
///
源图片的保存目录
///
</summary>
public
string
PrimaryPicPath
{
get
{
return
primaryPicPath; }
set
{ primaryPicPath
=
value; }
}
///
<summary>
///
在图片上添加版权信息水印
///
</summary>
///
<param name="input">
目标图片
</param>
///
<param name="copyright">
文字版权信息
</param>
///
<param name="savepath">
保存路径
</param>
///
<param name="position">
水印显示位置
</param>
public
void
CreateMark(Stream input,
string
copyright,
string
savepath, WaterPosition position)
{
int
xpoint, ypoint;
System.Drawing.Image photo
=
System.Drawing.Image.FromStream(input);
int
pwidth
=
photo.Width;
int
pheight
=
photo.Height;
Bitmap markpic
=
new
Bitmap(photo);
markpic.SetResolution(photo.HorizontalResolution, photo.VerticalResolution);
Graphics graphics
=
Graphics.FromImage(markpic);
xpoint
=
(pwidth
-
100
)
/
2
;
ypoint
=
pheight
-
40
;
graphics.DrawString(copyright,
new
Font(
"
楷体
"
,
15
),
new
System.Drawing.SolidBrush(Color.FromArgb(
255
,
0
,
255
,
255
)),
new
RectangleF(xpoint, ypoint,
400
,
30
));
try
{
markpic.Save(savepath);
}
finally
{
input.Close();
photo.Dispose();
markpic.Dispose();
graphics.Dispose();
}
}
///
<summary>
///
在图片上添加版权信息水印
///
</summary>
///
<param name="input">
目标图片
</param>
///
<param name="copyright">
图片版权信息
</param>
///
<param name="savepath">
保存路径
</param>
///
<param name="position">
水印显示位置
</param>
public
void
CreateMark(Stream input, Stream copyright,
string
savepath, WaterPosition position)
{
int
xpoint, ypoint;
System.Drawing.Image photo
=
System.Drawing.Image.FromStream(input);
System.Drawing.Image copy
=
System.Drawing.Image.FromStream(copyright);
int
pwidth
=
photo.Width;
int
pheight
=
photo.Height;
int
cwidth
=
copy.Width;
int
cheight
=
copy.Height;
if
(pwidth
-
cwidth
<
20
||
pheight
-
cheight
<
20
)
{
input.Close();
copyright.Close();
photo.Dispose();
copy.Dispose();
throw
new
ArgumentException(
"
不合适的图片尺寸.目标图片比版权图片至少宽20像素,高20像素.
"
);
}
if
(isSavePrimaryPic)
{
if
(primaryPicPath
==
null
||
primaryPicPath
==
""
)
{
input.Close();
copyright.Close();
photo.Dispose();
copy.Dispose();
throw
new
ArgumentException(
"
当要求保存源图片时,源图片的保存路径不能为空
"
);
}
try
{
photo.Save(primaryPicPath
+
"
\\
"
+
Path.GetFileName(savepath)
+
"
.jpg
"
, ImageFormat.Jpeg);
}
catch
(Exception ex)
{
input.Close();
copyright.Close();
photo.Dispose();
copy.Dispose();
throw
ex;
}
}
Bitmap markpic
=
new
Bitmap(photo);
markpic.SetResolution(photo.HorizontalResolution, photo.VerticalResolution);
Graphics graphics
=
Graphics.FromImage(markpic);
System.Drawing.Imaging.ImageAttributes att
=
new
System.Drawing.Imaging.ImageAttributes();
float
[][] matrixelements
=
{
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
},
new
float
[] {
0.0f
,
0.0f
,
0.0f
,
0.0f
,
1.0f
}};
System.Drawing.Imaging.ColorMatrix matrix
=
new
System.Drawing.Imaging.ColorMatrix(matrixelements);
att.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
switch
(position)
{
case
WaterPosition.Left:
xpoint
=
10
;
ypoint
=
(pheight
-
cheight)
/
2
;
break
;
case
WaterPosition.LeftUp:
xpoint
=
10
;
ypoint
=
10
;
break
;
case
WaterPosition.MiddleUp:
xpoint
=
(pwidth
-
cwidth)
/
2
;
ypoint
=
10
;
break
;
case
WaterPosition.RightUp:
xpoint
=
pwidth
-
cwidth
-
10
;
ypoint
=
10
;
break
;
case
WaterPosition.Right:
xpoint
=
pwidth
-
cwidth
-
10
;
ypoint
=
(pheight
-
cheight)
/
2
;
break
;
case
WaterPosition.RightDown:
xpoint
=
pwidth
-
cwidth
-
10
;
ypoint
=
pheight
-
cheight
-
10
;
break
;
case
WaterPosition.MiddleDown:
xpoint
=
(pwidth
-
cwidth)
/
2
;
ypoint
=
pheight
-
cheight
-
10
;
break
;
case
WaterPosition.LeftDown:
xpoint
=
10
;
ypoint
=
pheight
-
cheight
-
10
;
break
;
default
:
xpoint
=
(pwidth
-
cwidth)
/
2
;
ypoint
=
(pheight
-
cheight)
/
2
;
break
;
};
graphics.DrawImage(copy,
new
Rectangle(xpoint, ypoint, cwidth, cheight),
0
,
0
, cwidth, cheight, GraphicsUnit.Pixel, att);
if
(width
!=
0
&&
height
!=
0
)
{
if
(ismust)
{
int
twidth, theight;
if
(markpic.Width
*
height
>
markpic.Height
*
width)
{
twidth
=
width;
theight
=
markpic.Height
*
width
/
markpic.Width;
}
else
{
theight
=
height;
twidth
=
markpic.Width
*
height
/
markpic.Height;
}
markpic.SetResolution(twidth, theight);
markpic
=
(Bitmap)markpic.GetThumbnailImage(twidth, theight,
null
,
new
IntPtr());
}
else
{
if
(width
<
markpic.Width
||
height
<
markpic.Height)
{
if
(width
<
markpic.Width
||
height
<
markpic.Height)
{
int
twidth, theight;
if
(markpic.Width
*
height
>
markpic.Height
*
width)
{
twidth
=
width;
theight
=
markpic.Height
*
width
/
markpic.Width;
}
else
{
theight
=
height;
twidth
=
markpic.Width
*
height
/
markpic.Height;
}
markpic.SetResolution(twidth, theight);
markpic
=
(Bitmap)markpic.GetThumbnailImage(twidth, theight,
null
,
new
IntPtr());
}
}
}
}
try
{
markpic.Save(savepath, ImageFormat.Jpeg);
}
finally
{
graphics.Dispose();
input.Close();
copyright.Close();
photo.Dispose();
copy.Dispose();
markpic.Dispose();
}
}
///
<summary>
///
在图片上添加版权信息水印
///
</summary>
///
<param name="input">
目标图片
</param>
///
<param name="copyright">
版权信息,可以为图片路径或文字版权信息
</param>
///
<param name="directory">
保存目录
</param>
///
<param name="filename">
保存文件名
</param>
///
<param name="isDrectory">
copyright是否为文件路径
</param>
///
<param name="position">
水印显示位置
</param>
public
void
CreateMark(Stream input,
string
copyright,
string
directory,
string
filename,
bool
isDrectory, WaterPosition position)
{
if
(isDrectory)
{
FileStream _copyright
=
new
FileStream(copyright, FileMode.Open, FileAccess.Read, FileShare.Read);
CreateMark(input, _copyright, directory, filename, position);
}
else
{
CreateMark(input, copyright, directory
+
"
\\
"
+
filename, position);
}
}
///
<summary>
///
在图片上添加版权信息水印
///
</summary>
///
<param name="input">
目标图片
</param>
///
<param name="copyright">
图片版权信息
</param>
///
<param name="directory">
保存目录
</param>
///
<param name="filename">
保存文件名
</param>
///
<param name="position">
水印显示位置
</param>
public
void
CreateMark(Stream input, Stream copyright,
string
directory,
string
filename, WaterPosition position)
{
CreateMark(input, copyright, directory
+
"
\\
"
+
filename, position);
}
///
<summary>
///
在图片上添加版权信息水印
///
</summary>
///
<param name="filepath">
目标图片路径
</param>
///
<param name="copyright">
版权信息,可以为图片路径或文字版权信息
</param>
///
<param name="directory">
保存目录
</param>
///
<param name="filename">
保存文件名
</param>
///
<param name="isDrectory">
copyright是否为文件路径
</param>
///
<param name="position">
水印显示位置
</param>
public
void
CreateMark(
string
filepath,
string
copyright,
string
directory,
string
filename,
bool
isDrectory, WaterPosition position)
{
FileStream input
=
new
FileStream(filepath, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);
CreateMark(input, copyright, directory, filename, isDrectory, position);
}
///
<summary>
///
在图片上添加版权信息水印
///
</summary>
///
<param name="filepath">
目标图片路径
</param>
///
<param name="copyright">
版权信息,可以为图片路径或文字版权信息
</param>
///
<param name="savepath">
保存路径
</param>
///
<param name="isDrectory">
copyright是否为文件路径
</param>
///
<param name="position">
水印显示位置
</param>
public
void
CreateMark(
string
filepath,
string
copyright,
string
savepath,
bool
isDrectory, WaterPosition position)
{
if
(isDrectory)
{
FileStream input
=
new
FileStream(filepath, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);
FileStream _copyright
=
new
FileStream(copyright, FileMode.Open, FileAccess.Read, FileShare.Read);
CreateMark(input, _copyright, savepath, position);
}
else
{
FileStream input
=
new
FileStream(filepath, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);
CreateMark(input, copyright, savepath, position);
}
}
public
void
CreateThumbnailImage(Stream input,
string
savepath)
{
if
(width
==
0
||
height
==
0
)
{
input.Close();
throw
new
ArgumentException(
"
缩略图的宽度和高度不能为0.
"
);
}
Image photo
=
Image.FromStream(input);
if
(isSavePrimaryPic)
{
if
(primaryPicPath
==
null
||
primaryPicPath
==
""
)
{
input.Close();
photo.Dispose();
throw
new
ArgumentException(
"
当要求保存源图片时,源图片的保存路径不能为空
"
);
}
try
{
photo.Save(Path.Combine(primaryPicPath, Path.GetFileNameWithoutExtension(savepath)
+
"
.jpg
"
), ImageFormat.Jpeg);
}
catch
(Exception ex)
{
input.Close();
photo.Dispose();
throw
ex;
}
}
Bitmap markpic
=
new
Bitmap(photo);
if
(ismust)
{
int
twidth, theight;
if
(markpic.Width
*
height
>
markpic.Height
*
width)
{
twidth
=
width;
theight
=
markpic.Height
*
width
/
markpic.Width;
}
else
{
theight
=
height;
twidth
=
markpic.Width
*
height
/
markpic.Height;
}
markpic.SetResolution(twidth, theight);
markpic
=
(Bitmap)markpic.GetThumbnailImage(twidth, theight,
null
,
new
IntPtr());
}
else
{
if
(width
<
markpic.Width
||
height
<
markpic.Height)
{
if
(width
<
markpic.Width
||
height
<
markpic.Height)
{
int
twidth, theight;
if
(markpic.Width
*
height
>
markpic.Height
*
width)
{
twidth
=
width;
theight
=
markpic.Height
*
width
/
markpic.Width;
}
else
{
theight
=
height;
twidth
=
markpic.Width
*
height
/
markpic.Height;
}
markpic.SetResolution(twidth, theight);
markpic
=
(Bitmap)markpic.GetThumbnailImage(twidth, theight,
null
,
new
IntPtr());
}
}
}
try
{
markpic.Save(savepath, ImageFormat.Jpeg);
}
finally
{
input.Close();
photo.Dispose();
markpic.Dispose();
}
}
public
void
CreateThumbnailImage(
string
source,
string
savepath)
{
FileStream input
=
new
FileStream(source, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);
CreateThumbnailImage(input, savepath);
}
///
<summary>
///
水印显示的位置
///
</summary>
public
enum
WaterPosition
{
///
<summary>
///
左上
///
</summary>
LeftUp,
///
<summary>
///
中上
///
</summary>
MiddleUp,
///
<summary>
///
右上
///
</summary>
RightUp,
///
<summary>
///
右
///
</summary>
Right,
///
<summary>
///
右下
///
</summary>
RightDown,
///
<summary>
///
中下
///
</summary>
MiddleDown,
///
<summary>
///
左下
///
</summary>
LeftDown,
///
<summary>
///
左
///
</summary>
Left,
///
<summary>
///
正中间
///
</summary>
Middle
}
}
源代码