壓縮圖片操做和生成圓形圖片

1.對本地相冊庫或相機拍攝下來的圖片進行壓縮處理,傳進來的參數分別有:要壓縮的圖片和壓縮後的大小。app

//壓縮圖片
+ (UIImage*)imageWithImageSimple:(UIImage*)image scaledToSize:(CGSize)newSize
{
    // Create a graphics image context
    UIGraphicsBeginImageContext(newSize);
    
    // Tell the old image to draw in this new context, with the desired
    // new size
    [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
    
    // Get the new image from the context
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    
    // End the context
    UIGraphicsEndImageContext();
    
    // Return the new image.
    return newImage;
}

2.將圖片壓縮轉爲NSData寫入沙盒。壓縮後以NSData上傳圖片。ide

//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。並且,將壓縮係數下降對圖片視覺上並無太大的影響。測試

保存圖片到沙盒this

- (void)saveImage:(UIImage *)tempImage WithName:(NSString *)imageName
{
    NSData* imageData = UIImagePNGRepresentation(tempImage);
    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString* documentsDirectory = [paths objectAtIndex:0];
    // Now we get the full path to the file
    NSString* fullPathToFile = [documentsDirectory stringByAppendingPathComponent:imageName];
    // and then we write it out
    [imageData writeToFile:fullPathToFile atomically:NO];
}

上傳圖片atom

- (void)putImagewithImage:(UIImage *)image
{
    //上傳圖片
    ASIHTTPRequest *requst = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:UPLOADURL]];
    [requst setRequestMethod:@"PUT"];
    NSData *data = UIImagePNGRepresentation(image);
    if (data == nil) {
        data = UIImageJPEGRepresentation(image, 0.1);
    }
    [requst appendPostData:data];
    [requst startAsynchronous];
    [self showLoading:YES];
    requst.delegate = self;
}

固然也能夠用表單的形式上傳圖片spa

轉自:http://blog.csdn.net/decemberd/article/details/8629996.net

3.生成固定大小的圓形圖片code

//2.保持原來的長寬比,生成一個縮略圖
- (UIImage *)thumbnailWithImageWithoutScale:(UIImage *)image size:(CGSize)asize
{
    UIImage *newimage;
    if (nil == image)
    {
        newimage = nil;
    }
    else
    {
        CGSize oldsize = image.size;
        CGRect rect;
        if (asize.width/asize.height > oldsize.width/oldsize.height)
        {
            rect.size.width = asize.height*oldsize.width/oldsize.height;
            rect.size.height = asize.height;
            rect.origin.x = (asize.width - rect.size.width)/2;
            rect.origin.y = 0;
        }
        else
        {
            rect.size.width = asize.width;
            rect.size.height = asize.width*oldsize.height/oldsize.width;
            rect.origin.x = 0;
            rect.origin.y = (asize.height - rect.size.height)/2;
        }
        UIGraphicsBeginImageContext(asize);
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetFillColorWithColor(context, [[UIColor clearColor] CGColor]);
        UIRectFill(CGRectMake(0, 0, asize.width, asize.height));//clear background
        [image drawInRect:rect];
        newimage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    }
    return newimage;
}

最後是調用了orm

 UIImage *smallImage = [self thumbnailWithImageWithoutScale:image size:CGSizeMake(93, 93)];
    [UIImageJPEGRepresentation(smallImage, 1.0f) writeToFile:imageFilePath atomically:YES];//寫入文件
    UIImage *selfPhoto = [UIImage imageWithContentsOfFile:imageFilePath];//讀取圖片文件

----------------------------------------------------Demo----------------------------------視頻

#import <MobileCoreServices/MobileCoreServices.h>

- (void)viewDidLoad
{
     _tableHeadView = [[UIView alloc]initWithFrame:CGRectMake(0, 0,100,100)];
    _headImageView = [[UIImageView alloc]initWithFrame:CGRectMake((250-100)/2,10, 60, 60)];
    _headImageView.backgroundColor = [UIColor blackColor];
    _headImageView.image = [UIImage imageNamed:@"slide_Login"];
    _headImageView.userInteractionEnabled = YES;
    _headImageView.layer.cornerRadius = 30;
    _headImageView.layer.masksToBounds = YES;
    [_tableHeadView addSubview:_headImageView];
    [_headImageView release];
    
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(changeImageAction:)];
    [_headImageView addGestureRecognizer:tap];
    [tap release];
}            

/**
 *  選擇圖片方法
 *
 *  @param sender <#sender description#>
 */
-(void)changeImageAction:(UITapGestureRecognizer *)sender
{
    UIActionSheet *actionSheet = [[UIActionSheet alloc]initWithTitle:@"選擇文件來源" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"照相機",@"攝像機",@"本地相冊",nil];
    [actionSheet showInView:self.view];
}

