web-dev-qa-db-ja.com

サーバーにアップロードする前にiOSで画像を圧縮/サイズ変更する方法は?

現在、iOSのImgurを使用して、次のコードでサーバーに画像をアップロードしています。

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"];

高速イーサネット接続を使用しているため、シミュレータで実行し、シミュレータの写真ライブラリからファイルをアップロードすると、コードは正常に機能します。ただし、iPhoneで撮影した画像を選択すると、iPhoneで同じコードがタイムアウトします。そこで、ウェブから小さな画像を保存してアップロードしようと試みましたが、うまくいきました。

これは、iPhoneで撮影された大きな画像がやや遅い3Gネットワ​​ーク上でタイムアウトになっていると思うようになります。送信する前にiPhoneの画像を圧縮/サイズ変更する方法はありますか?

75
joshholat

このスニペットは画像のサイズを変更します:

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

変数newSizeCGSizeであり、次のように定義できます。

CGSize newSize = CGSizeMake(100.0f, 100.0f);
201
Tuan Nguyen

自己完結型のソリューション:

- (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に感謝します。

38
Zorayr

@Tuan Nguyenを補完するために、これはおそらく最速で最もエレガントな方法です。

iphonedevelopertips.comのJohn Muchowの投稿 にリンクするには、UIImageにカテゴリを追加すると、非常に高速にスケーリングする非常に便利な方法です。ただ電話する

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

nSDATAの640x480の表現イメージ(オンラインイメージの場合もあります)を、コードを追加することなく返します。

16
nembleton

Matt Gemmellの MGImageUtilities は非常に優れており、効率的にサイズを変更し、いくつかの労力を削減する方法があります。

7

このコードでは、0.5は50%を意味します...

UIImage *original = image;
UIImage *compressedImage = UIImageJPEGRepresentation(original, 0.5f);
6
Jagandeep Singh

この単純なメソッドNSData *data = UIImageJPEGRepresentation(chosenImage, 0.2f);を使用します

4
user3732709

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
}
3
PJeremyMalouf
#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
Vineet Ravi
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

0
Swatee Salunkhe

Jagandeep SinghメソッドのSwift 2.0バージョンですが、NSDataのためにデータを画像に変換する必要がありますか? UIImageは自動的に変換されません。

let orginalImage:UIImage = image

let compressedData = UIImageJPEGRepresentation(orginalImage, 0.5)
let compressedImage = UIImage(data: compressedData!)
0
CodeOverRide
NsData *data=UiImageJPEGRepresentation(Img.image,0.2f);
0
iOS Lifee