2015-08-11 8 views
0

У меня возникли проблемы с вращением изображения в iOS. Я выполняю некоторые манипуляции с изображениями на фоне приложения ... Я хотел бы повернуть и обрезать изображения. В настоящее время вращение, кажется, работает правильно, но независимо от того, что я пробовал, урожай отключен. Я выполнил эти же операции в GIMP и обнаружил, что изображения обрезаны правильно, поэтому я считаю, что это имеет какое-то отношение к системе координат кварца. Кроме того, чем больше радианов в любом направлении, тем дальше становится «отбрасывание» урожая. Вот код, я использую, чтобы вращать и обрезать:Как повернуть и обрезать iOS CGImage из файла

+(UIImage*)imageWithImageFile:(NSString*)imageFile 
         radians:(float)radians 
        imageSize:(CGSize)imageSize 
       croppedToRect:(CGRect)croppedToRect 
{ 
    UIImage* returnImg = nil; 
    @autoreleasepool { 
     CGDataProviderRef dataProvider = CGDataProviderCreateWithFilename([imageFile UTF8String]); 
     CGImageRef image = CGImageCreateWithJPEGDataProvider(dataProvider, NULL, YES, kCGRenderingIntentDefault); 
     UIGraphicsBeginImageContext(croppedToRect.size); 

     CGContextRef context = UIGraphicsGetCurrentContext(); 

     CGContextSetShouldAntialias(context, YES); 
     CGContextSetAllowsAntialiasing(context, YES); 
     CGContextSetInterpolationQuality(context, kCGInterpolationHigh); 

     CGContextTranslateCTM(context, imageSize.width * 0.5, 
           imageSize.height * 0.5); 
     CGContextRotateCTM(context, radians); 
     CGContextTranslateCTM(context, -imageSize.width * 0.5, -imageSize.height * 0.5); 

     //Translate and scale upside-down to compensate for Quartz's inverted coordinate system 
     CGContextTranslateCTM(context, 0.0, imageSize.height); 
     CGContextScaleCTM(context, 1.0, -1.0); 

     CGContextDrawImage(context, (CGRect) {croppedToRect.origin, imageSize}, image); 
     returnImg = UIGraphicsGetImageFromCurrentImageContext(); 

     UIGraphicsEndImageContext(); 
     CGDataProviderRelease(dataProvider); 
     CGImageRelease(image); 
    } 

    return returnImg; 
} 

ответ

0

Я считаю, что это решение: Поскольку контекст разного размера и имеет другое происхождение внутри исходного изображения, вы должны компенсировать момент, когда вы «нарисовать» изображение в контексте (холст для вас из более визуальных людей). Сначала вы обнаружите источник центрированного контекста, а затем сравните его с источником нужного урожая. Разность (или смещение) может быть вычтена из центральной точки контекста, что будет компенсировать точку, в которой изображение будет окрашено.

CGDataProviderRef dataProvider = CGDataProviderCreateWithFilename([imageFile UTF8String]); 
    CGImageRef image = CGImageCreateWithJPEGDataProvider(dataProvider, NULL, YES, kCGRenderingIntentDefault); 

    UIGraphicsBeginImageContext(croppedToRect.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGPoint contextCenter = CGPointMake(croppedToRect.size.width * 0.5f, 
              croppedToRect.size.height * 0.5f); 
    CGPoint centerOfImage = CGPointMake(imageSize.width * 0.5f, 
             imageSize.height * 0.5f); 
    CGPoint contextOriginInImage = CGPointMake(centerOfImage.x - contextCenter.x, 
             centerOfImage.y - contextCenter.y); 
    CGPoint desiredOrigin = croppedToRect.origin; 
    CGPoint offset = CGPointMake(desiredOrigin.x - contextOriginInImage.x, 
           desiredOrigin.y - contextOriginInImage.y); 
    CGContextTranslateCTM(context, contextCenter.x - offset.x, contextCenter.y - offset.y); 
    CGContextRotateCTM(context, radians); 
    CGContextScaleCTM(context, 1.0f, -1.0f); 
    CGContextDrawImage(context, CGRectMake(-imageSize.width * 0.5f, 
              -imageSize.height * 0.5f, 
              imageSize.width, 
              imageSize.height), image); 
    returnImg = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 
    CGDataProviderRelease(dataProvider); 
    CGImageRelease(image);