實用主義,直接上代碼,歡迎拿走!
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