Add basic support for rotation on iOS (#46)

This commit is contained in:
cfogelklou 2016-09-20 17:08:27 +02:00 committed by Florian Rival
parent 8bb52ccf8d
commit af2a09e1d8
3 changed files with 45 additions and 2 deletions

View File

@ -53,7 +53,7 @@ maxWidth | Image max width (ratio is preserved)
maxHeight | Image max height (ratio is preserved)
compressFormat | Can be either JPEG, PNG or WEBP (android only).
quality | A number between 0 and 100. Used for the JPEG compression.
rotation | Rotation to apply to the image, in degrees, for android only. On iOS, the resizing is done such that the orientation is always up.
rotation | Rotation to apply to the image, in degrees, for android. On iOS, rotation is limited (and rounded) to multiples of 90 degrees.
outputPath | The resized image path. If null, resized image will be stored in cache folder. To set outputPath make sure to add option for rotation too (if no rotation is needed, just set it to 0).
## Other open-source modules by the folks at [BAM](http://github.com/bamlab)

View File

@ -9,7 +9,7 @@ export default {
}
return new Promise((resolve, reject) => {
NativeModules.ImageResizer.createResizedImage(path, width, height, format, quality, outputPath, (err, resizedPath) => {
NativeModules.ImageResizer.createResizedImage(path, width, height, format, quality, rotation, outputPath, (err, resizedPath) => {
if (err) {
return reject(err);
}

View File

@ -51,11 +51,45 @@ NSString * generateFilePath(NSString * ext, NSString * outputPath)
return fullPath;
}
UIImage * rotateImage(UIImage *inputImage, float rotationDegrees)
{
// We want only fixed 0, 90, 180, 270 degree rotations.
const int rotDiv90 = (int)round(rotationDegrees / 90);
const int rotQuadrant = rotDiv90 % 4;
const int rotQuadrantAbs = (rotQuadrant < 0) ? rotQuadrant + 4 : rotQuadrant;
// Return the input image if no rotation specified.
if (0 == rotQuadrantAbs) {
return inputImage;
} else {
// Rotate the image by 80, 180, 270.
UIImageOrientation orientation = UIImageOrientationUp;
switch(rotQuadrantAbs) {
case 1:
orientation = UIImageOrientationRight; // 90 deg CW
break;
case 2:
orientation = UIImageOrientationDown; // 180 deg rotation
break;
default:
orientation = UIImageOrientationLeft; // 90 deg CCW
break;
}
return [[UIImage alloc] initWithCGImage: inputImage.CGImage
scale: 1.0
orientation: orientation];
}
}
RCT_EXPORT_METHOD(createResizedImage:(NSString *)path
width:(float)width
height:(float)height
format:(NSString *)format
quality:(float)quality
rotation:(float)rotation
outputPath:(NSString *)outputPath
callback:(RCTResponseSenderBlock)callback)
{
@ -76,6 +110,15 @@ RCT_EXPORT_METHOD(createResizedImage:(NSString *)path
}
}
// Rotate image if rotation is specified.
if (0 != (int)rotation) {
image = rotateImage(image, rotation);
if (image == nil) {
callback(@[@"Can't rotate the image.", @""]);
return;
}
}
// Do the resizing
UIImage * scaledImage = [image scaleToSize:newSize];
if (scaledImage == nil) {