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

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

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

  1. PHP图片裁剪与缩放 / 无损裁剪图片

    图片太大且规格不统一,显示的控制需要靠JavaScript来完成,用在移动设备上时显示效果不好且流量巨大,需要对现有图片库的图片进行一次处理,生成符合移动设备用的缩略图,将原来客户端JS做的工作转移到 ...

  2. 【转】java缩放图片、java裁剪图片代码工具类

    一首先看下效果 二工具类 三测试类 在系统的上传图片功能中,我们无法控制用户上传图片的大小,用户可能会上传大到几十M小到1k的的图片,一方面图片太大占据了太多的空间,另一方面,我们没办法在页面上显示统 ...

  3. 用Js+css3实现图片旋转,缩放,裁剪,滤镜

    还是前端图片的老话题,花了半天时间,东拼西凑,凑出个demo,优点在于代码少,核心代码就6行,目前刚做了旋转,缩放,裁剪,滤镜要js做,网络上也有现成的代码, 但是想做到自定义的滤镜咋办呢?这还要从底 ...

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

    本文转载至 http://blog.csdn.net/cuiweijie3/article/details/9514293 转自 http://www.tedz.me/ios/uiimage-crop ...

  5. php使用imagick模块实现图片缩放、裁剪、压缩示例

    PHP 使用Imagick模块 缩放,裁剪,压缩图片 包括gif图片 缩放 裁剪 复制代码代码如下: /**  * 图片裁剪  * 裁剪规则:  *   1. 高度为空或为零   按宽度缩放 高度自适 ...

  6. 移动端实现裁剪图片生成base64图片(可缩放)

    移动端实现裁剪图片生成base64图片(可缩放)<pre><!DOCTYPE html><html lang="en"> <head> ...

  7. Fresco 二三事:图片处理之旋转、缩放、裁剪切割图片

    关于Fresco加载图片的处理,例如旋转.裁剪切割图片,在官方文档也都有提到,只是感觉写的不太详细,正好最近项目里有类似需求,所以分享一些使用小tip,后面的朋友就不用再走弯路浪费时间了.(测试图片分 ...

  8. .NetCore实现图片缩放与裁剪 - 基于ImageSharp

    前言 (突然发现断更有段时间了 最近在做博客的时候,需要实现一个类似Lorempixel.LoremPicsum这样的随机图片功能,图片有了,还需要一个根据输入的宽度高度获取图片的功能,由于之前处理图 ...

  9. 转载:Android调用相册、拍照实现缩放、切割图片

    好几天没有写博客了,感觉都有点懈怠了.笔者参加了大学生第二届软件设计大赛,这几天 一直在弄大赛的事情,没有花些时间来整理博客.好在经过一些时日比赛的东西也弄得差不多了, 接下来就是将这段时间学习里面有 ...

随机推荐

  1. UITableViewCell 自定义绘制 性能高

    // //  FoodListTableViewCellB.m //  BabyFood // //  Created by zhuang chaoxiao on 16/3/7. //  Copyri ...

  2. Java之--Java语言基础组成—函数

    Java语言基础组成-函数 Java语言由8个模块构成,分别为:关键字.标识符(包名.类名.接口名.常量名.变量名等).注释.常量和变量.运算符.语句.函数.数组. 本片主要介绍Java中的函数,函数 ...

  3. PIC和PIE

    PIC指的是位置无关代码,用于生成位置无关的共享库,所谓位置无关,指的是共享库的代码断是只读的,存放在代码段,多个进程可同时公用这份代码段而不需要拷贝副本.库中的变量(全局变量和静态变量)通过GOT表 ...

  4. Swift相关图书推荐

    Swift与Cocoa框架开发 作      者 [澳] 曼宁(Jonathon Manning),巴特菲尔德-艾迪生(Paris Buttfield 出 版 社 人民邮电出版社 出版时间 2015- ...

  5. CentOS下安装gns3

    1.安装支持环境 sudo yum intall PyQt4 telnet 2.安装抓包用的wireshark sudo yum install wireshark wireshark-gnome 3 ...

  6. C语言练习:第二大整数

    问题描述 编写一个程序,读入一组整数(不超过20个),当用户输入0时,表示输入结束.然后程序将从这组整数中,把第二大的那个整数找出来,并把它打印出来.说明:(1)0表示输入结束,它本身并不计入这组整数 ...

  7. Archlinux 踩坑实录

    Archlinux 没声音 1. 排查驱动,声卡驱动没问题 2.排查alsa,alsa没问题(并确认声卡存在且取消静音) 3.抱着尝试的心态,安下VLC.然后提示找不到默认声卡设备(大概这个意思),通 ...

  8. IOS列表实现动态多列

    . //图片列表 NSMutableArray *pictureList; //分组列表 NSMutableArray *indexArr; - (UITableViewCell *)tableVie ...

  9. 第三百二十四天 how can I 坚持

    下午去打了会篮球,好累,又把android开发环境搭建起来了,明天把天气应用搞起来. 今天老妈打电话说昨晚梦到我小时候了.. 是啊,都这么大了,不能让他们老操心了. 过两天买根鱼竿去钓鱼. 睡觉.

  10. ado通用操作数据单元

    DELPHI开发2层C/S数据库应用程序,许多人通过ADOQUERY或ADOTABLE直接操作数据库,其实这种方法虽然最为直接,但有其缺点:如果以后要将程序升级为3层C/S会非常困难.而通过像下面的通 ...