天天看點

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

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

<code>using</code> <code>System;</code>

<code>using</code> <code>System.Data;</code>

<code>using</code> <code>System.Data.SqlClient;</code>

<code>using</code> <code>System.Configuration;</code>

<code>using</code> <code>System.Web;</code>

<code>using</code> <code>System.Web.Security;</code>

<code>using</code> <code>System.Web.UI;</code>

<code>using</code> <code>System.Web.UI.WebControls;</code>

<code>using</code> <code>System.Web.UI.WebControls.WebParts;</code>

<code>using</code> <code>System.Web.UI.HtmlControls;</code>

<code>using</code> <code>System.Text;</code>

<code>using</code> <code>System.Text.RegularExpressions;</code>

<code>using</code> <code>System.Drawing;</code>

<code>using</code> <code>System.Drawing.Imaging;</code>

<code>using</code> <code>System.Collections;</code>

<code>using</code> <code>System.ComponentModel;</code>

<code>namespace</code> <code>Legalsoft.Images</code>

<code>{</code>

<code>    </code><code>/// &lt;summary&gt;</code>

<code>    </code><code>/// News 的摘要說明</code>

<code>    </code><code>/// &lt;/summary&gt;</code>

<code>    </code><code>public</code> <code>class</code> <code>XImage</code>

<code>    </code><code>{</code>

<code>        </code><code>public</code> <code>Color tBackground;</code>

<code>        </code><code>public</code> <code>Color tBorder;</code>

<code>        </code><code>public</code> <code>Color tShadow;</code>

<code>        </code><code>public</code> <code>int</code> <code>tQuality;</code>

<code>        </code><code>public</code> <code>string</code> <code>markPosition;</code>

<code>        </code><code>/// &lt;summary&gt;</code>

<code>        </code><code>/// 圖檔參數預定義</code>

<code>        </code><code>/// &lt;/summary&gt;</code>

<code>        </code><code>static</code> <code>Hashtable htmimes =</code><code>new</code> <code>Hashtable();</code>

<code>        </code><code>internal</code> <code>readonly</code> <code>string</code> <code>AllowExt =</code><code>".jpe|.jpeg|.jpg|.png|.tif|.tiff|.bmp|.gif"</code><code>;</code>

<code>        </code><code>public</code> <code>XImage()</code>

<code>        </code><code>{</code>

<code>            </code><code>tBackground = Color.Transparent;</code>

<code>            </code><code>tBorder = Color.Transparent;</code>

<code>            </code><code>tShadow = Color.Transparent;</code>

<code>            </code><code>tQuality = 100;</code>

<code>            </code><code>markPosition =</code><code>"左下角"</code><code>;</code>

<code>            </code><code>#region 圖檔類型預定義</code>

<code>            </code><code>htmimes[</code><code>".jpe"</code><code>]=</code><code>"image/jpeg"</code><code>;</code>

<code>            </code><code>htmimes[</code><code>".jpeg"</code><code>] =</code><code>"image/jpeg"</code><code>;</code>

<code>            </code><code>htmimes[</code><code>".jpg"</code><code>] =</code><code>"image/jpeg"</code><code>;</code>

<code>            </code><code>htmimes[</code><code>".png"</code><code>] =</code><code>"image/png"</code><code>;</code>

<code>            </code><code>htmimes[</code><code>".tif"</code><code>] =</code><code>"image/tiff"</code><code>;</code>

<code>            </code><code>htmimes[</code><code>".tiff"</code><code>] =</code><code>"image/tiff"</code><code>;</code>

<code>            </code><code>htmimes[</code><code>".bmp"</code><code>] =</code><code>"image/bmp"</code><code>;</code>

<code>            </code><code>htmimes[</code><code>".gif"</code><code>] =</code><code>"image/gif"</code><code>;</code>

<code>            </code><code>#endregion</code>

<code>        </code><code>}</code>

<code>        </code><code>#region 下載下傳指定URL圖檔并儲存</code>

<code>        </code><code>/// 下載下傳指定URL的檔案并儲存到指定目錄</code>

<code>        </code><code>/// &lt;param name="strUrl"&gt;&lt;/param&gt;</code>

<code>        </code><code>public</code> <code>void</code> <code>DownloadImage(</code><code>string</code> <code>strUrl,</code><code>string</code> <code>file)</code>

<code>            </code><code>System.Net.WebClient wc =</code><code>new</code> <code>System.Net.WebClient();</code>

<code>            </code><code>wc.DownloadFile(strUrl, file);</code>

<code>        </code><code>#endregion</code>

<code>        </code><code>#region C#自動生成縮略圖</code>

<code>        </code><code>/// 按給定名字确定顔色</code>

<code>        </code><code>/// &lt;param name="name"&gt;&lt;/param&gt;</code>

<code>        </code><code>/// &lt;returns&gt;&lt;/returns&gt;</code>

<code>        </code><code>public</code> <code>Color ToColor(</code><code>string</code> <code>name)</code>

<code>            </code><code>if</code> <code>(name ==</code><code>"白色"</code><code>)</code><code>return</code> <code>Color.White;</code>

<code>            </code><code>if</code> <code>(name ==</code><code>"紅色"</code><code>)</code><code>return</code> <code>Color.Red;</code>

<code>            </code><code>if</code> <code>(name ==</code><code>"藍色"</code><code>)</code><code>return</code> <code>Color.Blue;</code>

<code>            </code><code>if</code> <code>(name ==</code><code>"綠色"</code><code>)</code><code>return</code> <code>Color.Green;</code>

<code>            </code><code>if</code> <code>(name ==</code><code>"黑色"</code><code>)</code><code>return</code> <code>Color.Black;</code>

<code>            </code><code>if</code> <code>(name ==</code><code>"灰色"</code><code>)</code><code>return</code> <code>Color.DarkGray;</code>

<code>            </code><code>if</code> <code>(name ==</code><code>"黃色"</code><code>)</code><code>return</code> <code>Color.Yellow;</code>

<code>            </code><code>if</code> <code>(name ==</code><code>"紫色"</code><code>)</code><code>return</code> <code>Color.Cyan;</code>

<code>            </code><code>if</code> <code>(name ==</code><code>"無色"</code><code>)</code><code>return</code> <code>Color.Transparent;</code>

<code>            </code><code>return</code> <code>Color.Transparent;</code>

<code>        </code><code>/// 按名字設定各種顔色,可以自行擴充:)</code>

<code>        </code><code>public</code> <code>int</code> <code>ToQuality(</code><code>string</code> <code>name)</code>

<code>            </code><code>return</code> <code>Int32.Parse(name.Replace(</code><code>"%"</code><code>,</code><code>""</code><code>));</code>

<code>        </code><code>/// 擷取圖像編碼解碼器的所有相關資訊</code>

<code>        </code><code>/// &lt;param name="mimeType"&gt;包含編碼解碼器的多用途網際郵件擴充協定 (MIME) 類型的字元串&lt;/param&gt;</code>

<code>        </code><code>/// &lt;returns&gt;傳回圖像編碼解碼器的所有相關資訊&lt;/returns&gt;</code>

<code>        </code><code>private</code> <code>static</code> <code>ImageCodecInfo GetCodecInfo(</code><code>string</code> <code>mimeType)</code>

<code>            </code><code>ImageCodecInfo[] CodecInfo = ImageCodecInfo.GetImageEncoders();</code>

<code>            </code><code>foreach</code> <code>(ImageCodecInfo ici</code><code>in</code> <code>CodecInfo)</code>

<code>            </code><code>{</code>

<code>                </code><code>if</code> <code>(ici.MimeType == mimeType)</code><code>return</code> <code>ici;</code>

<code>            </code><code>}</code>

<code>            </code><code>return</code> <code>null</code><code>;</code>

<code>        </code><code>/// 檢測擴充名的有效性</code>

<code>        </code><code>/// &lt;param name="sExt"&gt;檔案名擴充名&lt;/param&gt;</code>

<code>        </code><code>/// &lt;returns&gt;如果擴充名有效,傳回true,否則傳回false.&lt;/returns&gt;</code>

<code>        </code><code>private</code> <code>bool</code> <code>CheckValidExt(</code><code>string</code> <code>sExt)</code>

<code>            </code><code>bool</code> <code>flag =</code><code>false</code><code>;</code>

<code>            </code><code>string</code><code>[] aExt = AllowExt.Split(</code><code>"|"</code><code>);</code>

<code>            </code><code>foreach</code> <code>(</code><code>string</code> <code>filetype</code><code>in</code> <code>aExt)</code>

<code>                </code><code>if</code> <code>(filetype.ToLower() == sExt)</code>

<code>                </code><code>{</code>

<code>                    </code><code>flag =</code><code>true</code><code>;</code>

<code>                    </code><code>break</code><code>;</code>

<code>                </code><code>}</code>

<code>            </code><code>return</code> <code>flag;</code>

<code>        </code><code>/// 儲存圖檔</code>

<code>        </code><code>/// &lt;param name="image"&gt;Image 對象&lt;/param&gt;</code>

<code>        </code><code>/// &lt;param name="savePath"&gt;儲存路徑&lt;/param&gt;</code>

<code>        </code><code>/// &lt;param name="ici"&gt;指定格式的編解碼參數&lt;/param&gt;</code>

<code>        </code><code>private</code> <code>void</code> <code>SaveImage(System.Drawing.Image image,</code><code>string</code> <code>savePath, ImageCodecInfo ici)</code>

<code>            </code><code>//設定 原圖檔 對象的 EncoderParameters 對象</code>

<code>            </code><code>EncoderParameters parameters =</code><code>new</code> <code>EncoderParameters(1);</code>

<code>            </code><code>parameters.Param[0] =</code><code>new</code> <code>EncoderParameter(System.Drawing.Imaging.Encoder.Quality, ((</code><code>long</code><code>)tQuality));</code>

<code>            </code><code>image.Save(savePath, ici, parameters);</code>

<code>            </code><code>parameters.Dispose();</code>

<code>        </code><code>/// 生成縮略圖</code>

<code>        </code><code>/// &lt;param name="sourceImagePath"&gt;原圖檔路徑(相對路徑)&lt;/param&gt;</code>

<code>        </code><code>/// &lt;param name="thumbnailImagePath"&gt;生成的縮略圖路徑,如果為空則儲存為原圖檔路徑(相對路徑)&lt;/param&gt;</code>

<code>        </code><code>/// &lt;param name="thumbnailImageWidth"&gt;縮略圖的寬度(高度與按源圖檔比例自動生成)&lt;/param&gt;</code>

<code>        </code><code>public</code> <code>void</code> <code>ToThumbnail(</code><code>string</code> <code>sourceImagePath,</code><code>string</code> <code>thumbnailImagePath,</code><code>int</code> <code>thumbnailImageWidth,</code><code>int</code> <code>thumbnailImageHeight )</code>

<code>            </code><code>// 1.先檢查圖檔格式等資訊</code>

<code>            </code><code>string</code> <code>ThumbnailImagePath = thumbnailImagePath;</code>

<code>            </code><code>string</code> <code>SourceImagePath = sourceImagePath;</code>

<code>            </code><code>string</code> <code>sExt = SourceImagePath.Substring(SourceImagePath.LastIndexOf(</code><code>"."</code><code>)).ToLower();</code>

<code>            </code><code>if</code> <code>(SourceImagePath.ToString() == System.String.Empty)</code>

<code>                </code><code>throw</code> <code>new</code> <code>NullReferenceException(</code><code>"SourceImagePath is null!"</code><code>);</code>

<code>            </code><code>if</code> <code>(!CheckValidExt(sExt))</code>

<code>                </code><code>throw</code> <code>new</code> <code>ArgumentException(</code><code>"原圖檔檔案格式不正确,支援的格式有[ "</code> <code>+ AllowExt +</code><code>" ]"</code><code>,</code><code>"SourceImagePath"</code><code>);</code>

<code>            </code><code>// 從原圖檔建立 Image 對象</code>

<code>            </code><code>System.Drawing.Image image = System.Drawing.Image.FromFile(HttpContext.Current.Server.MapPath(SourceImagePath));</code>

<code>            </code><code>// 2.計算圖檔的位置、尺寸等資訊</code>

<code>            </code><code>int</code> <code>tWidth, tHeight, tLeft, tTop;</code>

<code>            </code><code>double</code> <code>fScale = (</code><code>double</code><code>)thumbnailImageHeight / (</code><code>double</code><code>)thumbnailImageWidth;</code><code>// 高度寬度比</code>

<code>            </code><code>if</code> <code>(((</code><code>double</code><code>)image.Width * fScale) &gt; (</code><code>double</code><code>)image.Height)</code><code>// 如果原圖比較寬</code>

<code>                </code><code>tWidth = thumbnailImageWidth;</code>

<code>                </code><code>tHeight = (</code><code>int</code><code>)((</code><code>double</code><code>)image.Height * (</code><code>double</code><code>)tWidth / (</code><code>double</code><code>)image.Width);</code>

<code>                </code><code>tLeft = 0;</code>

<code>                </code><code>tTop = (thumbnailImageHeight-tHeight)/2;</code>

<code>            </code><code>else</code>

<code>                </code><code>tHeight = thumbnailImageHeight;</code>

<code>                </code><code>tWidth = (</code><code>int</code><code>)((</code><code>double</code><code>)image.Width * (</code><code>double</code><code>)tHeight / (</code><code>double</code><code>)image.Height);</code>

<code>                </code><code>tLeft = (thumbnailImageWidth-tWidth)/2;</code>

<code>                </code><code>tTop = 0;</code>

<code>            </code><code>if</code> <code>(tLeft &lt; 0) tLeft = 0;</code>

<code>            </code><code>if</code> <code>(tTop &lt; 0) tTop = 0;</code>

<code>            </code><code>if</code> <code>(tBorder != Color.Transparent)</code>

<code>                </code><code>tWidth -= 2;</code>

<code>                </code><code>tHeight -= 2;</code>

<code>                </code><code>tLeft++;</code>

<code>                </code><code>tTop++;</code>

<code>            </code><code>if</code> <code>(tShadow != Color.Transparent)</code>

<code>                </code><code>tWidth -= 1;</code>

<code>                </code><code>tHeight -= 1;</code>

<code>            </code><code>//用指定的大小和格式初始化 Bitmap 類的新執行個體</code>

<code>            </code><code>//Bitmap bitmap = new Bitmap(ThumbnailImageWidth, num, PixelFormat.Format32bppArgb);</code>

<code>            </code><code>Bitmap bitmap =</code><code>new</code> <code>Bitmap(thumbnailImageWidth, thumbnailImageHeight, PixelFormat.Format32bppArgb);</code>

<code>            </code><code>//從指定的 Image 對象建立新 Graphics 對象</code>

<code>            </code><code>Graphics graphics = Graphics.FromImage(bitmap);</code>

<code>            </code><code>//清除整個繪圖面并以透明背景色填充</code>

<code>            </code><code>if</code> <code>(tBackground != Color.Transparent)</code>

<code>                </code><code>graphics.Clear(tBackground);</code>

<code>                </code><code>graphics.Clear(Color.Transparent);</code>

<code>            </code><code>// 添加陰影</code>

<code>                </code><code>Pen shPen =</code><code>new</code> <code>Pen(tShadow);</code>

<code>                </code><code>graphics.DrawLine(shPen,</code><code>new</code> <code>Point(1, thumbnailImageHeight-1),</code><code>new</code> <code>Point(thumbnailImageWidth-1, thumbnailImageHeight-1));</code>

<code>                </code><code>graphics.DrawLine(shPen,</code><code>new</code> <code>Point(thumbnailImageWidth-1, 1),</code><code>new</code> <code>Point(thumbnailImageWidth-1, thumbnailImageHeight-1));</code>

<code>            </code><code>// 添加邊框</code>

<code>                </code><code>Pen bdPen =</code><code>new</code> <code>Pen(tBorder);</code>

<code>                </code><code>if</code> <code>(tShadow != Color.Transparent)</code>

<code>                    </code><code>graphics.DrawRectangle(bdPen,</code><code>new</code> <code>Rectangle(0, 0, thumbnailImageWidth-2, thumbnailImageHeight-2));</code>

<code>                </code><code>else</code>

<code>                    </code><code>graphics.DrawRectangle(bdPen,</code><code>new</code> <code>Rectangle(0, 0, thumbnailImageWidth-1, thumbnailImageHeight-1));</code>

<code>            </code><code>//在指定位置并且按指定大小繪制 原圖檔 對象</code>

<code>            </code><code>graphics.DrawImage(image,</code><code>new</code> <code>Rectangle(tLeft, tTop, tWidth, tHeight));</code>

<code>            </code><code>image.Dispose();</code>

<code>            </code><code>try</code>

<code>                </code><code>//将此 原圖檔 以指定格式并用指定的編解碼參數儲存到指定檔案</code>

<code>                </code><code>string</code> <code>savepath = (ThumbnailImagePath ==</code><code>null</code> <code>? SourceImagePath : ThumbnailImagePath);</code>

<code>                </code><code>SaveImage(bitmap, HttpContext.Current.Server.MapPath(savepath), GetCodecInfo((</code><code>string</code><code>)htmimes[sExt]));</code>

<code>            </code><code>catch</code> <code>(System.Exception e)</code>

<code>                </code><code>throw</code> <code>e;</code>

<code>            </code><code>finally</code>

<code>                </code><code>bitmap.Dispose();</code>

<code>                </code><code>graphics.Dispose();</code>

<code>        </code><code>#region C#給圖檔添加水印</code>

<code>        </code><code>public</code> <code>void</code> <code>Mark(</code><code>string</code> <code>sourceImagePath,</code><code>string</code> <code>markString)</code>

<code>            </code><code>string</code> <code>markImagePath = sourceImagePath;</code>

<code>            </code><code>Bitmap bitmap =</code><code>new</code> <code>Bitmap(image.Width, image.Height, PixelFormat.Format32bppArgb);</code>

<code>            </code><code>graphics.DrawImage(image,</code><code>new</code> <code>Rectangle(0, 0, image.Width, image.Height));</code>

<code>            </code><code>#region 繪制水印</code>

<code>            </code><code>// 設定水印字型</code>

<code>            </code><code>int</code> <code>fHeight = image.Height/5;</code>

<code>            </code><code>if</code><code>(fHeight&gt;16) fHeight = 16;</code>

<code>            </code><code>Font drawFont =</code><code>new</code> <code>Font(</code><code>"Arial"</code><code>, fHeight);</code>

<code>            </code><code>// 設定水印文字位置,預設為左下角</code>

<code>            </code><code>float</code> <code>x = 4;</code>

<code>            </code><code>float</code> <code>y = image.Height - drawFont.Height - 4;</code>

<code>            </code><code>if</code> <code>(markPosition ==</code><code>"左上角"</code><code>)</code>

<code>                </code><code>y = 4;</code>

<code>            </code><code>if</code> <code>(markPosition ==</code><code>"右上角"</code><code>)</code>

<code>                </code><code>x = image.Width - markString.Length * fHeight / 2 - fHeight;</code>

<code>            </code><code>if</code> <code>(markPosition ==</code><code>"右下角"</code><code>)</code>

<code>            </code><code>if</code> <code>(markPosition ==</code><code>"圖檔中間"</code><code>)</code>

<code>                </code><code>x = image.Width / 2 - markString.Length * fHeight / 2;</code>

<code>                </code><code>y = image.Height / 2 - fHeight / 2;</code>

<code>            </code><code>StringFormat drawFormat =</code><code>new</code> <code>StringFormat();</code>

<code>            </code><code>drawFormat.FormatFlags = StringFormatFlags.NoWrap;</code>

<code>            </code><code>// 設定水印文字顔色,先繪制一個黑色字作為陰影,再繪制白色字,這樣比較顯眼;</code>

<code>            </code><code>SolidBrush drawBrush =</code><code>new</code> <code>SolidBrush(Color.Black);</code>

<code>            </code><code>graphics.DrawString(markString, drawFont, drawBrush, x, y, drawFormat);</code>

<code>            </code><code>drawBrush.Color = Color.White;</code>

<code>            </code><code>graphics.DrawString(markString, drawFont, drawBrush, x-1, y-1, drawFormat);</code>

<code>                </code><code>string</code> <code>savepath = SourceImagePath;</code>

<code>    </code><code>}</code>

<code>}</code>

    本文轉自曾祥展部落格園部落格,原文連結http://www.cnblogs.com/zengxiangzhan/archive/2009/12/31/1636549.html,如需轉載請自行聯系原作者