之前的方法无疑是有问题的,今天写dylib的时候,突然发现,在不对称旋转的时候高会被压缩。失真严重,在测试了2个小时候发现。其实画的时候是正确的,确实的copy 到目的矩阵中了。可以是由于初始旋转的NSImage对象,设置的大小与原图一样,可是高宽不比为1的的时候,这种情况就会发生。当高宽相同的时候是完全正确的。
解决的办法是画完后,在重设旋转后的NSImage对象的NSSize为目的size。如此一来完全正确。真是头都给旋晕了。又是晚上8点多了。该回去了。
- if(0< deg && deg <=90)
- {
- r1 = NSMakeRect(0.5*(srcw -srch), 0.5*(srch-srcw), srch, srcw);
- //r1 = NSMakeRect(200, 100, srch, srcw);
- newdeg = -90.0;
- }
- if(90< deg && deg <=180)
- {
- r1 = NSMakeRect(0, 0, srcw, srch);
- newdeg = 180.0;
- }
- if(180< deg && deg <=270)
- {
- r1 = NSMakeRect(0.5*(srcw -srch), 0.5*(srch-srcw), srch, srcw);
- newdeg = 90.0;
- }
- if(270< deg && deg <=360)
- {
- r1 = NSMakeRect(0, 0, srch, srcw);
- newdeg = 360;
- }
- //draw new image
- NSSize iiisi = NSMakeSize(r1.size.width, r1.size.height);
- NSImage *rotated = [[NSImage alloc] initWithSize:[sourceImage size]];
- [rotated lockFocus];
- NSAffineTransform *transform = [NSAffineTransform transform];
- [transform translateXBy:0.5*(srcw) yBy: 0.5*(srch)]; //按中心图片旋转
- [transform rotateByDegrees:newdeg]; //旋转度数,rotateByRadians:使用弧度
- [transform translateXBy:0.5*(-srcw) yBy: 0.5*(-srch)];
- [transform concat];
- [sourceImage drawInRect:r1 fromRect:NSMakeRect(0,0, srcsize.width ,srcsize.height) operation:NSCompositeCopy fraction:1.0];
- //[sourceImage drawAtPoint:NSZeroPoint fromRect:NSMakeRect(0,0, srcsize.width ,srcsize.height) operation:NSCompositeCopy fraction:1.0];
- //[[sourceImage bestRepresentationForDevice: nil] drawInRect: r1];//矩形内画图
- [rotated unlockFocus];
- [rotated setScalesWhenResized:YES];
- [rotated setSize:iiisi];
为了按照windows的图像旋转一致性,该了下角度。默认是逆时针旋转的。
今天也发现另一个问题。在JPEG文件格式中。旋转的时候,你可以更改标志位。由于他不在进行压缩数据,达到旋转图片后不失真的效果。不过显示是否按照读取标识位,还得看图片工具是否按照标识位进行显示。在苹果上你旋转后,保存时候会提示你是否按照(EXif方向标识)存储图片。测试发现,在苹果显示是先检查Exif方向标识,如果有就按照其显示。否则按照数据显示。把图片旋转90度(更改标识位)的图片保存,copy到Windows XP上,发现还是正立的。
要想读出Exif很简单。下次贴出代码。