上传IOS应用程序的图像到服务器文件大小太大

我正在上传照片到一个IOS应用程序的服务器。 重要的是照片上传质量没有损失,并上传JPEG格式。 我目前的问题是,照片​​上传没有质量损失,但有一个比预期的文件大小。 例如:我通过应用程序上传了一个文件,文件大小为4.7 MB。 当我通过电子邮件发送相同的照片给我自己,并select电子邮件的“实际照片”选项,照片的大小只有1.7 MB。 并排比较显示质量没有差异。

这是我如何上传文件。

ALAssetsLibrary *library = [ALAssetsLibrary new]; [library getImageAtURL:orderImage.imageUrl with completionBlock:^(UIImage *image) NSData *fileData = UIImageJPEGRepresentation(image, 1.0) NSURLRequest *request = [self multipartFormRequestWithMethod:@"POST" path:path parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { [formData appendPartWithFileData:fileData name:@"uploadedfile" fileName:fileName mimeType:mimeType]; [formData appendPartWithFormData:[extraInfo dataUsingEncoding:NSISOLatin2StringEncoding] name:@"extraInfo"]; }]; 

问题是UIImageJPEGRepresentation 。 它不检索原始的JPEG,而是创build一个新的JPEG。 而当你使用1的compressionQuality质量(大概是为了避免进一步的图像质量损失)时,它创build这个没有压缩的新的表示(通常导致文件大于原始文件)。

我会build议使用getBytes来检索原始资产,而不是通过UIImage对其进行UIImageJPEGRepresentation并通过UIImageJPEGRepresentation获取数据:

 ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; [library assetForURL:assetsLibraryURL resultBlock:^(ALAsset *asset) { ALAssetRepresentation *representation = [asset defaultRepresentation]; // I generally would write directly to a `NSOutputStream`, but if you want it in a // NSData, it would be something like: NSMutableData *data = [NSMutableData data]; // now loop, reading data into buffer and writing that to our data stream NSError *error; long long bufferOffset = 0ll; NSInteger bufferSize = 10000; long long bytesRemaining = [representation size]; uint8_t buffer[bufferSize]; while (bytesRemaining > 0) { NSUInteger bytesRead = [representation getBytes:buffer fromOffset:bufferOffset length:bufferSize error:&error]; if (bytesRead == 0) { NSLog(@"error reading asset representation: %@", error); return; } bytesRemaining -= bytesRead; bufferOffset += bytesRead; [data appendBytes:buffer length:bytesRead]; } // ok, successfully read original asset; // do whatever you want with it here } failureBlock:^(NSError *error) { NSLog(@"error=%@", error); }]; 

如果您使用iOS 8中引入的Photos框架,可以使用PHImageManager获取图像数据:

 PHFetchResult *result = [PHAsset fetchAssetsWithALAssetURLs:@[assetsLibraryURL] options:nil]; PHAsset *asset = [result firstObject]; if (asset) { PHImageManager *manager = [PHImageManager defaultManager]; [manager requestImageDataForAsset:asset options:nil resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { // use `imageData` here }]; }