Как сжать / изменить размер изображения на 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 ]

201 голосов
/ 17 декабря 2010

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

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

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

CGSize newSize = CGSizeMake(100.0f, 100.0f);
38 голосов
/ 27 декабря 2013

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

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

Благодаря @ Туан Нгуен.

16 голосов
/ 24 февраля 2012

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

Чтобы сослаться на сообщение Джона Мухоу на iphonedevelopertips.com , добавив категорию кUIImage - очень очень удобный способ очень быстрого масштабирования.Просто позвонив по номеру

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

, вы получите изображение представления NSDATA размером 640x480 (это может быть изображение в Интернете) без какой-либо строки кода.

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

Matt Gemmell's MGImageUtilities очень хороши, эффективно изменяют размеры и с некоторыми методами сокращения усилий.

6 голосов
/ 13 июля 2015

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

UIImage *original = image;
UIImage *compressedImage = UIImageJPEGRepresentation(original, 0.5f);
4 голосов
/ 10 июня 2014

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

3 голосов
/ 11 мая 2015

Быстрое внедрение функции Зорайра (с небольшим изменением для включения ограничений по высоте или ширине с помощью реальных единиц измерения, а не масштаба):

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
}
0 голосов
/ 01 июня 2016
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 КБ

0 голосов
/ 03 апреля 2016
NsData *data=UiImageJPEGRepresentation(Img.image,0.2f);
0 голосов
/ 29 марта 2016

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

let orginalImage:UIImage = image

let compressedData = UIImageJPEGRepresentation(orginalImage, 0.5)
let compressedImage = UIImage(data: compressedData!)
...