UIIimage 图片的截图和压缩

来源:互联网 发布:安佳视讯软件 编辑:程序博客网 时间:2024/05/20 10:21

实用主义,直接上代码,欢迎拿走!


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
0 0