#pragma mark -UIActionSheetDelegate Methods
-(void)actionSheet:(UIActionSheet *)actionSheet
clickedButtonAtIndex:(NSInteger)buttonIndex
{
    switch (buttonIndex)
    {
        case 0://照相機
        {
            if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
            {
                UIImagePickerController *imagePicker = [[UIImagePickerController alloc]init];
                imagePicker.delegate = self;
                imagePicker.allowsEditing = self;
                imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
                [self presentViewController:imagePicker animated:YES completion:^{
                    
                }];
            }
            else
            {
                UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"設備不支持攝像頭" message:nil delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:nil, nil];
                [alertView show];
            }
            break;
        }
        case 1://攝像機
        {
            if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
            {
                UIImagePickerController *imagePicker = [[UIImagePickerController alloc]init];
                imagePicker.delegate = self;
                imagePicker.allowsEditing = self;
                imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
                imagePicker.videoQuality = UIImagePickerControllerQualityTypeLow;
                [self presentViewController:imagePicker animated:YES completion:^{
                    
                }];
            }
            else
            {
                UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"設備不支持攝像頭" message:nil delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:nil, nil];
                [alertView show];
            }
            break;
        }
        case 2://本地相冊
        {
            UIImagePickerController *imagePicker = [[UIImagePickerController alloc]init];
            imagePicker.delegate = self;
            imagePicker.allowsEditing = self;
            imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
            [self presentViewController:imagePicker animated:YES completion:^{
                
            }];
            break;
        }
        
        default:
            break;
    }
}

#pragma mark -UIImagePickerControllerDelegate Method
-(void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    if ([[info objectForKey:UIImagePickerControllerMediaType]
         isEqualToString:(__bridge NSString *)kUTTypeImage])//等到圖片
    {
        UIImage *img = [info objectForKey:UIImagePickerControllerEditedImage];
        [self performSelector:@selector(saveImage:)  withObject:img afterDelay:0.5];
    }
    else if ([[info objectForKey:UIImagePickerControllerMediaType]
              isEqualToString:(__bridge NSString *)kUTTypeMovie])//獲得視頻的數據
    {
        NSString *videoPath = (__bridge NSString *)[[info objectForKey:UIImagePickerControllerMediaURL] path];
        NSData *fileData = [NSData dataWithContentsOfFile:videoPath];
    }
    else{}
    [picker  dismissViewControllerAnimated:YES completion:^{
        
    }];
}
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    [picker  dismissViewControllerAnimated:YES completion:^{
        
    }];
}
/**
 *  保存圖片
 *
 *  @param img <#img description#>
 */
-(void)saveImage:(UIImage *)image
{
    NSString *imageFilePath = [self getImageFilePath];
    NSFileManager *fileManger  = [NSFileManager defaultManager];
    BOOL success = [fileManger fileExistsAtPath:imageFilePath];
    NSError *error;
    if (success)
    {
        success = [fileManger removeItemAtPath:imageFilePath error:&error];//刪除原圖片
    }
    
    //尺寸改成60*60
    UIImage *smallImage = [self thumbnailWithImageWithoutScale:image size:CGSizeMake(60, 60)];
    [UIImageJPEGRepresentation(smallImage, 1.0f) writeToFile:imageFilePath atomically:YES];//寫入文件
    UIImage *selfPhoto = [UIImage imageWithContentsOfFile:imageFilePath];//讀取圖片文件
    _headImageView.image = selfPhoto;
}
/**
 *  獲取圖片文件路徑
 *
 *  @return <#return value description#>
 */
-(NSString *)getImageFilePath
{
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *imageFilePath = [path stringByAppendingPathComponent:@"selfPhone.jpg"];
    return imageFilePath;
    
}

//2.保持原來的長寬比,生成一個縮略圖
- (UIImage *)thumbnailWithImageWithoutScale:(UIImage *)image size:(CGSize)asize
{
    UIImage *newimage;
    if (nil == image)
    {
        newimage = nil;
    }
    else
    {
        CGSize oldsize = image.size;
        CGRect rect;
        if (asize.width/asize.height > oldsize.width/oldsize.height)
        {
            rect.size.width = asize.height*oldsize.width/oldsize.height;
            rect.size.height = asize.height;
            rect.origin.x = (asize.width - rect.size.width)/2;
            rect.origin.y = 0;
        }
        else
        {
            rect.size.width = asize.width;
            rect.size.height = asize.width*oldsize.height/oldsize.width;
            rect.origin.x = 0;
            rect.origin.y = (asize.height - rect.size.height)/2;
        }
        UIGraphicsBeginImageContext(asize);
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetFillColorWithColor(context, [[UIColor clearColor] CGColor]);
        UIRectFill(CGRectMake(0, 0, asize.width, asize.height));//clear background
        [image drawInRect:rect];
        newimage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    }
    return newimage;
}

.

相關文章
相關標籤/搜索