首页 > 学院 > 开发设计 > 正文

C#缩放和裁剪图片

2019-11-17 03:06:44
字体:
来源:转载
供稿:网友
C#缩放和裁剪图片

在GDI+中,缩放和剪裁可以看作同一个操作,无非就是原始区域的选择不同罢了。空口无凭,先看具体算法可能更好理解。

C#代码收藏代码
  1. usingSystem;
  2. usingSystem.Collections.Generic;
  3. usingSystem.Text;
  4. usingSystem.Drawing;
  5. usingSystem.Drawing.Drawing2D;
  6. usingSystem.Drawing.Imaging;
  7. namespacePRoject
  8. {
  9. classImageOperation
  10. {
  11. ///<summary>
  12. ///Resize图片
  13. ///</summary>
  14. ///<paramname="bmp">原始Bitmap</param>
  15. ///<paramname="newW">新的宽度</param>
  16. ///<paramname="newH">新的高度</param>
  17. ///<paramname="Mode">保留着,暂时未用</param>
  18. ///<returns>处理以后的图片</returns>
  19. publicstaticBitmapResizeImage(Bitmapbmp,intnewW,intnewH,intMode)
  20. {
  21. try
  22. {
  23. Bitmapb=newBitmap(newW,newH);
  24. Graphicsg=Graphics.FromImage(b);
  25. //插值算法的质量
  26. g.InterpolationMode=InterpolationMode.HighQualityBicubic;
  27. g.DrawImage(bmp,newRectangle(0,0,newW,newH),newRectangle(0,0,bmp.Width,bmp.Height),GraphicsUnit.Pixel);
  28. g.Dispose();
  29. returnb;
  30. }
  31. catch
  32. {
  33. returnnull;
  34. }
  35. }
  36. ///<summary>
  37. ///剪裁--用GDI+
  38. ///</summary>
  39. ///<paramname="b">原始Bitmap</param>
  40. ///<paramname="StartX">开始坐标X</param>
  41. ///<paramname="StartY">开始坐标Y</param>
  42. ///<paramname="iWidth">宽度</param>
  43. ///<paramname="iHeight">高度</param>
  44. ///<returns>剪裁后的Bitmap</returns>
  45. publicstaticBitmapCut(Bitmapb,intStartX,intStartY,intiWidth,intiHeight)
  46. {
  47. if(b==null)
  48. {
  49. returnnull;
  50. }
  51. intw=b.Width;
  52. inth=b.Height;
  53. if(StartX>=w||StartY>=h)
  54. {
  55. returnnull;
  56. }
  57. if(StartX+iWidth>w)
  58. {
  59. iWidth=w-StartX;
  60. }
  61. if(StartY+iHeight>h)
  62. {
  63. iHeight=h-StartY;
  64. }
  65. try
  66. {
  67. BitmapbmpOut=newBitmap(iWidth,iHeight,PixelFormat.Format24bppRgb);
  68. Graphicsg=Graphics.FromImage(bmpOut);
  69. g.DrawImage(b,newRectangle(0,0,iWidth,iHeight),newRectangle(StartX,StartY,iWidth,iHeight),GraphicsUnit.Pixel);
  70. g.Dispose();
  71. returnbmpOut;
  72. }
  73. catch
  74. {
  75. returnnull;
  76. }
  77. }
  78. }
  79. }

目标其实都是new Rectangle(0, 0, iWidth, iHeight),缩放算法把整个原始图都往目标区域里塞new Rectangle(0, 0, bmp.Width, bmp.Height),而剪裁只是把原始区域上等宽等高的那个区域new Rectangle(StartX, StartY, iWidth, iHeight)1:1的塞到目标区域里。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表