2010-12-09 11 views
73

Я в настоящее время загрузки изображения на сервер с помощью Imgur на прошивке с помощью следующего кода:Как сжать/изменить размер изображения на iPhone OS SDK перед загрузкой на сервер?

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 перед его отправкой?

Спасибо!

ответ

-32

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

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

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

+52

Это изменяет заявленную размер масштабируемого изображения, но фактически не изменяет данные изображения. Длина данных NSData, сгенерированных на оригинальном и масштабированном изображении, практически идентична. – 2012-03-15 16:43:17

+13

Это не работает! Это не должно быть принятым ответом! Я только что реализовал его в своем приложении, чтобы узнать, что изображение, сжатое до 25% от исходного размера изображения, по-прежнему имеет такой же размер в байтах, что и оригинал. Я понятия не имею, почему так много upvotes или этот нерабочий ответ! – Michael 2013-02-18 17:16:13

+0

не работает. масштабирует изображение, но оставляет данные в полном размере. – nont 2013-09-20 15:59:08

7

Мэтт Gemmell's MGImageUtilities очень приятный, с изменением размера и с некоторыми методами сокращения усилий.

201

Этот фрагмент кода будет изменить размер изображения:

UIGraphicsBeginImageContext(newSize); 
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; 
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Переменная newSize является CGSize и может быть определена следующим образом:

CGSize newSize = CGSizeMake(100.0f, 100.0f); 
16

В дополнение к @Tuan Нгуен, это может быть самый быстрый и самый изящный способ сделать это.

Для ссылки на John Muchow's post at iphonedevelopertips.com, добавление категории в UIImage - очень удобный способ масштабирования очень быстро. Просто позвонив

UIImage *_image = [[[UIImage alloc] initWithData:SOME_NSDATA] scaleToSize:CGSizeMake(640.0,480.0)]; 

возвращает вам 640х480 представление изображения вашего NSData (что может быть онлайн изображение) без какой-либо дополнительной строки кода.

-1
-(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)];  

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

38

Автономный решение:

- (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

использовать этот простой метод NSData *data = UIImageJPEGRepresentation(chosenImage, 0.2f);

0
#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; 
} 
3

Свифта реализация функции 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 
} 
6

В этом код 0,5 означает 50% ...

UIImage *original = image; 
UIImage *compressedImage = UIImageJPEGRepresentation(original, 0.5f); 
0

Swift 2.0 версия метода Jagandeep Singh но нужно преобразовать данные в изображение, потому что NSData? автоматически не конвертируется UIImage.

let orginalImage:UIImage = image 

let compressedData = UIImageJPEGRepresentation(orginalImage, 0.5) 
let compressedImage = UIImage(data: compressedData!) 
0
NsData *data=UiImageJPEGRepresentation(Img.image,0.2f); 
0
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 В моем случае: Оригинал --- Размер изображения (в байтах): 85kb & После --- Размер фотографии (байт): 23KB

Смежные вопросы