最全的C#图片处理帮助类ImageHelper
生活随笔
收集整理的這篇文章主要介紹了
最全的C#图片处理帮助类ImageHelper
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最全的C#圖片處理幫助類ImageHelper.cs
方法介紹:
- 生成縮略圖
- 圖片水印處理方法
- 圖片水印位置處理方法
- 文字水印處理方法
- 文字水印位置的方法
- 調整光暗
- 反色處理
- 浮雕處理
- 拉伸圖片
- 濾色處理
- ?左右翻轉
- 上下翻轉
- 壓縮到指定尺寸
- 轉換為黑白圖片
- 獲取圖片中的各幀
資源下載列表
1 using System; 2 using System.Collections; 3 using System.IO; 4 using System.Drawing; 5 using System.Drawing.Imaging; 6 using System.Drawing.Drawing2D; 7 8 namespace HelloCsharp.Utilities 9 { 10 public class ImageClass 11 { 12 public ImageClass() 13 { } 14 15 #region 縮略圖 16 /// <summary> 17 /// 生成縮略圖 18 /// </summary> 19 /// <param name="originalImagePath">源圖路徑(物理路徑)</param> 20 /// <param name="thumbnailPath">縮略圖路徑(物理路徑)</param> 21 /// <param name="width">縮略圖寬度</param> 22 /// <param name="height">縮略圖高度</param> 23 /// <param name="mode">生成縮略圖的方式</param>??? 24 public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode) 25 { 26 System.Drawing.Image originalImage = System.Drawing.Image.FromFile(originalImagePath); 27 28 int towidth = width; 29 int toheight = height; 30 31 int x = 0; 32 int y = 0; 33 int ow = originalImage.Width; 34 int oh = originalImage.Height; 35 36 switch (mode) 37 { 38 case "HW":? //指定高寬縮放(可能變形)??????????????? 39 break; 40 case "W":?? //指定寬,高按比例??????????????????? 41 toheight = originalImage.Height * width / originalImage.Width; 42 break; 43 case "H":?? //指定高,寬按比例 44 towidth = originalImage.Width * height / originalImage.Height; 45 break; 46 case "Cut": //指定高寬裁減(不變形)??????????????? 47 if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight) 48 { 49 oh = originalImage.Height; 50 ow = originalImage.Height * towidth / toheight; 51 y = 0; 52 x = (originalImage.Width - ow) / 2; 53 } 54 else 55 { 56 ow = originalImage.Width; 57 oh = originalImage.Width * height / towidth; 58 x = 0; 59 y = (originalImage.Height - oh) / 2; 60 } 61 break; 62 default: 63 break; 64 } 65 66 //新建一個bmp圖片 67 System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight); 68 69 //新建一個畫板 70 System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap); 71 72 //設置高質量插值法 73 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; 74 75 //設置高質量,低速度呈現平滑程度 76 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 77 78 //清空畫布并以透明背景色填充 79 g.Clear(System.Drawing.Color.Transparent); 80 81 //在指定位置并且按指定大小繪制原圖片的指定部分 82 g.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, towidth, toheight), new System.Drawing.Rectangle(x, y, ow, oh), System.Drawing.GraphicsUnit.Pixel); 83 84 try 85 { 86 //以jpg格式保存縮略圖 87 bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg); 88 } 89 catch (System.Exception e) 90 { 91 throw e; 92 } 93 finally 94 { 95 originalImage.Dispose(); 96 bitmap.Dispose(); 97 g.Dispose(); 98 } 99 } 100 #endregion 101 102 #region 圖片水印 103 /// <summary> 104 /// 圖片水印處理方法 105 /// </summary> 106 /// <param name="path">需要加載水印的圖片路徑(絕對路徑)</param> 107 /// <param name="waterpath">水印圖片(絕對路徑)</param> 108 /// <param name="location">水印位置(傳送正確的代碼)</param> 109 public static string ImageWatermark(string path, string waterpath, string location) 110 { 111 string kz_name = Path.GetExtension(path); 112 if (kz_name == ".jpg" || kz_name == ".bmp" || kz_name == ".jpeg") 113 { 114 DateTime time = DateTime.Now; 115 string filename = "" + time.Year.ToString() + time.Month.ToString() + time.Day.ToString() + time.Hour.ToString() + time.Minute.ToString() + time.Second.ToString() + time.Millisecond.ToString(); 116 Image img = Bitmap.FromFile(path); 117 Image waterimg = Image.FromFile(waterpath); 118 Graphics g = Graphics.FromImage(img); 119 ArrayList loca = GetLocation(location, img, waterimg); 120 g.DrawImage(waterimg, new Rectangle(int.Parse(loca[0].ToString()), int.Parse(loca[1].ToString()), waterimg.Width, waterimg.Height)); 121 waterimg.Dispose(); 122 g.Dispose(); 123 string newpath = Path.GetDirectoryName(path) + filename + kz_name; 124 img.Save(newpath); 125 img.Dispose(); 126 File.Copy(newpath, path, true); 127 if (File.Exists(newpath)) 128 { 129 File.Delete(newpath); 130 } 131 } 132 return path; 133 } 134 135 /// <summary> 136 /// 圖片水印位置處理方法 137 /// </summary> 138 /// <param name="location">水印位置</param> 139 /// <param name="img">需要添加水印的圖片</param> 140 /// <param name="waterimg">水印圖片</param> 141 private static ArrayList GetLocation(string location, Image img, Image waterimg) 142 { 143 ArrayList loca = new ArrayList(); 144 int x = 0; 145 int y = 0; 146 147 if (location == "LT") 148 { 149 x = 10; 150 y = 10; 151 } 152 else if (location == "T") 153 { 154 x = img.Width / 2 - waterimg.Width / 2; 155 y = img.Height - waterimg.Height; 156 } 157 else if (location == "RT") 158 { 159 x = img.Width - waterimg.Width; 160 y = 10; 161 } 162 else if (location == "LC") 163 { 164 x = 10; 165 y = img.Height / 2 - waterimg.Height / 2; 166 } 167 else if (location == "C") 168 { 169 x = img.Width / 2 - waterimg.Width / 2; 170 y = img.Height / 2 - waterimg.Height / 2; 171 } 172 else if (location == "RC") 173 { 174 x = img.Width - waterimg.Width; 175 y = img.Height / 2 - waterimg.Height / 2; 176 } 177 else if (location == "LB") 178 { 179 x = 10; 180 y = img.Height - waterimg.Height; 181 } 182 else if (location == "B") 183 { 184 x = img.Width / 2 - waterimg.Width / 2; 185 y = img.Height - waterimg.Height; 186 } 187 else 188 { 189 x = img.Width - waterimg.Width; 190 y = img.Height - waterimg.Height; 191 } 192 loca.Add(x); 193 loca.Add(y); 194 return loca; 195 } 196 #endregion 197 198 #region 文字水印 199 /// <summary> 200 /// 文字水印處理方法 201 /// </summary> 202 /// <param name="path">圖片路徑(絕對路徑)</param> 203 /// <param name="size">字體大小</param> 204 /// <param name="letter">水印文字</param> 205 /// <param name="color">顏色</param> 206 /// <param name="location">水印位置</param> 207 public static string LetterWatermark(string path, int size, string letter, Color color, string location) 208 { 209 #region 210 211 string kz_name = Path.GetExtension(path); 212 if (kz_name == ".jpg" || kz_name == ".bmp" || kz_name == ".jpeg") 213 { 214 DateTime time = DateTime.Now; 215 string filename = "" + time.Year.ToString() + time.Month.ToString() + time.Day.ToString() + time.Hour.ToString() + time.Minute.ToString() + time.Second.ToString() + time.Millisecond.ToString(); 216 Image img = Bitmap.FromFile(path); 217 Graphics gs = Graphics.FromImage(img); 218 ArrayList loca = GetLocation(location, img, size, letter.Length); 219 Font font = new Font("宋體", size); 220 Brush br = new SolidBrush(color); 221 gs.DrawString(letter, font, br, float.Parse(loca[0].ToString()), float.Parse(loca[1].ToString())); 222 gs.Dispose(); 223 string newpath = Path.GetDirectoryName(path) + filename + kz_name; 224 img.Save(newpath); 225 img.Dispose(); 226 File.Copy(newpath, path, true); 227 if (File.Exists(newpath)) 228 { 229 File.Delete(newpath); 230 } 231 } 232 return path; 233 234 #endregion 235 } 236 237 /// <summary> 238 /// 文字水印位置的方法 239 /// </summary> 240 /// <param name="location">位置代碼</param> 241 /// <param name="img">圖片對象</param> 242 /// <param name="width">寬(當水印類型為文字時,傳過來的就是字體的大小)</param> 243 /// <param name="height">高(當水印類型為文字時,傳過來的就是字符的長度)</param> 244 private static ArrayList GetLocation(string location, Image img, int width, int height) 245 { 246 #region 247 248 ArrayList loca = new ArrayList();? //定義數組存儲位置 249 float x = 10; 250 float y = 10; 251 252 if (location == "LT") 253 { 254 loca.Add(x); 255 loca.Add(y); 256 } 257 else if (location == "T") 258 { 259 x = img.Width / 2 - (width * height) / 2; 260 loca.Add(x); 261 loca.Add(y); 262 } 263 else if (location == "RT") 264 { 265 x = img.Width - width * height; 266 } 267 else if (location == "LC") 268 { 269 y = img.Height / 2; 270 } 271 else if (location == "C") 272 { 273 x = img.Width / 2 - (width * height) / 2; 274 y = img.Height / 2; 275 } 276 else if (location == "RC") 277 { 278 x = img.Width - height; 279 y = img.Height / 2; 280 } 281 else if (location == "LB") 282 { 283 y = img.Height - width - 5; 284 } 285 else if (location == "B") 286 { 287 x = img.Width / 2 - (width * height) / 2; 288 y = img.Height - width - 5; 289 } 290 else 291 { 292 x = img.Width - width * height; 293 y = img.Height - width - 5; 294 } 295 loca.Add(x); 296 loca.Add(y); 297 return loca; 298 299 #endregion 300 } 301 #endregion 302 303 #region 調整光暗 304 /// <summary> 305 /// 調整光暗 306 /// </summary> 307 /// <param name="mybm">原始圖片</param> 308 /// <param name="width">原始圖片的長度</param> 309 /// <param name="height">原始圖片的高度</param> 310 /// <param name="val">增加或減少的光暗值</param> 311 public Bitmap LDPic(Bitmap mybm, int width, int height, int val) 312 { 313 Bitmap bm = new Bitmap(width, height);//初始化一個記錄經過處理后的圖片對象 314 int x, y, resultR, resultG, resultB;//x、y是循環次數,后面三個是記錄紅綠藍三個值的 315 Color pixel; 316 for (x = 0; x < width; x++) 317 { 318 for (y = 0; y < height; y++) 319 { 320 pixel = mybm.GetPixel(x, y);//獲取當前像素的值 321 resultR = pixel.R + val;//檢查紅色值會不會超出[0, 255] 322 resultG = pixel.G + val;//檢查綠色值會不會超出[0, 255] 323 resultB = pixel.B + val;//檢查藍色值會不會超出[0, 255] 324 bm.SetPixel(x, y, Color.FromArgb(resultR, resultG, resultB));//繪圖 325 } 326 } 327 return bm; 328 } 329 #endregion 330 331 #region 反色處理 332 /// <summary> 333 /// 反色處理 334 /// </summary> 335 /// <param name="mybm">原始圖片</param> 336 /// <param name="width">原始圖片的長度</param> 337 /// <param name="height">原始圖片的高度</param> 338 public Bitmap RePic(Bitmap mybm, int width, int height) 339 { 340 Bitmap bm = new Bitmap(width, height);//初始化一個記錄處理后的圖片的對象 341 int x, y, resultR, resultG, resultB; 342 Color pixel; 343 for (x = 0; x < width; x++) 344 { 345 for (y = 0; y < height; y++) 346 { 347 pixel = mybm.GetPixel(x, y);//獲取當前坐標的像素值 348 resultR = 255 - pixel.R;//反紅 349 resultG = 255 - pixel.G;//反綠 350 resultB = 255 - pixel.B;//反藍 351 bm.SetPixel(x, y, Color.FromArgb(resultR, resultG, resultB));//繪圖 352 } 353 } 354 return bm; 355 } 356 #endregion 357 358 #region 浮雕處理 359 /// <summary> 360 /// 浮雕處理 361 /// </summary> 362 /// <param name="oldBitmap">原始圖片</param> 363 /// <param name="Width">原始圖片的長度</param> 364 /// <param name="Height">原始圖片的高度</param> 365 public Bitmap FD(Bitmap oldBitmap, int Width, int Height) 366 { 367 Bitmap newBitmap = new Bitmap(Width, Height); 368 Color color1, color2; 369 for (int x = 0; x < Width - 1; x++) 370 { 371 for (int y = 0; y < Height - 1; y++) 372 { 373 int r = 0, g = 0, b = 0; 374 color1 = oldBitmap.GetPixel(x, y); 375 color2 = oldBitmap.GetPixel(x + 1, y + 1); 376 r = Math.Abs(color1.R - color2.R + 128); 377 g = Math.Abs(color1.G - color2.G + 128); 378 b = Math.Abs(color1.B - color2.B + 128); 379 if (r > 255) r = 255; 380 if (r < 0) r = 0; 381 if (g > 255) g = 255; 382 if (g < 0) g = 0; 383 if (b > 255) b = 255; 384 if (b < 0) b = 0; 385 newBitmap.SetPixel(x, y, Color.FromArgb(r, g, b)); 386 } 387 } 388 return newBitmap; 389 } 390 #endregion 391 392 #region 拉伸圖片 393 /// <summary> 394 /// 拉伸圖片 395 /// </summary> 396 /// <param name="bmp">原始圖片</param> 397 /// <param name="newW">新的寬度</param> 398 /// <param name="newH">新的高度</param> 399 public static Bitmap ResizeImage(Bitmap bmp, int newW, int newH) 400 { 401 try 402 { 403 Bitmap bap = new Bitmap(newW, newH); 404 Graphics g = Graphics.FromImage(bap); 405 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 406 g.DrawImage(bap, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bap.Width, bap.Height), GraphicsUnit.Pixel); 407 g.Dispose(); 408 return bap; 409 } 410 catch 411 { 412 return null; 413 } 414 } 415 #endregion 416 417 #region 濾色處理 418 /// <summary> 419 /// 濾色處理 420 /// </summary> 421 /// <param name="mybm">原始圖片</param> 422 /// <param name="width">原始圖片的長度</param> 423 /// <param name="height">原始圖片的高度</param> 424 public Bitmap FilPic(Bitmap mybm, int width, int height) 425 { 426 Bitmap bm = new Bitmap(width, height);//初始化一個記錄濾色效果的圖片對象 427 int x, y; 428 Color pixel; 429 430 for (x = 0; x < width; x++) 431 { 432 for (y = 0; y < height; y++) 433 { 434 pixel = mybm.GetPixel(x, y);//獲取當前坐標的像素值 435 bm.SetPixel(x, y, Color.FromArgb(0, pixel.G, pixel.B));//繪圖 436 } 437 } 438 return bm; 439 } 440 #endregion 441 442 #region 左右翻轉 443 /// <summary> 444 /// 左右翻轉 445 /// </summary> 446 /// <param name="mybm">原始圖片</param> 447 /// <param name="width">原始圖片的長度</param> 448 /// <param name="height">原始圖片的高度</param> 449 public Bitmap RevPicLR(Bitmap mybm, int width, int height) 450 { 451 Bitmap bm = new Bitmap(width, height); 452 int x, y, z; //x,y是循環次數,z是用來記錄像素點的x坐標的變化的 453 Color pixel; 454 for (y = height - 1; y >= 0; y--) 455 { 456 for (x = width - 1, z = 0; x >= 0; x--) 457 { 458 pixel = mybm.GetPixel(x, y);//獲取當前像素的值 459 bm.SetPixel(z++, y, Color.FromArgb(pixel.R, pixel.G, pixel.B));//繪圖 460 } 461 } 462 return bm; 463 } 464 #endregion 465 466 #region 上下翻轉 467 /// <summary> 468 /// 上下翻轉 469 /// </summary> 470 /// <param name="mybm">原始圖片</param> 471 /// <param name="width">原始圖片的長度</param> 472 /// <param name="height">原始圖片的高度</param> 473 public Bitmap RevPicUD(Bitmap mybm, int width, int height) 474 { 475 Bitmap bm = new Bitmap(width, height); 476 int x, y, z; 477 Color pixel; 478 for (x = 0; x < width; x++) 479 { 480 for (y = height - 1, z = 0; y >= 0; y--) 481 { 482 pixel = mybm.GetPixel(x, y);//獲取當前像素的值 483 bm.SetPixel(x, z++, Color.FromArgb(pixel.R, pixel.G, pixel.B));//繪圖 484 } 485 } 486 return bm; 487 } 488 #endregion 489 490 #region 壓縮圖片 491 /// <summary> 492 /// 壓縮到指定尺寸 493 /// </summary> 494 /// <param name="oldfile">原文件</param> 495 /// <param name="newfile">新文件</param> 496 public bool Compress(string oldfile, string newfile) 497 { 498 try 499 { 500 System.Drawing.Image img = System.Drawing.Image.FromFile(oldfile); 501 System.Drawing.Imaging.ImageFormat thisFormat = img.RawFormat; 502 Size newSize = new Size(100, 125); 503 Bitmap outBmp = new Bitmap(newSize.Width, newSize.Height); 504 Graphics g = Graphics.FromImage(outBmp); 505 g.CompositingQuality = CompositingQuality.HighQuality; 506 g.SmoothingMode = SmoothingMode.HighQuality; 507 g.InterpolationMode = InterpolationMode.HighQualityBicubic; 508 g.DrawImage(img, new Rectangle(0, 0, newSize.Width, newSize.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel); 509 g.Dispose(); 510 EncoderParameters encoderParams = new EncoderParameters(); 511 long[] quality = new long[1]; 512 quality[0] = 100; 513 EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality); 514 encoderParams.Param[0] = encoderParam; 515 ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders(); 516 ImageCodecInfo jpegICI = null; 517 for (int x = 0; x < arrayICI.Length; x++) 518 if (arrayICI[x].FormatDescription.Equals("JPEG")) 519 { 520 jpegICI = arrayICI[x]; //設置JPEG編碼 521 break; 522 } 523 img.Dispose(); 524 if (jpegICI != null) outBmp.Save(newfile, System.Drawing.Imaging.ImageFormat.Jpeg); 525 outBmp.Dispose(); 526 return true; 527 } 528 catch 529 { 530 return false; 531 } 532 } 533 #endregion 534 535 #region 圖片灰度化 536 public Color Gray(Color c) 537 { 538 int rgb = Convert.ToInt32((double)(((0.3 * c.R) + (0.59 * c.G)) + (0.11 * c.B))); 539 return Color.FromArgb(rgb, rgb, rgb); 540 } 541 #endregion 542 543 #region 轉換為黑白圖片 544 /// <summary> 545 /// 轉換為黑白圖片 546 /// </summary> 547 /// <param name="mybt">要進行處理的圖片</param> 548 /// <param name="width">圖片的長度</param> 549 /// <param name="height">圖片的高度</param> 550 public Bitmap BWPic(Bitmap mybm, int width, int height) 551 { 552 Bitmap bm = new Bitmap(width, height); 553 int x, y, result; //x,y是循環次數,result是記錄處理后的像素值 554 Color pixel; 555 for (x = 0; x < width; x++) 556 { 557 for (y = 0; y < height; y++) 558 { 559 pixel = mybm.GetPixel(x, y);//獲取當前坐標的像素值 560 result = (pixel.R + pixel.G + pixel.B) / 3;//取紅綠藍三色的平均值 561 bm.SetPixel(x, y, Color.FromArgb(result, result, result)); 562 } 563 } 564 return bm; 565 } 566 #endregion 567 568 #region 獲取圖片中的各幀 569 /// <summary> 570 /// 獲取圖片中的各幀 571 /// </summary> 572 /// <param name="pPath">圖片路徑</param> 573 /// <param name="pSavePath">保存路徑</param> 574 public void GetFrames(string pPath, string pSavedPath) 575 { 576 Image gif = Image.FromFile(pPath); 577 FrameDimension fd = new FrameDimension(gif.FrameDimensionsList[0]); 578 int count = gif.GetFrameCount(fd); //獲取幀數(gif圖片可能包含多幀,其它格式圖片一般僅一幀) 579 for (int i = 0; i < count; i++)??? //以Jpeg格式保存各幀 580 { 581 gif.SelectActiveFrame(fd, i); 582 gif.Save(pSavedPath + "\\frame_" + i + ".jpg", ImageFormat.Jpeg); 583 } 584 } 585 #endregion 586 } 587 } View Code?
轉載于:https://www.cnblogs.com/huhangfei/p/4991988.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的最全的C#图片处理帮助类ImageHelper的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第4章:数组与方法
- 下一篇: AJAX跨域资源共享 CORS 详解