C#缩放和裁剪图片

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

C#代码  

  1. using System;

  2. using System.Collections.Generic;

  3. using System.Text;

  4. using System.Drawing;

  5. using System.Drawing.Drawing2D;

  6. using System.Drawing.Imaging;
  7. namespace Project

  8. {

  9. class ImageOperation

  10. {

  11. /// <summary>

  12. ///  Resize图片

  13. /// </summary>

  14. /// <param name="bmp">原始Bitmap </param>

  15. /// <param name="newW">新的宽度</param>

  16. /// <param name="newH">新的高度</param>

  17. /// <param name="Mode">保留着,暂时未用</param>

  18. /// <returns>处理以后的图片</returns>
  19. public static Bitmap ResizeImage(Bitmap bmp, int newW, int newH, int Mode)

  20. {

  21. try

  22. {

  23. Bitmap b = new Bitmap(newW, newH);

  24. Graphics g = Graphics.FromImage(b);

  25. // 插值算法的质量

  26. g.InterpolationMode = InterpolationMode.HighQualityBicubic;

  27. g.DrawImage(bmp, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);

  28. g.Dispose();

  29. return b;

  30. }

  31. catch

  32. {

  33. return null;

  34. }

  35. }

  36. /// <summary>

  37. /// 剪裁 -- 用GDI+

  38. /// </summary>

  39. /// <param name="b">原始Bitmap</param>

  40. /// <param name="StartX">开始坐标X</param>

  41. /// <param name="StartY">开始坐标Y</param>

  42. /// <param name="iWidth">宽度</param>

  43. /// <param name="iHeight">高度</param>

  44. /// <returns>剪裁后的Bitmap</returns>

  45. public static Bitmap Cut(Bitmap b, int StartX, int StartY, int iWidth, int iHeight)

  46. {

  47. if (b == null)

  48. {

  49. return null;

  50. }

  51. int w = b.Width;

  52. int h = b.Height;

  53. if (StartX >= w || StartY >= h)

  54. {

  55. return null;

  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. Bitmap bmpOut = new Bitmap(iWidth, iHeight, PixelFormat.Format24bppRgb);

  68. Graphics g = Graphics.FromImage(bmpOut);

  69. g.DrawImage(b, new Rectangle(0, 0, iWidth, iHeight), new Rectangle(StartX, StartY, iWidth, iHeight), GraphicsUnit.Pixel);

  70. g.Dispose();

  71. return bmpOut;

  72. }

  73. catch

  74. {

  75. return null;

  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的塞到目标区域里。

时间: 2024-10-13 16:26:47

C#缩放和裁剪图片的相关文章

PHP图片缩放,裁剪和压缩

Google PageSpeed Insights可以对网页加载速度评分,并给出优化建议 简单来说,优化图片即使用合适尺寸的图片(缩放,裁剪),压缩图片 这里只介绍jpng和png两种图片格式 软件准备: imagemagick apt-get install imagemagick   jpegtran apt-get install libjpeg-turbo-progs   optipng apt-get install optipng pngquant apt-get install p

UIImage 裁剪图片和等比列缩放图片

本文转载至 http://blog.csdn.net/cuiweijie3/article/details/9514293 转自 http://www.tedz.me/ios/uiimage-crop-resize-image @interface UIImage(UIImageScale) -(UIImage*)getSubImage:(CGRect)rect; -(UIImage*)scaleToSize:(CGSize)size; @end @implementation UIImage(

php图片上传类(支持缩放、裁剪、图片缩略功能)

代码: /** * @author [Lee] <[<[email protected]>]> * 1.自动验证文件是表单提交的文件还是base64流提交的文件 * 2.验证图片类型是否合法 * 3.验证图片尺寸是否合法 * 4.验证图片大小是否合法 * 5.支持缩放功能 * 6.支持裁剪功能 * 7.支持缩略图功能 */ class fileuploader{ private $file; private $type; public $suffix = array(); publ

对图片的缩放和裁剪

//1.缩放   - (UIImage *)zoomImage:(UIImage *)image toScale:(CGSize)reSize   {       //根据要显示的大小等比例算出缩放后的图片大小       NSLog(@"image=====w==%f\n--------image==%f\n\n",image.size.width,image.size.height);       ZoomInEqualPercent *ziep = [[ZoomInEqualPe

自定义裁剪图片

判断图片大小,根据裁剪目标对图片进行缩放,然后裁剪图片(在图像不变形情况下) /// <summary> /// 指定长宽裁剪 /// 按模版比例最大范围的裁剪图片并缩放至模版尺寸 /// </summary> /// <param name="fromFile">原图Stream对象</param> /// <param name="fileSaveUrl">保存路径</param> ///

Android Bitmap 常见的几个操作:缩放,裁剪,旋转,偏移

Android Bitmap 相关操作 常见的几个操作:缩放,裁剪,旋转,偏移      很多操作需要 Matrix 来支持:Matrix 通过矩阵来处理位图,计算出各个像素点的位置,从而把bitmap显示出来. matrix里有一个3x3的矩阵,用于图像处理: MSCALE_X MSKEW_X MTRANS_X MSKEW_Y MSCALE_Y MTRANS_Y MPERSP_0 MPERSP_1 MPERSP_2 根据变量名能猜出具体的用途:缩放X 偏移X 平移X偏移Y 缩放Y 平移Y透视0

HTML5 本地裁剪图片并上传至服务器(转)

很多情况下用户上传的图片都需要经过裁剪,比如头像啊什么的.但以前实现这类需求都很复杂,往往需要先把图片上传到服务器,然后返回给用户,让用户确定裁剪坐标,发送给服务器,服务器裁剪完再返回给用户,来回需要 5 步.步骤繁琐不说,当很多用户上传图片的时候也很影响服务器性能. HTML5 的出现让我们可以更方便的实现这一需求.虽然这里所说的技术都貌似有点过时了(前端界的“过时”,你懂的),但还是有些许参考价值.在这里我只说一下要点,具体实现同学们慢慢研究. 下面奉上我自己写的一个demo,在输入框中选好

简单的JS裁剪图片并存储

就我而言,页面上的设计比较灵动的部分,其实不是很多,诸如滑动验证码,图片裁剪等比较好的交互设计. 从刚开始工作的时候,我就想把这些东西了解下,无奈一直没这个需求,乘着今天的空闲,研究了一下午,期间遇到了大大小小的问题,一直备受折磨,这其实也反映一个问题,我的 还是比较薄弱. 话不多说,先大概讲下效果: 用户点击上传图片后,页面显示所上传的图片,并且出现裁剪框和两个预览区域,最后点击裁剪按钮保存裁剪的图片到服务器上. 效果很简单,整个过程我遇到的两个难点,第一个是裁剪的JS效果,第二个则是图片数据

PHP加Nginx实现动态裁剪图片方案

许久以前写过一篇也是关于高性能PHP图片动态裁剪方案的文章,那文章使用的是nginx Cache和rewrite实现的,当然再加上CDN,那个方案存在一个问题就是图片并没有实际生成,而是以二进制的形式存在缓存中.如果缓存失效了那么还需要请求php再次生成.如果说到区别这是我暂且认为的吧.利用空余时间,新增了静态生成图片支持,支持对图片3种模式切换,在门户网站自动对图片尺寸进行裁剪,减少服务器带宽,理论上应该也满足了业务的需求吧,图片裁剪使用了Imagick组件. 一.思路再现:1.先写好请求服务