Как сжать / изменить размер изображения на iOS перед загрузкой на сервер? - PullRequest
75 голосов
/ 09 декабря 2010

В настоящее время я загружаю изображение на сервер с помощью 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 перед отправкой?

Ответы [ 13 ]

0 голосов
/ 30 марта 2015
#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;
}
0 голосов
/ 28 ноября 2013
-(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)];      

, он возвращает изображение, которое вы можете отобразить в любом месте ...........

0 голосов
/ 09 декабря 2010

Вы можете сделать изображение меньшего размера, выполнив что-то вроде

UIImage *small = [UIImage imageWithCGImage:original.CGImage scale:0.25 orientation:original.imageOrientation];

(для изображения четвертого размера), а затем преобразуйте уменьшенное изображение в формат PNG или любой другой формат, который вам необходим.

...