来自 ALAssetRepresentation 的 NSData 在发送到我的 Django 服务器时总是有错误的方向

Posted

技术标签:

【中文标题】来自 ALAssetRepresentation 的 NSData 在发送到我的 Django 服务器时总是有错误的方向【英文标题】:NSData from ALAssetRepresentation always has wrong orientation when sent to my Django Server 【发布时间】:2013-11-26 12:28:49 【问题描述】:

在我的应用程序中,我允许我的用户从他们的照片库上传图片或拍照。拍摄(或选择)该照片后,我使用该 AssetURL 执行以下操作:

- (void)uploadImageWithAssetURL:(NSURL *)url named:(id)name withParameters:(NSDictionary *)parameters atPath:(NSString *)path

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    [library assetForURL:url resultBlock:^(ALAsset *asset )
    
        ALAssetRepresentation *rep = [asset defaultRepresentation];
        Byte *buffer = (Byte*)malloc(rep.size);
        NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:rep.size error:nil];
        NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];

        NSString *extension = @".jpg";
        NSString *mimeType = @"image/jpeg";
        NSNumber *identifier = [parameters objectForKey:FileManagerOwnerObjectIDKey];
        NSString *filename = [NSString stringWithFormat:@"%@_%@%@", name, [_dateFormatter stringFromDate:[NSDate date]], extension];
        NSMutableURLRequest *request = [_httpClient multipartFormRequestWithMethod:@"POST" path:path parameters:parameters constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) 
            [formData appendPartWithFileData:data name:@"file" fileName:filename mimeType:mimeType];
        ];

        AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

        [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
         
             [_delegate fileManagerDidSuccessfullyUploadPicture:[NSDictionary dictionaryWithObjectsAndKeys:identifier, FileManagerOwnerObjectIDKey, name, FileManagerOwnerObjectTypeKey, section, FileManagerOwnerObjectSectionKey, nil]];

          failure:^(AFHTTPRequestOperation *operation, NSError *error) 
             [_delegate fileManagerDidNotSuccessfullyUploadPicture:[NSDictionary dictionaryWithObjectsAndKeys:identifier, FileManagerOwnerObjectIDKey, name, FileManagerOwnerObjectTypeKey, section, FileManagerOwnerObjectSectionKey, nil]];
         ];
        [operation start];
    
    failureBlock:^(NSError *error )
    
         NSLog(@"Error loading asset");
    ];

由于某种原因,如果图片是横向的,稍后会显示得很好。但是,如果该图片的 good 方向是纵向的,它看起来就像将它作为横向发送到我的 Django 服务器,并且我的服务器在调整大小等时将其视为横向。所以,我所有的头像都是倒过来的……

有什么想法吗?!

【问题讨论】:

【参考方案1】:

我知道我在 Twitter 上回答了这个问题,但为了其他遇到问题的人的利益:

很多照片(包括用 iPhone 拍摄的照片)都嵌入了旋转 EXIF 数据,一些应用程序尊重这些数据,而一些应用程序则忽略了这些数据。

默认情况下,ImageKit 不会对 EXIF 数据做任何特殊的事情。但是,如果您使用 Transpose 处理器,它将读取 EXIF 元数据并应用它指定的旋转。

更多解释请见here。

【讨论】:

以上是关于来自 ALAssetRepresentation 的 NSData 在发送到我的 Django 服务器时总是有错误的方向的主要内容,如果未能解决你的问题,请参考以下文章

从 ALAssetRepresentation 获取“修饰”图像

“PixelHeight”和“PixelWidth”是不是总是出现在 ALAssetRepresentation 元数据中?

如何获取共享照片流 ALAsset 的 ALAssetRepresentation?

正在报告 ALAssetRepresentation 元数据方法的崩溃

如何从 Swift 中的 ALAssetRepresentation 获取低分辨率图像或缩略图

Swift 中 ALAssetRepresentation CGImage 的内存泄漏