ente/thirdparty/flutter_image_compress/ios/Classes/UIImage+scale.m
2021-01-21 16:19:12 +05:30

75 lines
2.6 KiB
Dart

//
// Created by cjl on 2018/9/8.
//
#import "UIImage+scale.h"
#import "FlutterImageCompressPlugin.h"
@implementation UIImage (scale)
-(UIImage *)scaleWithMinWidth: (CGFloat)minWidth minHeight:(CGFloat)minHeight {
float actualHeight = self.size.height;
float actualWidth = self.size.width;
float imgRatio = actualWidth/actualHeight;
float maxRatio = minWidth/minHeight;
float scaleRatio = 1;
if(imgRatio < maxRatio) {
scaleRatio = minWidth / actualWidth;
} else {
scaleRatio = minHeight / actualHeight;
}
scaleRatio = fminf(1, scaleRatio);
actualWidth = floor(scaleRatio * actualWidth);
actualHeight = floor(scaleRatio * actualHeight);
CGRect rect = CGRectMake(0.0, 0.0, actualWidth, actualHeight);
UIGraphicsBeginImageContext(rect.size);
[self drawInRect:rect];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
if([FlutterImageCompressPlugin showLog]){
NSLog(@"scale = %.2f", scaleRatio);
NSLog(@"dst width = %.2f", rect.size.width);
NSLog(@"dst height = %.2f", rect.size.height);
}
return newImage;
}
- (UIImage *)rotate:(CGFloat) rotate{
return [self imageRotatedByDegrees:self deg:rotate];
}
- (UIImage *)imageRotatedByDegrees:(UIImage*)oldImage deg:(CGFloat)degrees{
if([FlutterImageCompressPlugin showLog]) {
NSLog(@"will rotate %f",degrees);
}
// calculate the size of the rotated view's containing box for our drawing space
UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0,oldImage.size.width, oldImage.size.height)];
CGAffineTransform t = CGAffineTransformMakeRotation(degrees * M_PI / 180);
rotatedViewBox.transform = t;
CGSize rotatedSize = rotatedViewBox.frame.size;
// Create the bitmap context
UIGraphicsBeginImageContext(rotatedSize);
CGContextRef bitmap = UIGraphicsGetCurrentContext();
// Move the origin to the middle of the image so we will rotate and scale around the center.
CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2);
// // Rotate the image context
CGContextRotateCTM(bitmap, (degrees * M_PI / 180));
// Now, draw the rotated/scaled image into the context
CGContextScaleCTM(bitmap, 1.0, -1.0);
CGContextDrawImage(bitmap, CGRectMake(-oldImage.size.width / 2, -oldImage.size.height / 2, oldImage.size.width, oldImage.size.height), [oldImage CGImage]);
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
@end