学习COCOA “图片旋转”

    最近项目因为要使用到图片的缩放,制作缩放后的图片等操作,研究了下NSImage类。以及 cocoa 画图的方法。由于系统要兼容10.4。所以还是选择支持10.4的方法来实现。

    NSImage 类 可以从文件,URL,NSData 获得一个Image,也可以自己画一个位图,使用NSBitmapImageRep 类。

    NSImage 可以显示到NSImageView 中。你可以不改变image数据,可以直接操作 NSImageView 对象,可以缩放等操作。

    由于我要制作旋转后的数据,所以要多Image进行旋转。NSImage 提供了一个方法,支持“倒转”。

 

  1. [image setScalesWhenResized:YES];
  2. [image setSize:psize];
  3. [image setFlipped:YES]; //设置倒转

前面2句是对image的缩放,设置大小NSSize=NSMakeSize{100,200},最后一句实现了倒转。这个功能不能满足我的需求。

所以我对NSImage 类进行了扩展,代码如下:

  1. + (NSImage *) rotateImage:(NSImage*)sourceImage byDegrees:(float)deg
  2. {
  3.     NSSize srcsize= [sourceImage size];
  4.     float srcw = srcsize.width;
  5.     float srch= srcsize.height;
  6.     float newdeg = 0;
  7.     //旋转弧度
  8.     //double ratain = ((deg/180) * PI);
  9.     NSRect r1;
  10.     if(0< deg && deg <=90)
  11.     {
  12.         r1 = NSMakeRect(0.5*(srcw -srch), 0.5*(srch-srcw), srch, srcw);
  13.         newdeg = 90.0;
  14.     }
  15.     if(90< deg && deg <=180)
  16.     {
  17.         r1 = NSMakeRect(0, 0, srcw, srch);
  18.         newdeg = 180.0;
  19.     }
  20.     if(180< deg && deg <=270)
  21.     {
  22.         r1 = NSMakeRect(0.5*(srcw -srch), 0.5*(srch-srcw), srch, srcw);
  23.         newdeg = 270.0;
  24.     }
  25.     if(270< deg && deg <=360)
  26.     {
  27.         r1 = NSMakeRect(0, 0, srch, srcw);
  28.         newdeg = 360;
  29.     }
  30.     //draw new image
  31.     NSImage *rotated = [[NSImage alloc] initWithSize:[sourceImage size]];
  32.     [rotated lockFocus];
  33.     NSAffineTransform *transform = [NSAffineTransform transform];
  34.     [transform translateXBy:(0.5*srcw) yBy: (0.5*srch)];  //按中心图片旋转
  35.     [transform rotateByDegrees:newdeg];                   //旋转度数,rotateByRadians:使用弧度
  36.     [transform translateXBy:(-0.5*srcw) yBy: (-0.5*srch)];
  37.     [transform concat];
  38.     [[sourceImage bestRepresentationForDevice: nil] drawInRect: r1];//矩形内画图
  39.     
  40.     //[sourceImage drawInRect:r1 fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0];
  41.     //[sourceImage drawAtPoint:arge/*NSZeroPoint*/ fromRect:NSMakeRect(arge.x, arge.y,ww ,wh)/*NSZeroRect*/ operation:NSCompositeCopy fraction:1.0];
  42.     [rotated unlockFocus];
  43.     
  44.     return [rotated autorelease];

    原理:NSAffineTransform 类,反射转换,他可以使用一个定点,旋转图片。设置原点为定点,只要:

 

  1.   NSImage *rotated = [[NSImage alloc] initWithSize:[sourceImage size]];
  2.     [rotated lockFocus];
  3.     NSAffineTransform *transform = [NSAffineTransform transform];
  4.     [transform rotateByDegrees:newdeg];       
  5.     [transform concat];
  6.     [rotated unlockFocus];

    而我使用了图片对角线的交点作为定点。然后旋转一个角度,找到图片的4个顶点x,y坐标的最小值作为新坐标系的原点,得到离新坐标原点最远的x,y坐标值。得到新矩形的宽和长。

    从而构造了一个新的NSRect {x,y,width,height};

    这样就可以使用NSImage的draw方法画这个新的矩形,得到旋转后新的图片Image。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值