我在iOS 3.1.3 iPhone上测试我的iPhone应用程序.我使用以下方法选择/捕获图像UIImagePickerController:
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
[imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
[imagePicker setDelegate:self];
[self.navigationController presentModalViewController:imagePicker animated:YES];
[imagePicker release];
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
self.image = [info objectForKey:UIImagePickerControllerOriginalImage];
imageView.image = self.image;
[self.navigationController dismissModalViewControllerAnimated:YES];
submitButton.enabled = YES;
}
Run Code Online (Sandbox Code Playgroud)
然后我在某个时候使用ASI类将它发送到我的Web服务器:
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://example.com/myscript.php"]];
[request setDelegate:self];
[request setStringEncoding:NSUTF8StringEncoding];
[request setShouldContinueWhenAppEntersBackground:YES];
//other post keys/values
[request setFile:UIImageJPEGRepresentation(self.image, 100.0f) withFileName:[NSString stringWithFormat:@"%d.jpg", [[NSDate date] timeIntervalSinceNow]] andContentType:@"image/jpg" forKey:@"imageFile"];
[request startAsynchronous];
Run Code Online (Sandbox Code Playgroud)
问题:当我用iphone拍照同时保持它的风景时,图像会上传到服务器并按照你的预期进行查看.当拍摄手机拍照时,图像会被上传并在旋转90度时被观看.
我的应用程序设置为仅在纵向模式下工作(颠倒和常规).
如何在上传后使图像始终显示正确的方向?
UIImageView中显示的图像看起来是正确的(在拍照后直接显示),但在服务器上查看则另有说明.
在过去的几周里,我一直在使用objective-c中的图像并注意到许多奇怪的行为.首先,像许多其他人一样,我一直遇到这个问题,用相机拍摄的图像(或用别人的相机和MMS给我拍摄)旋转90度.我不确定为什么这个世界会发生这种情况(因此我的问题),但我能够提出一个廉价的工作.
这次我的问题是为什么会发生这种情况?为什么Apple会旋转图像?当我用相机正面拍摄照片时,除非我执行上面提到的代码,否则当我保存照片时,它会被保存为旋转状态.现在,我的解决方法在几天前还可以.
我的应用程序修改的图像的各个像素,特别是PNG(所以任何JPEG转换被抛出窗外对我的情况)的alpha通道.几天前,我注意到即使图像在我的应用程序中正确显示,这要归功于我的解决方法代码,当我的算法修改图像的各个像素时,它认为图像是旋转的.因此,而不是在图像的顶部修改像素,它修改的图像侧的像素(因为它认为它应该被旋转)!我无法弄清楚如何在内存中旋转图像 - 理想情况下,我宁愿只是擦掉那个imageOrientation标志.
这是另一个令我困惑的东西......当我拍摄照片时,imageOrientation设置为3.我的解决方法代码非常智能,可以实现这一点并将其翻转,以便用户永远不会注意到.此外,我将图像保存到库中的代码实现了这一点,将其翻转,然后将其保存,使其正确显示在相机胶卷中.
该代码如下所示:
NSData* pngdata = UIImagePNGRepresentation (self.workingImage); //PNG wrap
UIImage* img = [self rotateImageAppropriately:[UIImage imageWithData:pngdata]];
UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);
Run Code Online (Sandbox Code Playgroud)
当我这个新保存的图像加载到我的应用程序,则imageOrientation是0 -正是我想看到的,而我的旋转解决办法甚至不需要运行(注:加载从互联网上的图像时,而不是用相机拍摄的图像,imageOrientation总是0,导致完美的行为).出于某种原因,我的保存代码似乎擦除了这个imageOrientation标志.我希望只是窃取该代码,并在用户拍照并将其添加到应用程序时使用它来擦除我的imageOrientation,但它似乎不起作用.有UIImageWriteToSavedPhotosAlbum什么特别的imageOrientation吗?
对于这个问题,最好的解决办法就是imageOrientation在用户完成拍摄图像后立即将其吹走.我认为Apple出于某种原因完成了旋转行为,对吧?一些人认为这是Apple的缺陷.
(...如果你还没有丢失......注2:当我拍摄水平照片时,一切似乎都很完美,就像从互联网上拍摄的照片一样)
编辑:
以下是一些图像和场景的实际情况.根据目前为止的评论,看起来这种奇怪的行为不仅仅是一种iPhone行为,我认为这种行为很好.
这是我带着我的手机(注意正确的方向)的照片的图片,它显示的样子,因为它没有我的电话时,我拍下照片:

以下是我通过电子邮件将图片发送给自己后的图片(看起来像Gmail正确处理):

这是图像在Windows中作为缩略图的样子(看起来不像是正确处理):

以下是使用Windows Photo Viewer打开时的实际图像(仍未正确处理):

在对这个问题的所有评论之后,这就是我在想的...... iPhone拍摄了一张图片,并说"要正确显示它,它需要旋转90度".此信息将在EXIF数据中.(为什么它需要旋转90度,而不是默认直线垂直,我不知道).从这里开始,Gmail非常智能,可以读取和分析EXIF数据,并正确显示它.但是,Windows不够智能,无法读取EXIF数据,因此显示图像不正确.我的假设是否正确?
我有一个带有 AVPreviewLayer 的全屏 avcapturesession。
当我切换相机时,预览层会正确显示视频,但保存后视频会颠倒。
我尝试过使用镜像和横向左/右属性来连接视频输出文件,但没有效果。
这是切换相机的方法:
- (void)swapFrontAndBackCameras {
// Assume the session is already running
NSArray * inputs = self . session.inputs;
for (AVCaptureDeviceInput * INPUT in inputs) {
AVCaptureDevice * Device = INPUT.device ;
if ( [ Device hasMediaType : AVMediaTypeVideo ] ) {
AVCaptureDevicePosition position = Device.position;
AVCaptureDevice * newCamera = nil;
AVCaptureDeviceInput * newInput = nil;
if(position == AVCaptureDevicePositionFront) {
newCamera = [ self cameraWithPosition : AVCaptureDevicePositionBack];
}
else
{
newCamera = [ self cameraWithPosition …Run Code Online (Sandbox Code Playgroud) 我已经阅读了许多与此相关的答案,但我仍然无法让它发挥作用.
我有一个用户可以在其中签名的视图.以下是它的外观:http://d.pr/i/McuE
我可以成功检索此图像并将其保存到文件系统,但我需要在保存前将其旋转90度,以便签名从左到右读取.
// Grab the image
UIGraphicsBeginImageContext(self.signArea.bounds.size);
[self.signArea drawRect: self.signArea.bounds];
UIImage *signatureImage = UIGraphicsGetImageFromCurrentImageContext();
//-- ? -- Rotate the image (this doesn't work) -- ? --
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextRotateCTM(context, M_PI_2);
UIGraphicsEndImageContext();
//Save the image as a PNG in Documents folder
[UIImagePNGRepresentation(signatureImage) writeToFile:[[PPHelpers documentsPath] stringByAppendingPathComponent:@"signature-temp.png"] atomically:YES];
Run Code Online (Sandbox Code Playgroud)
如何在保存之前旋转图像?
在此先感谢您的帮助.我使用iOS 7 SDK在Xcode 5上.