UIIimage 图片的截图和压缩
2015-06-19 19:03
295 查看
实用主义,直接上代码,欢迎拿走!
1,图片的压缩
转化为NSData 并压缩
2,图片的截取
.h
.m
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 == 0 || height == 0){ 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(0,0,scaledWidth,scaledHeight)]; UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; }
转化为NSData 并压缩
//sdk中提供了方法可以直接调用 UIImage *img = [UIImage imageNamed:@"some.png"]; NSData *dataObj = UIImageJPEGRepresentation(img, 1.0); //下面是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 0(most)..1(least) JPEG的转换方法里面第二个参数是压缩系数,可以有效的减小图片的大小。UIImagePNGRepresentation(UIImage* image) 要比UIImageJPEGRepresentation(UIImage* image, 1.0) 返回的图片数据量大很多。项目中做图片上传之前,经过测试同一张拍照所得照片png大小在8M,而JPG压缩系数为0.75时候,大小只有1M。而且,将压缩系数降低对图片视觉上并没有太大的影响。
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(0.0, -20.0, 320.0, 480.0)]; [scrollView setBackgroundColor:[UIColor blackColor]]; [scrollView setDelegate:self]; [scrollView setShowsHorizontalScrollIndicator:NO]; [scrollView setShowsVerticalScrollIndicator:NO]; [scrollView setMaximumZoomScale:2.0]; 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(0.0, 0.0, 320.0, 44.0)]; [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 = 1.0 / [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
相关文章推荐
- GUI编程初步
- volley框架 出现at com.android.volley.Request.<init>
- Java基础 IO流 File Properties PrintWriter 序列流SequenceInputStream
- AndroidUI设计之 布局管理器 - 详细解析布局实现
- 重建索引:ALTER INDEX..REBUILD ONLINE vs ALTER INDEX..REBUILD
- 自定义UINavigationController push和pop动画
- 动态计算UITableViewCell高度详解
- GUI编程
- 雨松MOMO UGUI 之 全面理解图集与使用(三)
- UIButton的titleEdgeInsets和imageEdgeInsets属性
- GUI--事件处理
- Jquer Easyui Tree 异步加载
- Android应用开发多语言Value文件夹
- IOS prepareForSegue 多窗口切换学习
- uinavigationController pop 导致crash
- 【AmazeUI】底部导航条的改进
- iOS UITextField 设置内边距
- GPUImge
- cPickle.load(f) ValueError: insecure string pickle错误问题
- GUI_Download的Codepage参数