mirror of
https://github.com/apache/cordova-plugin-camera.git
synced 2025-05-14 02:41:39 +08:00
176 lines
6.0 KiB
Objective-C
176 lines
6.0 KiB
Objective-C
/*
|
|
Licensed to the Apache Software Foundation (ASF) under one
|
|
or more contributor license agreements. See the NOTICE file
|
|
distributed with this work for additional information
|
|
regarding copyright ownership. The ASF licenses this file
|
|
to you under the Apache License, Version 2.0 (the
|
|
"License"); you may not use this file except in compliance
|
|
with the License. You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing,
|
|
software distributed under the License is distributed on an
|
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
KIND, either express or implied. See the License for the
|
|
specific language governing permissions and limitations
|
|
under the License.
|
|
*/
|
|
|
|
#import "UIImage+CropScaleOrientation.h"
|
|
|
|
@implementation UIImage (CropScaleOrientation)
|
|
|
|
- (UIImage*)imageByScalingAndCroppingForSize:(CGSize)targetSize
|
|
{
|
|
UIImage* sourceImage = self;
|
|
UIImage* newImage = nil;
|
|
CGSize imageSize = sourceImage.size;
|
|
CGFloat width = imageSize.width;
|
|
CGFloat height = imageSize.height;
|
|
CGFloat targetWidth = targetSize.width;
|
|
CGFloat targetHeight = targetSize.height;
|
|
CGFloat scaleFactor = 0.0;
|
|
CGFloat scaledWidth = targetWidth;
|
|
CGFloat scaledHeight = targetHeight;
|
|
CGPoint thumbnailPoint = CGPointMake(0.0, 0.0);
|
|
|
|
if (CGSizeEqualToSize(imageSize, targetSize) == NO) {
|
|
CGFloat widthFactor = targetWidth / width;
|
|
CGFloat heightFactor = targetHeight / height;
|
|
|
|
if (widthFactor > heightFactor) {
|
|
scaleFactor = widthFactor; // scale to fit height
|
|
} else {
|
|
scaleFactor = heightFactor; // scale to fit width
|
|
}
|
|
scaledWidth = width * scaleFactor;
|
|
scaledHeight = height * scaleFactor;
|
|
|
|
// center the image
|
|
if (widthFactor > heightFactor) {
|
|
thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;
|
|
} else if (widthFactor < heightFactor) {
|
|
thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
|
|
}
|
|
}
|
|
|
|
UIGraphicsBeginImageContext(targetSize); // this will crop
|
|
|
|
CGRect thumbnailRect = CGRectZero;
|
|
thumbnailRect.origin = thumbnailPoint;
|
|
thumbnailRect.size.width = scaledWidth;
|
|
thumbnailRect.size.height = scaledHeight;
|
|
|
|
[sourceImage drawInRect:thumbnailRect];
|
|
|
|
newImage = UIGraphicsGetImageFromCurrentImageContext();
|
|
if (newImage == nil) {
|
|
NSLog(@"could not scale image");
|
|
}
|
|
|
|
// pop the context to get back to the default
|
|
UIGraphicsEndImageContext();
|
|
return newImage;
|
|
}
|
|
|
|
- (UIImage*)imageCorrectedForCaptureOrientation:(UIImageOrientation)imageOrientation
|
|
{
|
|
float rotation_radians = 0;
|
|
bool perpendicular = false;
|
|
|
|
switch (imageOrientation) {
|
|
case UIImageOrientationUp :
|
|
rotation_radians = 0.0;
|
|
break;
|
|
|
|
case UIImageOrientationDown:
|
|
rotation_radians = M_PI; // don't be scared of radians, if you're reading this, you're good at math
|
|
break;
|
|
|
|
case UIImageOrientationRight:
|
|
rotation_radians = M_PI_2;
|
|
perpendicular = true;
|
|
break;
|
|
|
|
case UIImageOrientationLeft:
|
|
rotation_radians = -M_PI_2;
|
|
perpendicular = true;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
UIGraphicsBeginImageContext(CGSizeMake(self.size.width, self.size.height));
|
|
CGContextRef context = UIGraphicsGetCurrentContext();
|
|
|
|
// Rotate around the center point
|
|
CGContextTranslateCTM(context, self.size.width / 2, self.size.height / 2);
|
|
CGContextRotateCTM(context, rotation_radians);
|
|
|
|
CGContextScaleCTM(context, 1.0, -1.0);
|
|
float width = perpendicular ? self.size.height : self.size.width;
|
|
float height = perpendicular ? self.size.width : self.size.height;
|
|
CGContextDrawImage(context, CGRectMake(-width / 2, -height / 2, width, height), [self CGImage]);
|
|
|
|
// Move the origin back since the rotation might've change it (if its 90 degrees)
|
|
if (perpendicular) {
|
|
CGContextTranslateCTM(context, -self.size.height / 2, -self.size.width / 2);
|
|
}
|
|
|
|
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
|
|
UIGraphicsEndImageContext();
|
|
return newImage;
|
|
}
|
|
|
|
- (UIImage*)imageCorrectedForCaptureOrientation
|
|
{
|
|
return [self imageCorrectedForCaptureOrientation:[self imageOrientation]];
|
|
}
|
|
|
|
- (UIImage*)imageByScalingNotCroppingForSize:(CGSize)targetSize
|
|
{
|
|
UIImage* sourceImage = self;
|
|
UIImage* newImage = nil;
|
|
CGSize imageSize = sourceImage.size;
|
|
CGFloat width = imageSize.width;
|
|
CGFloat height = imageSize.height;
|
|
CGFloat targetWidth = targetSize.width;
|
|
CGFloat targetHeight = targetSize.height;
|
|
CGFloat scaleFactor = 0.0;
|
|
CGSize scaledSize = targetSize;
|
|
|
|
if (CGSizeEqualToSize(imageSize, targetSize) == NO) {
|
|
CGFloat widthFactor = targetWidth / width;
|
|
CGFloat heightFactor = targetHeight / height;
|
|
|
|
// opposite comparison to imageByScalingAndCroppingForSize in order to contain the image within the given bounds
|
|
if (widthFactor > heightFactor) {
|
|
scaleFactor = heightFactor; // scale to fit height
|
|
} else {
|
|
scaleFactor = widthFactor; // scale to fit width
|
|
}
|
|
scaledSize = CGSizeMake(MIN(width * scaleFactor, targetWidth), MIN(height * scaleFactor, targetHeight));
|
|
}
|
|
|
|
// If the pixels are floats, it causes a white line in iOS8 and probably other versions too
|
|
scaledSize.width = (int)scaledSize.width;
|
|
scaledSize.height = (int)scaledSize.height;
|
|
|
|
UIGraphicsBeginImageContext(scaledSize); // this will resize
|
|
|
|
[sourceImage drawInRect:CGRectMake(0, 0, scaledSize.width, scaledSize.height)];
|
|
|
|
newImage = UIGraphicsGetImageFromCurrentImageContext();
|
|
if (newImage == nil) {
|
|
NSLog(@"could not scale image");
|
|
}
|
|
|
|
// pop the context to get back to the default
|
|
UIGraphicsEndImageContext();
|
|
return newImage;
|
|
}
|
|
|
|
@end
|