zoukankan      html  css  js  c++  java
  • 压缩图片操作和生成圆形图片

    1.对本地相册库或相机拍摄下来的图片进行压缩处理,传进来的参数分别有:要压缩的图片和压缩后的大小。

    //压缩图片
    + (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上传图片。

    //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。而且,将压缩系数降低对图片视觉上并没有太大的影响。

    保存图片到沙盒

    - (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];
    }

    上传图片

    - (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;
    }

    当然也可以用表单的形式上传图片

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

    3.生成固定大小的圆形图片

    //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;
    }

    最后是调用了

     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;
    }

    .

  • 相关阅读:
    ps cc 2018安装
    eclipse 快速添加 set , get 方法
    电脑设置以太网
    C# 获取web.config配置文件内容
    C# @Page指令中的AutoEventWireup,CodeBehind,Inherits
    未能正确加载“Microsoft.VisualStudio.Implementation.EditorPackage”包
    C# 实现MD5加密
    mutex 简单介绍
    select @@IDENTITY
    C# vs2012创建报表
  • 原文地址:https://www.cnblogs.com/huen/p/3860639.html
Copyright © 2011-2022 走看看