Как сжать/изменить размер изображения на iOS перед загрузкой на сервер?
В настоящее время я загружаю изображение на сервер с помощью Imgur на iOS со следующим кодом:
NSData* imageData = UIImagePNGRepresentation(image);
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* fullPathToFile = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"SBTempImage.png"];
[imageData writeToFile:fullPathToFile atomically:NO];
[uploadRequest setFile:fullPathToFile forKey:@"image"];
Код работает нормально при запуске в симуляторе и загрузке файла из библиотеки фотографий симулятора, потому что у меня быстрое соединение с Ethernet. Тем не менее, тот же код тайм-аут на iPhone при выборе изображения, сделанного с iPhone. Итак, я попробовал это, сохранив небольшое изображение из Интернета и попытавшись загрузить то, что сработало.
Это наводит меня на мысль, что большие изображения, сделанные iPhone, задерживаются по несколько медленной сети 3G. Есть ли способ сжать/изменить размер изображения с iPhone перед его отправкой?
Ответы
Ответ 1
Вы можете сделать меньшее изображение, сделав что-то вроде
UIImage *small = [UIImage imageWithCGImage:original.CGImage scale:0.25 orientation:original.imageOrientation];
(для изображения размером в четверть), затем преобразуйте меньшее изображение в PNG или любой другой формат, который вам нужен.
Ответ 2
Этот фрагмент изменит размер изображения:
UIGraphicsBeginImageContext(newSize);
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Переменная newSize
равна CGSize
и может быть определена следующим образом:
CGSize newSize = CGSizeMake(100.0f, 100.0f);
Ответ 3
Самостоятельное решение:
- (UIImage *)compressForUpload:(UIImage *)original scale:(CGFloat)scale
{
// Calculate new size given scale factor.
CGSize originalSize = original.size;
CGSize newSize = CGSizeMake(originalSize.width * scale, originalSize.height * scale);
// Scale the original image to match the new size.
UIGraphicsBeginImageContext(newSize);
[original drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *compressedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return compressedImage;
}
Благодаря @Tuan Nguyen.
Ответ 4
В дополнение к @Tuan Nguyen это, возможно, самый быстрый и элегантный способ сделать это.
Чтобы перейти на сообщение Джона Мухова на iphonedevelopertips.com, добавление категории в UIImage - очень удобный способ масштабирования в очень быстрая мода.
Просто позвонив
UIImage *_image = [[[UIImage alloc] initWithData:SOME_NSDATA] scaleToSize:CGSizeMake(640.0,480.0)];
возвращает вам изображение с представлением 640x480 вашего NSDATA (которое может быть онлайн-изображением) без дополнительной строки кода.
Ответ 5
Matt Gemmell MGImageUtilities очень приятны, эффективно изменяют размер и с помощью некоторых методов сокращения усилий.
Ответ 6
В этом коде 0.5 означает 50%...
UIImage *original = image;
UIImage *compressedImage = UIImageJPEGRepresentation(original, 0.5f);
Ответ 7
используйте этот простой метод NSData *data = UIImageJPEGRepresentation(chosenImage, 0.2f);
Ответ 8
Быстрая реализация функции Zorayr (с небольшим изменением, включающим ограничения по высоте или ширине по фактическим единицам, не масштабируемым):
class func compressForUpload(original:UIImage, withHeightLimit heightLimit:CGFloat, andWidthLimit widthLimit:CGFloat)->UIImage{
let originalSize = original.size
var newSize = originalSize
if originalSize.width > widthLimit && originalSize.width > originalSize.height {
newSize.width = widthLimit
newSize.height = originalSize.height*(widthLimit/originalSize.width)
}else if originalSize.height > heightLimit && originalSize.height > originalSize.width {
newSize.height = heightLimit
newSize.width = originalSize.width*(heightLimit/originalSize.height)
}
// Scale the original image to match the new size.
UIGraphicsBeginImageContext(newSize)
original.drawInRect(CGRectMake(0, 0, newSize.width, newSize.height))
let compressedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return compressedImage
}
Ответ 9
#import <ImageIO/ImageIO.h>
#import <MobileCoreServices/MobileCoreServices.h>
+ (UIImage *)resizeImage:(UIImage *)image toResolution:(int)resolution {
NSData *imageData = UIImagePNGRepresentation(image);
CGImageSourceRef src = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL);
CFDictionaryRef options = (__bridge CFDictionaryRef) @{
(id) kCGImageSourceCreateThumbnailWithTransform : @YES,
(id) kCGImageSourceCreateThumbnailFromImageAlways : @YES,
(id) kCGImageSourceThumbnailMaxPixelSize : @(resolution)
};
CGImageRef thumbnail = CGImageSourceCreateThumbnailAtIndex(src, 0, options);
CFRelease(src);
UIImage *img = [[UIImage alloc]initWithCGImage:thumbnail];
return img;
}
Ответ 10
Swift 2.0 версия Jagandeep Singh, но нужно преобразовать данные в изображение, потому что NSData? автоматически не преобразовывается UIImage.
let orginalImage:UIImage = image
let compressedData = UIImageJPEGRepresentation(orginalImage, 0.5)
let compressedImage = UIImage(data: compressedData!)
Ответ 11
NsData *data=UiImageJPEGRepresentation(Img.image,0.2f);
Ответ 12
UIImage *image = [UIImage imageNamed:@"image.png"];
NSData *imgData1 = UIImageJPEGRepresentation(image, 1);
NSLog(@"Original --- Size of Image(bytes):%d",[imgData1 length]);
NSData *imgData2 = UIImageJPEGRepresentation(image, 0.5);
NSLog(@"After --- Size of Image(bytes):%d",[imgData2 length]);
image = [UIImage imageWithData:imgData2];
imgTest.image = image;
попробуйте преобразовать JPG с помощью коэффициента масштабирования. Здесь я использую 0.5
В моем случае:
Оригинал --- Размер изображения (байты): 85 КБ и после --- Размер изображения (байты): 23 КБ
Ответ 13
-(UIImage *) resizeImage:(UIImage *)orginalImage resizeSize:(CGSize)size
{
CGFloat actualHeight = orginalImage.size.height;
CGFloat actualWidth = orginalImage.size.width;
// if(actualWidth <= size.width && actualHeight<=size.height)
// {
// return orginalImage;
// }
float oldRatio = actualWidth/actualHeight;
float newRatio = size.width/size.height;
if(oldRatio < newRatio)
{
oldRatio = size.height/actualHeight;
actualWidth = oldRatio * actualWidth;
actualHeight = size.height;
}
else
{
oldRatio = size.width/actualWidth;
actualHeight = oldRatio * actualHeight;
actualWidth = size.width;
}
CGRect rect = CGRectMake(0.0,0.0,actualWidth,actualHeight);
UIGraphicsBeginImageContext(rect.size);
[orginalImage drawInRect:rect];
orginalImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return orginalImage;
}
Это метод, вызывающий
UIImage *compimage=[appdel resizeImage:imagemain resizeSize:CGSizeMake(40,40)];
он возвращает изображение, это изображение u может отображать любое, где...........