NSImage rotated degrees—question

 

    之前的方法无疑是有问题的,今天写dylib的时候,突然发现,在不对称旋转的时候高会被压缩。失真严重,在测试了2个小时候发现。其实画的时候是正确的,确实的copy 到目的矩阵中了。可以是由于初始旋转的NSImage对象,设置的大小与原图一样,可是高宽不比为1的的时候,这种情况就会发生。当高宽相同的时候是完全正确的。

    解决的办法是画完后,在重设旋转后的NSImage对象的NSSize为目的size。如此一来完全正确。真是头都给旋晕了。又是晚上8点多了。该回去了。

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

    为了按照windows的图像旋转一致性,该了下角度。默认是逆时针旋转的。

    今天也发现另一个问题。在JPEG文件格式中。旋转的时候,你可以更改标志位。由于他不在进行压缩数据,达到旋转图片后不失真的效果。不过显示是否按照读取标识位,还得看图片工具是否按照标识位进行显示。在苹果上你旋转后,保存时候会提示你是否按照(EXif方向标识)存储图片。测试发现,在苹果显示是先检查Exif方向标识,如果有就按照其显示。否则按照数据显示。把图片旋转90度(更改标识位)的图片保存,copy到Windows XP上,发现还是正立的。

    要想读出Exif很简单。下次贴出代码。

    

你可能感兴趣的:(windows,测试,XP,存储,360,工具)