天天看點

UIIimage 圖檔的截圖和壓縮

實用主義,直接上代碼,歡迎拿走!

1,圖檔的壓縮

- (UIImage*)scaleFromImage:(UIImage*)image scaledToSize:(CGSize)newSize
{
    CGSize imageSize = image.size;
    CGFloat width = imageSize.width;
    CGFloat height = imageSize.height;

    if (width <= newSize.width && height <= newSize.height){
        return image;
    }

    if (width ==  || height == ){
        return image;
    }

    CGFloat widthFactor = newSize.width / width;
    CGFloat heightFactor = newSize.height / height;
    CGFloat scaleFactor = (widthFactor<heightFactor?widthFactor:heightFactor);

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

    UIGraphicsBeginImageContext(targetSize);
    [image drawInRect:CGRectMake(,,scaledWidth,scaledHeight)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}
           

轉化為NSData 并壓縮

//sdk中提供了方法可以直接調用 

UIImage *img = [UIImage imageNamed:@"some.png"];

NSData *dataObj = UIImageJPEGRepresentation(img, );  



//下面是sdk中UIImage.h頭檔案中的内容 

UIKIT_EXTERN NSData *UIImagePNGRepresentation(UIImage *image);

 // return image as PNG. May return nil if image has no CGImageRef or invalid bitmap format 

UIKIT_EXTERN NSData *UIImageJPEGRepresentation(UIImage *image, CGFloat compressionQuality);

  // return image as JPEG. May return nil if image has no CGImageRef or invalid bitmap format. compression is (most).(least)



JPEG的轉換方法裡面第二個參數是壓縮系數,可以有效的減小圖檔的大小。UIImagePNGRepresentation(UIImage* image) 要比UIImageJPEGRepresentation(UIImage* image, ) 傳回的圖檔資料量大很多。項目中做圖檔上傳之前,經過測試同一張拍照所得照片png大小在M,而JPG壓縮系數為時候,大小隻有M。而且,将壓縮系數降低對圖檔視覺上并沒有太大的影響。
           

2,圖檔的截取

.h

#import <UIKit/UIKit.h>

@protocol ImageCropperDelegate;

@interface ImageCropper : UIViewController <UIScrollViewDelegate> {
    UIScrollView *scrollView;
    UIImageView *imageView;

    id <ImageCropperDelegate> delegate;
}

@property (nonatomic, retain) UIScrollView *scrollView;
@property (nonatomic, retain) UIImageView *imageView;

@property (nonatomic, assign) id <ImageCropperDelegate> delegate;

- (id)initWithImage:(UIImage *)image;

@end

@protocol ImageCropperDelegate <NSObject>
- (void)imageCropper:(ImageCropper *)cropper didFinishCroppingWithImage:(UIImage *)image;
- (void)imageCropperDidCancel:(ImageCropper *)cropper;
@end
           

.m

#import "ImageCropper.h"

@implementation ImageCropper

@synthesize scrollView, imageView;
@synthesize delegate;

- (id)initWithImage:(UIImage *)image {
    self = [super init];

    if (self) {
        [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES];

        scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(, -, , )];
        [scrollView setBackgroundColor:[UIColor blackColor]];
        [scrollView setDelegate:self];
        [scrollView setShowsHorizontalScrollIndicator:NO];
        [scrollView setShowsVerticalScrollIndicator:NO];
        [scrollView setMaximumZoomScale:];

        imageView = [[UIImageView alloc] initWithImage:image];

        CGRect rect;
        rect.size.width = image.size.width;
        rect.size.height = image.size.height;

        [imageView setFrame:rect];

        [scrollView setContentSize:[imageView frame].size];
        [scrollView setMinimumZoomScale:[scrollView frame].size.width / [imageView frame].size.width];
        [scrollView setZoomScale:[scrollView minimumZoomScale]];
        [scrollView addSubview:imageView];

        [[self view] addSubview:scrollView];

        UINavigationBar *navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(, , , )];
        [navigationBar setBarStyle:UIBarStyleBlack];
        [navigationBar setTranslucent:YES];

        UINavigationItem *aNavigationItem = [[UINavigationItem alloc] initWithTitle:@"Move and Scale"];
        [aNavigationItem setLeftBarButtonItem:[[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelCropping)] autorelease]];
        [aNavigationItem setRightBarButtonItem:[[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(finishCropping)] autorelease]];

        [navigationBar setItems:[NSArray arrayWithObject:aNavigationItem]];

        [aNavigationItem release];

        [[self view] addSubview:navigationBar];

        [navigationBar release];
    }

    return self;
}

- (void)cancelCropping {
    [delegate imageCropperDidCancel:self]; 
}

- (void)finishCropping {
    float zoomScale =  / [scrollView zoomScale];

    CGRect rect;
    rect.origin.x = [scrollView contentOffset].x * zoomScale;
    rect.origin.y = [scrollView contentOffset].y * zoomScale;
    rect.size.width = [scrollView bounds].size.width * zoomScale;
    rect.size.height = [scrollView bounds].size.height * zoomScale;

    CGImageRef cr = CGImageCreateWithImageInRect([[imageView image] CGImage], rect);

    UIImage *cropped = [UIImage imageWithCGImage:cr];

    CGImageRelease(cr);

    [delegate imageCropper:self didFinishCroppingWithImage:cropped];
}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return imageView;
}

- (void)dealloc {
    [imageView release];
    [scrollView release];

    [super dealloc];
}

@end
           

繼續閱讀