如何从本地URL获取UIImage并将图像发布到服务器?
如何从local url
获取UIImage并将图像发布到服务器? 我的url
如下:
file:///Users/macmini/Library/Developer/CoreSimulator/Devices/89104EAC-5BE1-4BEC-BE8E-7B8FFBF9CBD2/data/Media/DCIM/100APPLE/IMG_0005.JPG
以及如何减小此图像的大小
, {3000, 2002}
先谢谢你..
要从local url
获取图片:
NSURL *localurl = [NSURL URLWithString:path]; NSData *data = [NSData dataWithContentsOfURL:localurl]; UIImage *img = [[UIImage alloc] initWithData:data];
将图像发布到server
:
- (void)sendImageToServer { UIImage *img= [UIImage imageNamed:@"image.png"]; NSData *imageData = UIImagePNGRepresentation(img); NSString *postLength = [NSString stringWithFormat:@"%d", [imageData length]]; // Init the URLRequest NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setHTTPMethod:@"POST"]; [request setURL:[NSURL URLWithString:[NSString stringWithString:@"http://yoururl.domain"]]]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; [request setHTTPBody:imageData]; NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; if (connection) { // response data of the request } }
要从URL获取图像,您可以执行以下操作。
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageURL]]; UIImage *image = [UIImage imageWithData:imageData];
要压缩它,您必须再次将其转换为NSData。
NSData *lowResImgData= UIImageJPEGRepresentation(highResImage,0.1 /*compressionQuality*/); UIImage *lowResImage = [UIImage imageWithData:lowResImgData];
使用此代码选择图像….
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) { UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; imagePicker.delegate = self; imagePicker.allowsEditing = NO; [self presentViewController:imagePicker animated:YES completion:nil]; } else { [self showMessage:@"This device doesn't support photo libraries." withTitle:@"Error"]; }
使用以下代码合并压缩
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { NSURL *refURL = [info valueForKey:UIImagePickerControllerReferenceURL]; [picker.presentingViewController dismissViewControllerAnimated:YES completion:nil]; // to get the image image name use the following code ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *imageAsset) { ALAssetRepresentation *imageRep = [imageAsset defaultRepresentation]; NSLog(@"[imageRep filename] : %@", [imageRep filename]); [_imageNameArray addObject:[imageRep filename]]; }; [_uploadTbleView reloadData]; ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init]; [assetslibrary assetForURL:refURL resultBlock:resultblock failureBlock:nil]; UIImage* selectedImage = [info objectForKey:UIImagePickerControllerOriginalImage]; NSData *imgData = UIImageJPEGRepresentation(selectedImage, 1.0); dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // [self.baseArray addObject:[self encodeToBase64String: selectedImage]]; [self.baseArray addObject:[self base64forData:imgData]]; // NSLog(@"%@",[self encodeToBase64String: selectedImage]); }); [self.imageSizeArray addObject: [NSNumber numberWithInteger:[imgData length]]]; NSLog(@"Size of Image(bytes):%ld",[imgData length]); }
以下是在上传之前将图像压缩为base64的代码
- (NSString*)base64forData:(NSData*) theData { const uint8_t* input = (const uint8_t*)[theData bytes]; NSInteger length = [theData length]; static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; NSMutableData* data = [NSMutableData dataWithLength:((length + 2) / 3) * 4]; uint8_t* output = (uint8_t*)data.mutableBytes; NSInteger i; for (i=0; i < length; i += 3) { NSInteger value = 0; NSInteger j; for (j = i; j < (i + 3); j++) { value <<= 8; if (j < length) { value |= (0xFF & input[j]); } } NSInteger theIndex = (i / 3) * 4; output[theIndex + 0] = table[(value >> 18) & 0x3F]; output[theIndex + 1] = table[(value >> 12) & 0x3F]; output[theIndex + 2] = (i + 1) < length ? table[(value >> 6) & 0x3F] : '='; output[theIndex + 3] = (i + 2) < length ? table[(value >> 0) & 0x3F] : '='; } return [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; }
注意:
你的后端反过来必须解码这个base64数据来获取图像内容。 如果有任何问题,请再次回复我,我会帮助你
要减小图像的大小,请使用以下方法
-(UIImage *)resizeImage:(UIImage *)image scaledToSize:(CGSize)targetSize { float actualHeight = image.size.height; float actualWidth = image.size.width; float maxHeight = targetSize.height; float maxWidth = targetSize.width; float imgRatio = actualWidth/actualHeight; float maxRatio = maxWidth/maxHeight; float compressionQuality = 0.50;//50 percent compression if (actualHeight > maxHeight || actualWidth > maxWidth) { if(imgRatio < maxRatio) { //adjust width according to maxHeight imgRatio = maxHeight / actualHeight; actualWidth = imgRatio * actualWidth; actualHeight = maxHeight; } else if(imgRatio > maxRatio) { //adjust height according to maxWidth imgRatio = maxWidth / actualWidth; actualHeight = imgRatio * actualHeight; actualWidth = maxWidth; } else { actualHeight = maxHeight; actualWidth = maxWidth; } } CGRect rect = CGRectMake(0.0, 0.0, actualWidth, actualHeight); UIGraphicsBeginImageContext(rect.size); [image drawInRect:rect]; UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); NSData *imageData = UIImageJPEGRepresentation(img, compressionQuality); UIGraphicsEndImageContext(); return [UIImage imageWithData:imageData];
}
请查看以下url以在您的服务器中重置图像。
ios使用HTTP POST上传图像和文本
要压缩UIImage,它取决于你的需求。根据压缩的质量或根据大小的压缩。
第一种方式(质量),使用API如下:
UIImageJPEGRepresentation(UIImage * __nonnull image, CGFloat compressionQuality)
第二种方式,使用代码如下:
+ (UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize { // Create a graphics image context UIGraphicsBeginImageContext(newSize); // Tell the old image to draw in this new context, with the desired // new size [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; // Get the new image from the context UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); // End the context UIGraphicsEndImageContext(); // Return the new image. return newImage; }
要将本地图像文件上传到服务器,如果您使用AFNetWorking 3.x,此类代码可能适用于您:
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:host]]; [manager POST:path parameters:params constructingBodyWithBlock:^(id _Nonnull formData) { //local file url,for you is /Users/macmini/Library/Developer/CoreSimulator/Devices/89104EAC-5BE1-4BEC-BE8E-7B8FFBF9CBD2/data/Media/DCIM/100APPLE/IMG_0005.JPG NSURL *url = [NSURL fileURLWithPath:fileUrl]; [formData appendPartWithFileURL:url name:name fileName:fileName mimeType:mimeType error:nil]; } progress:^(NSProgress * _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { if (successBlock) { if (responseObject) { successBlock(responseObject); } } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { if (failureBlock) { HttpFailResponse *failResponse = [self _kep_configureFailResponseWithError:error]; failureBlock(failResponse); } }];