我用NSImage类在它的中心旋转了一个NSAffineTransform,它可以工作。守则如下:
- (NSImage*)rotateImage: (NSImage*)myImage angle:(float)rotateAngle {
NSRect imageBounds = {NSZeroPoint, [myImage size]};
NSRect transformedImageBounds = imageBounds;
NSBezierPath* boundsPath = [NSBezierPath bezierPathWithRect:imageBounds];
NSAffineTransform* transform = [NSAffineTransform transform];
// calculate the bounds for the rotated image
if (rotateAngle != 0) {
NSAffineTransform* temptransform = [NSAffineTransform transform];
[temptransform rotateByDegrees:rotateAngle];
[boundsPath transformUsingAffineTransform:temptransform];
NSRect rotatedBounds = {NSZeroPoint, [boundsPath bounds].size};
// center the image within the rotated bounds
imageBounds.origin.x += (NSWidth(rotatedBounds) - NSWidth (imageBounds))/2;
imageBounds.origin.y += (NSHeight(rotatedBounds) - NSHeight (imageBounds))/2;
// set up the rotation transform
[transform translateXBy:+(NSWidth(rotatedBounds) / 2) yBy:+ (NSHeight(rotatedBounds) / 2)];
[transform rotateByDegrees:rotateAngle];
[transform translateXBy:-(NSWidth(rotatedBounds) / 2) yBy:- (NSHeight(rotatedBounds) / 2)];
transformedImageBounds = rotatedBounds;
}
// draw the original image into the new image
NSImage* transformedImage = [[NSImage alloc] initWithSize:transformedImageBounds.size];;
[transformedImage lockFocus];
[transform concat];
[myImage drawInRect:imageBounds fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0] ;
[transformedImage unlockFocus];
return transformedImage;
}但是所得到的图像质量很差。如何解决这个问题?
有人说"lockFocus“方法造成了这种情况,但我不知道如何不使用该方法。
发布于 2010-12-08 13:56:26
我不知道它在这个管道中的位置是什么,但是如果您能够获得NSGraphicsContext (这可能很简单,就像:
NSGraphicsContext *myContext = NSGraphicsContext currentContext;
在你的lockFocus之后,你可以尝试
setImageInterpolation:NSImageInterpolationHigh
myContext
要求可可使用它的最佳算法来缩放图像。如果您切换到使用CGImageRef API,我知道您可以很容易地获得对插值设置的更多控制。
https://stackoverflow.com/questions/4385644
复制相似问题