2012-02-28 12 views
1

私はスクリーンキャプチャを作成してpngまたはjpgとして電子メールアプリケーションを作成しています。イメージを圧縮してファイルサイズを小さくするにはどうすればよいですか?ここでUIImageを圧縮するにはどうすればいいですか?

は、画像を撮影するための私のコードです:

UIGraphicsBeginImageContext(containerView.frame.size); 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

// launch mail app 
[self performSelector:@selector(sendImage:) withObject:viewImage afterDelay:0.5]; 

答えて

1

同様の質問がanswered here on the Stackです。唯一の違いはあなたがUIImageを使用していることですが、これはあなたを後退させるべきではない、私は一般的なアプローチがまだ機能すると思う。プログラムで圧縮係数を設定することもできます。

希望すると便利です。

+0

ありがとう、Bruce。私は、私が必要としたのは、以下の行に私のスクリプトを電子メールで送ることでした:NSData * data = UIImageJPEGRepresentation(imageView、0.90); – MDM

0
#import "UIImage+Compress.h" 

#define MAX_IMAGEPIX 200.0   // max pix 200.0px 
#define MAX_IMAGEDATA_LEN 50000.0 // max data length 5K 

@implementation UIImage (Compress) 

- (UIImage *)compressedImage { 
    CGSize imageSize = self.size; 
    CGFloat width = imageSize.width; 
    CGFloat height = imageSize.height; 

    if (width <= MAX_IMAGEPIX && height <= MAX_IMAGEPIX) { 
     // no need to compress. 
     return self; 
    } 

    if (width == 0 || height == 0) { 
     // void zero exception 
     return self; 
    } 

    UIImage *newImage = nil; 
    CGFloat widthFactor = MAX_IMAGEPIX/width; 
    CGFloat heightFactor = MAX_IMAGEPIX/height; 
    CGFloat scaleFactor = 0.0; 

    if (widthFactor > heightFactor) 
     scaleFactor = heightFactor; // scale to fit height 
    else 
     scaleFactor = widthFactor; // scale to fit width 

    CGFloat scaledWidth = width * scaleFactor; 
    CGFloat scaledHeight = height * scaleFactor; 
    CGSize targetSize = CGSizeMake(scaledWidth, scaledHeight); 

    UIGraphicsBeginImageContext(targetSize); // this will crop 

    CGRect thumbnailRect = CGRectZero; 
    thumbnailRect.size.width = scaledWidth; 
    thumbnailRect.size.height = scaledHeight; 

    [self drawInRect:thumbnailRect]; 

    newImage = UIGraphicsGetImageFromCurrentImageContext(); 

    //pop the context to get back to the default 
    UIGraphicsEndImageContext(); 

    return newImage; 

} 

- (NSData *)compressedData:(CGFloat)compressionQuality { 
    assert(compressionQuality <= 1.0 && compressionQuality >= 0); 

    return UIImageJPEGRepresentation(self, compressionQuality); 
} 

- (CGFloat)compressionQuality { 
    NSData *data = UIImageJPEGRepresentation(self, 1.0); 
    NSUInteger dataLength = [data length]; 

    if(dataLength > MAX_IMAGEDATA_LEN) { 
     return 1.0 - MAX_IMAGEDATA_LEN/dataLength; 
    } else { 
     return 1.0; 
    } 
} 

- (NSData *)compressedData { 
    CGFloat quality = [self compressionQuality]; 

    return [self compressedData:quality]; 
} 

@end 
+0

これを読んでいる人がなぜその質問に対する答えなのか理解できるように、説明を追加することを検討しますか? –

関連する問題