操作Image,封装的方法

  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 DotNet.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 }

 

你可能感兴趣的:(image)