Skip to content

Instantly share code, notes, and snippets.

@valvoline
Created January 5, 2016 22:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save valvoline/252bc6db18ff78008588 to your computer and use it in GitHub Desktop.
Save valvoline/252bc6db18ff78008588 to your computer and use it in GitHub Desktop.
//
// CIRotateFilter.h
// Touches
//
// Created by valvoline on 05/01/16.
// Copyright © 2016 valvoline. All rights reserved.
//
#import <CoreImage/CoreImage.h>
@interface CIRotateFilter : CIFilter
@property (retain, nonatomic) CIImage *inputImage;
@property (retain, nonatomic) NSNumber *inputDegree;
@end
//
// CIRotateFilter.m
// Touches
//
// Created by valvoline on 05/01/16.
// Copyright © 2016 valvoline. All rights reserved.
//
@import GLKit;
#import "CIRotateFilter.h"
@implementation CIRotateFilter
- (CGFloat)calculateDiagonal
{
CGRect rect = _inputImage.extent;
CGFloat seuareWidth = CGRectGetWidth(rect) * CGRectGetWidth(rect);
CGFloat seuareheight = CGRectGetHeight(rect) * CGRectGetHeight(rect);
return sqrtf( seuareWidth + seuareheight );
}
- (CGFloat)calculateScaleForAngle:(CGFloat)angle
{
CGFloat minSideLength = MIN(_inputImage.extent.size.width, _inputImage.extent.size.height);
angle = ABS(angle);
CGFloat width = (([self calculateDiagonal] - minSideLength) / 45) * angle + minSideLength;
CGFloat adjustment = 0;
if(angle <= 22.5)
{
adjustment = (angle / 150);
}
else
{
adjustment = ((45 - angle) / 150);
}
CGFloat scale = (width / minSideLength) + adjustment;
return scale;
}
- (CIImage *) outputImage
{
CGFloat a = _inputDegree.floatValue;
CGFloat x = _inputImage.extent.size.width/2.0;
CGFloat y = _inputImage.extent.size.height/2.0;
CGFloat scale = [self calculateScaleForAngle:GLKMathRadiansToDegrees(a)];
CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y);
transform = CGAffineTransformRotate(transform, a);
transform = CGAffineTransformTranslate(transform,-x,-y);
CGAffineTransform transform2 = CGAffineTransformMakeTranslation(x, y);
transform2 = CGAffineTransformScale(transform2, scale, scale);
transform2 = CGAffineTransformTranslate(transform2,-x,-y);
CGAffineTransform concate = CGAffineTransformConcat(transform2, transform);
CIFilter *filterTransform = [CIFilter filterWithName:@"CIAffineTransform"];
NSValue *rotation = [NSValue valueWithCGAffineTransform:concate];
[filterTransform setValue:rotation forKey:@"inputTransform"];
[filterTransform setValue:_inputImage forKey:@"inputImage"];
CGRect extent = [_inputImage extent];
return [filterTransform.outputImage imageByCroppingToRect:extent];
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment