本文實例講述了C#利用原圖和水印圖的重疊簡單實現水印的方法。分享給大家供大家參考,具體如下:
圖片操作類
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232/// <summary>
/// 獲取一個圖片按等比例縮小後的大小。
/// </summary>
/// <param name="maxWidth">需要縮小到的寬度</param>
/// <param name="maxHeight">需要縮小到的高度</param>
/// <param name="imageOriginalWidth">圖片的原始寬度</param>
/// <param name="imageOriginalHeight">圖片的原始高度</param>
/// <returns>返回圖片按等比例縮小後的實際大小</returns>
public
static
Size GetNewSize(
int
maxWidth,
int
maxHeight,
int
imageOriginalWidth,
int
imageOriginalHeight)
{
double
w = 0.0;
double
h = 0.0;
double
sw = Convert.ToDouble(imageOriginalWidth);
double
sh = Convert.ToDouble(imageOriginalHeight);
double
mw = Convert.ToDouble(maxWidth);
double
mh = Convert.ToDouble(maxHeight);
if
(sw < mw && sh < mh)
{
w = sw;
h = sh;
}
else
if
((sw / sh) > (mw / mh))
{
w = maxWidth;
h = (w * sh) / sw;
}
else
{
h = maxHeight;
w = (h * sw) / sh;
}
return
new
Size(Convert.ToInt32(w), Convert.ToInt32(h));
}
/// <summary>
/// 對給定的一個圖片(Image對象)生成一個指定大小的縮略圖。
/// </summary>
/// <param name="originalImage">原始圖片</param>
/// <param name="thumMaxWidth">縮略圖的寬度</param>
/// <param name="thumMaxHeight">縮略圖的高度</param>
/// <returns>返回縮略圖的Image對象</returns>
public
static
System.Drawing.Image GetThumbNailImage(System.Drawing.Image originalImage,
int
thumMaxWidth,
int
thumMaxHeight)
{
Size thumRealSize = Size.Empty;
System.Drawing.Image newImage = originalImage;
Graphics graphics =
null
;
try
{
thumRealSize = GetNewSize(thumMaxWidth, thumMaxHeight, originalImage.Width, originalImage.Height);
newImage =
new
Bitmap(thumRealSize.Width, thumRealSize.Height);
graphics = Graphics.FromImage(newImage);
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.Clear(Color.Transparent);
graphics.DrawImage(originalImage,
new
Rectangle(0, 0, thumRealSize.Width, thumRealSize.Height),
new
Rectangle(0, 0, originalImage.Width, originalImage.Height), GraphicsUnit.Pixel);
}
catch
{ }
finally
{
if
(graphics !=
null
)
{
graphics.Dispose();
graphics =
null
;
}
}
return
newImage;
}
/// <summary>
/// 對給定的一個圖片文件生成一個指定大小的縮略圖。
/// </summary>
/// <param name="originalImage">圖片的物理文件地址</param>
/// <param name="thumMaxWidth">縮略圖的寬度</param>
/// <param name="thumMaxHeight">縮略圖的高度</param>
/// <returns>返回縮略圖的Image對象</returns>
public
static
System.Drawing.Image GetThumbNailImage(
string
imageFile,
int
thumMaxWidth,
int
thumMaxHeight)
{
System.Drawing.Image originalImage =
null
;
System.Drawing.Image newImage =
null
;
try
{
originalImage = System.Drawing.Image.FromFile(imageFile);
newImage = GetThumbNailImage(originalImage, thumMaxWidth, thumMaxHeight);
}
catch
{ }
finally
{
if
(originalImage !=
null
)
{
originalImage.Dispose();
originalImage =
null
;
}
}
return
newImage;
}
/// <summary>
/// 對給定的一個圖片文件生成一個指定大小的縮略圖,並將縮略圖保存到指定位置。
/// </summary>
/// <param name="originalImageFile">圖片的物理文件地址</param>
/// <param name="thumbNailImageFile">縮略圖的物理文件地址</param>
/// <param name="thumMaxWidth">縮略圖的寬度</param>
/// <param name="thumMaxHeight">縮略圖的高度</param>
public
static
void
MakeThumbNail(
string
originalImageFile,
string
thumbNailImageFile,
int
thumMaxWidth,
int
thumMaxHeight)
{
System.Drawing.Image newImage = GetThumbNailImage(originalImageFile, thumMaxWidth, thumMaxHeight);
try
{
newImage.Save(thumbNailImageFile, ImageFormat.Jpeg);
}
catch
{ }
finally
{
newImage.Dispose();
newImage =
null
;
}
}
/// <summary>
/// 將一個圖片的內存流調整為指定大小,並返回調整後的內存流。
/// </summary>
/// <param name="originalImageStream">原始圖片的內存流</param>
/// <param name="newWidth">新圖片的寬度</param>
/// <param name="newHeight">新圖片的高度</param>
/// <returns>返回調整後的圖片的內存流</returns>
public
static
MemoryStream ResizeImage(Stream originalImageStream,
int
newWidth,
int
newHeight)
{
MemoryStream newImageStream =
null
;
System.Drawing.Image newImage = Globals.GetThumbNailImage(System.Drawing.Image.FromStream(originalImageStream), newWidth, newHeight);
if
(newImage !=
null
)
{
newImageStream =
new
MemoryStream();
newImage.Save(newImageStream, ImageFormat.Jpeg);
}
return
newImageStream;
}
/// <summary>
/// 將一個內存流保存為磁盤文件。
/// </summary>
/// <param name="stream">內存流</param>
/// <param name="newFile">目標磁盤文件地址</param>
public
static
void
SaveStreamToFile(Stream stream,
string
newFile)
{
if
(stream ==
null
|| stream.Length == 0 ||
string
.IsNullOrEmpty(newFile))
{
return
;
}
byte
[] buffer =
new
byte
[stream.Length];
stream.Position = 0;
stream.Read(buffer, 0, buffer.Length);
FileStream fileStream =
new
FileStream(newFile, FileMode.OpenOrCreate, FileAccess.Write);
fileStream.Write(buffer, 0, buffer.Length);
fileStream.Flush();
fileStream.Close();
fileStream.Dispose();
}
/// <summary>
/// 對一個指定的圖片加上圖片水印效果。
/// </summary>
/// <param name="imageFile">圖片文件地址</param>
/// <param name="waterImage">水印圖片(Image對象)</param>
public
static
void
CreateImageWaterMark(
string
imageFile, System.Drawing.Image waterImage)
{
if
(
string
.IsNullOrEmpty(imageFile) || !File.Exists(imageFile) || waterImage ==
null
)
{
return
;
}
System.Drawing.Image originalImage = System.Drawing.Image.FromFile(imageFile);
if
(originalImage.Width - 10 < waterImage.Width || originalImage.Height - 10 < waterImage.Height)
{
return
;
}
Graphics graphics = Graphics.FromImage(originalImage);
int
x = originalImage.Width - waterImage.Width - 10;
int
y = originalImage.Height - waterImage.Height - 10;
int
width = waterImage.Width;
int
height = waterImage.Height;
graphics.DrawImage(waterImage,
new
Rectangle(x, y, width, height), 0, 0, width, height, GraphicsUnit.Pixel);
graphics.Dispose();
MemoryStream stream =
new
MemoryStream();
originalImage.Save(stream, ImageFormat.Jpeg);
originalImage.Dispose();
System.Drawing.Image imageWithWater = System.Drawing.Image.FromStream(stream);
imageWithWater.Save(imageFile);
imageWithWater.Dispose();
}
/// <summary>
/// 對一個指定的圖片加上文字水印效果。
/// </summary>
/// <param name="imageFile">圖片文件地址</param>
/// <param name="waterText">水印文字內容</param>
public
static
void
CreateTextWaterMark(
string
imageFile,
string
waterText)
{
if
(
string
.IsNullOrEmpty(imageFile) ||
string
.IsNullOrEmpty(waterText) || !File.Exists(imageFile))
{
return
;
}
System.Drawing.Image originalImage = System.Drawing.Image.FromFile(imageFile);
Graphics graphics = Graphics.FromImage(originalImage);
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
SolidBrush brush =
new
SolidBrush(Color.FromArgb(153, 255, 255, 255));
Font waterTextFont =
new
Font(
"Arial"
, 16, FontStyle.Regular);
SizeF waterTextSize = graphics.MeasureString(waterText, waterTextFont);
float
x = (
float
)originalImage.Width - waterTextSize.Width - 10F;
float
y = (
float
)originalImage.Height - waterTextSize.Height - 10F;
graphics.DrawString(waterText, waterTextFont, brush, x, y);
graphics.Dispose();
brush.Dispose();
MemoryStream stream =
new
MemoryStream();
originalImage.Save(stream, ImageFormat.Jpeg);
originalImage.Dispose();
System.Drawing.Image imageWithWater = System.Drawing.Image.FromStream(stream);
imageWithWater.Save(imageFile);
imageWithWater.Dispose();
}
/// <summary>
/// 判斷上傳組件是否包含內容。
/// </summary>
/// <param name="fileUpload">ASP.Net 2.0標准上傳組件</param>
/// <returns>如果數據有效,則返回True,否則返回False</returns>
public
static
bool
IsAttachmentValid(FileUpload fileUpload)
{
if
(fileUpload !=
null
&&
fileUpload.PostedFile !=
null
&&
!
string
.IsNullOrEmpty(fileUpload.PostedFile.FileName) &&
fileUpload.PostedFile.ContentLength > 0)
{
return
true
;
}
return
false
;
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public
class
ImageHelper
{
#region " 水印存放的相對路徑 "
public
static
string
GetLogoPath()
{
return
"/images/logo.png"
;
///水印圖路徑
}
#endregion
#region " 圖片水印 "
// <summary>
// 在圖片上生成圖片水印,此方法不支持Gif類型的圖片
// </summary>
// <param name="Path">原服務器圖片路徑</param>
// <param name="Path_syp">生成的帶圖片水印的圖片路徑</param>
// <param name="Path_sypf">水印圖片路徑</param>
public
static
void
MarkImage(Stream InUploadImagePath,
string
inLogoImagePath,
string
InSavePath)
{
System.Drawing.Image Image = System.Drawing.Image.FromStream(InUploadImagePath);
System.Drawing.Image newimage = Image.FromFile(Current.Server.MapPath(inLogoImagePath));
Graphics g = Graphics.FromImage(Image);
g.DrawImage(newimage,
new
Rectangle(Image.Width - newimage.Width, Image.Height - newimage.Height, newimage.Width, newimage.Height), 0, 0, newimage.Width, newimage.Height, GraphicsUnit.Pixel);
try
{
Image.Save(Current.Server.MapPath(InSavePath));
}
catch
(Exception ex) {
}
finally
{
g.Dispose();
Image.Dispose();
newimage.Dispose();
}
}
#endregion
}