- (UIImage*)rotateImage:(UIImage *)image
{
int kMaxResolution = 960; // Or whatever
CGImageRef imgRef = image.CGImage;
CGFloat width = CGImageGetWidth(imgRef);
CGFloat height = CGImageGetHeight(imgRef);
CGAffineTransform transform = CGAffineTransformIdentity;
CGRect bounds = CGRectMake(0, 0, width, height);
if (width > kMaxResolution || height > kMaxResolution) {
CGFloat ratio = width/height;
if (ratio > 1) {
bounds.size.width = kMaxResolution;
bounds.size.height = bounds.size.width / ratio;
}
else {
bounds.size.height = kMaxResolution;
bounds.size.width = bounds.size.height * ratio;
}
}
CGFloat scaleRatio = bounds.size.width / width;
CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef));
CGFloat boundHeight;
UIImageOrientation orient = image.imageOrientation;
switch(orient) {
case UIImageOrientationUp: //EXIF = 1
transform = CGAffineTransformIdentity;
break;
case UIImageOrientationUpMirrored: //EXIF = 2
transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0);
transform = CGAffineTransformScale(transform, -1.0, 1.0);
break;
case UIImageOrientationDown: //EXIF = 3
transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height);
transform = CGAffineTransformRotate(transform, M_PI);
break;
case UIImageOrientationDownMirrored: //EXIF = 4
transform = CGAffineTransformMakeTranslation(0.0, imageSize.height);
transform = CGAffineTransformScale(transform, 1.0, -1.0);
break;
case UIImageOrientationLeftMirrored: //EXIF = 5
boundHeight = bounds.size.height;
bounds.size.height = bounds.size.width;
bounds.size.width = boundHeight;
transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width);
transform = CGAffineTransformScale(transform, -1.0, 1.0);
transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
break;
case UIImageOrientationLeft: //EXIF = 6
boundHeight = bounds.size.height;
bounds.size.height = bounds.size.width;
bounds.size.width = boundHeight;
transform = CGAffineTransformMakeTranslation(0.0, imageSize.width);
transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
break;
case UIImageOrientationRightMirrored: //EXIF = 7
boundHeight = bounds.size.height;
bounds.size.height = bounds.size.width;
bounds.size.width = boundHeight;
transform = CGAffineTransformMakeScale(-1.0, 1.0);
transform = CGAffineTransformRotate(transform, M_PI / 2.0);
break;
case UIImageOrientationRight: //EXIF = 8
boundHeight = bounds.size.height;
bounds.size.height = bounds.size.width;
bounds.size.width = boundHeight;
transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0);
transform = CGAffineTransformRotate(transform, M_PI / 2.0);
break;
default:
[NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"];
}
UIGraphicsBeginImageContext(bounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();
if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) {
CGContextScaleCTM(context, -scaleRatio, scaleRatio);
CGContextTranslateCTM(context, -height, 0);
}
else {
CGContextScaleCTM(context, scaleRatio, -scaleRatio);
CGContextTranslateCTM(context, 0, -height);
}
CGContextConcatCTM(context, transform);
CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef);
UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return imageCopy;
}
分享到:
相关推荐
总结来说,解决iOS拍照上传图片被旋转的问题,关键在于理解和处理图片的Exif元数据,尤其是Orientation字段。在Java后端处理图片时,我们可以通过读取元数据,判断图片的旋转方向,然后进行适当的旋转操作,确保图片...
上传图片压缩并且转为base64并且上传阿里云(对ios相机拍照旋转90度处理)
利用exif.js解决IOS手机H5页面拍照上传照片旋转90度问题: upLoadPic($inputBorn, $inpOutBorn, 1); 其中$inputBorn为type="file"的input, $inpOutBorn为展示图片用的盒子,盒子要给宽高,默认的情况下,图片是以背景...
exif.js是一个JavaScript库,用于从图像文件读取EXIF元数据。解决ios拍照出现旋转的问题
在iOS开发中,当用户通过系统相机拍摄照片后,有时会出现照片自动旋转90度的问题。这主要与图片的`imageOrientation`属性有关,该属性描述了图片在内存中的方向,与实际显示的方向可能不一致。尤其是在图片进行裁剪...
在iOS开发中,实现“ios拍照后按范围裁剪图片demo”涉及到多个关键知识点,主要集中在用户界面(UI)设计、图像处理以及照片权限管理。下面将详细解释这些技术要点。 首先,我们要创建一个自定义的拍照页面。这通常...
上篇文章【Js利用Canvas实现图片压缩功能】中做了图片压缩上传,但是在IOS真机测试的时候,发现图片预览的时候自动逆时针旋转了90度。对于这个bug,我完全不知道问题出在哪里,接下来就是面向百度编程了。通过度娘...
H5拍照解决苹果拍照旋转H5拍照解决苹果拍照旋转H5拍照解决苹果拍照旋转
例如,如果照片需要顺时针旋转90度,可以这样操作: ```swift let transform = CGAffineTransform(rotationAngle: .pi / 2) let rotatedCGImage = cgImage?.transformed(by: transform) let rotatedUIImage = ...
在开发“拍照并上传照片和说明的 iOS 客户端”时,我们需要关注以下几个关键知识点: 1. **iOS 应用程序开发环境**:首先,我们需要使用 Xcode,这是Apple官方提供的集成开发环境(IDE),用于编写Objective-C或...
这是因为iOS设备在拍摄照片时可能会记录照片的元数据(Exif信息),其中包括照片的旋转角度,这在上传到服务器或在不同设备上显示时可能导致显示异常。本篇文章将详细介绍如何利用Java来处理这个问题,特别是如何...
3. **处理旋转信息**:根据获取到的`Orientation`值,我们可以确定图片需要逆时针或顺时针旋转多少度。exif.js提供了一个`rotateImage()`方法,可以根据orientation值来旋转图片。 ```javascript function rotate...
例如,如果用户执行90度顺时针旋转,我们可以设置`transform = CGAffineTransform(rotationAngle: .pi / 2)`。 手势识别是该项目的另一个关键特性。iOS的`UIPanGestureRecognizer`、`UIPinchGestureRecognizer`、`...
在iOS开发中,图片合成(拍照换发)是一项常见的功能,尤其在美颜、娱乐类应用中非常流行。本文将详细讲解如何实现这样一个小程序,包括拍照、图像处理以及发型合成等核心步骤。 首先,我们需要使用iOS提供的...
在iOS开发中,创建自定义相机功能是一项常见的需求,它能提供给用户更个性化的拍照体验。本示例代码“ios应用源码之一个自定义的照相demo 2018127”旨在帮助开发者理解如何在iOS应用中构建这样的功能。下面将详细...
当用户在iOS或Android设备上拍照并旋转设备时,系统会记录下这一旋转动作,并在保存图片时将该信息写入到Exif元数据中。 在上传图片时,服务器端或者客户端应用程序通常需要读取并处理这些元数据,以确保图片按照...
在iOS开发中,集成拍照和摄像功能是常见的需求,用户可以通过这些功能拍摄照片或录制视频,然后将其保存到设备的相册中。本教程将详细讲解如何实现这一过程,主要涉及的知识点包括: 1. **AVFoundation框架**:在...
在iOS开发中,音视频相机组件是至关重要的部分,它为开发者提供了构建高效、功能丰富的媒体应用的基础。本文将深入探讨“iOS音视频相机组件”的核心知识点,包括AVFoundation框架的使用、视频流捕获、视频编码、相片...