iOS图片压缩

作者: Ashoka_APP | 来源:发表于2016-01-23 20:04 被阅读941次

    提到从摄像头/相册获取图片是面向终端用户的,由用户去浏览并选择图片为程序使用。在这里,我们需要过UIImagePickerController类来和用户交互。
    使用UIImagePickerController和用户交互,我们需要实现2个协议<UIImagePickerControllerDelegate,UINavigationControllerDelegate>。
    View Code
    代码如下 复制代码

    pragma mark 从用户相册获取活动图片

    - (void)pickImageFromAlbum
    { imagePicker = [[UIImagePickerController alloc] init]; imagePicker.delegate =self; imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; imagePicker.modalTransitionStyle = UIModalTransitionStyleCoverVertical; imagePicker.allowsEditing =YES;
    [self presentModalViewController:imagePicker animated:YES];

    }
    我们来看看上面的从相册获取图片,我们首先要实例化UIImagePickerController对象,然后设置imagePicker对象为当前对象,设置imagePicker的图片来源为UIImagePickerControllerSourceTypePhotoLibrary,表明当前图片的来源为相册,除此之外还可以设置用户对图片是否可编辑。
    View Code
    代码如下 复制代码

    pragma mark 从摄像头获取活动图片

    - (void)pickImageFromCamera
    {
    imagePicker = [[UIImagePickerController alloc] init]; imagePicker.delegate =self; imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera; imagePicker.modalTransitionStyle = UIModalTransitionStyleCoverVertical; imagePicker.allowsEditing =YES;
    [self presentModalViewController:imagePicker animated:YES];

    }
    //打开相机

    • (IBAction)touch_photo:(id)sender {
      // for iphone
      UIImagePickerController *pickerImage = [[UIImagePickerController alloc] init];
      if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
      pickerImage.sourceType = UIImagePickerControllerSourceTypeCamera;
      pickerImage.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:pickerImage.sourceType];

      }
      pickerImage.delegate =self;
      pickerImage.allowsEditing =YES;//自定义照片样式
      [self presentViewController:pickerImage animated:YES completion:nil];
      }
      以上是从摄像头获取图片,和从相册获取图片只是图片来源的设置不一样,摄像头图片的来源为UIImagePickerControllerSourceTypeCamera。
          在和用户交互之后,用户选择好图片后,会回调选择结束的方法。
      -(void)imagePickerController:(UIImagePickerController)picker didFinishPickingMediaWithInfo:(NSDictionary)info
      {
      //初始化imageNew为从相机中获得的--
      UIImage imageNew = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
      //设置image的尺寸
      CGSize imagesize = imageNew.size;
      imagesize.height =626;
      imagesize.width =413;
      //对图片大小进行压缩--
      imageNew = [self imageWithImage:imageNew scaledToSize:imagesize];
      NSData imageData = UIImageJPEGRepresentation(imageNew,0.00001);
      if(m_selectImage==nil)
      {
      m_selectImage = [UIImage imageWithData:imageData];
      NSLog(@"m_selectImage:%@",m_selectImage);
      [self.TakePhotoBtn setImage:m_selectImage forState:UIControlStateNormal];
      [picker dismissModalViewControllerAnimated:YES];
      return ;
      }
      [picker release];
      }
      //对图片尺寸进行压缩--
      -(UIImage
      )imageWithImage:(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;
      }
      图片保存到本地document里面--以及图片格式的转换
      IOS开发之保存图片到Documents目录及PNG,JPEG格式相互转换

    • (void)imagePickerController:(UIImagePickerController )picker didFinishPickingMediaWithInfo:(NSDictionary)info {
      NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
      if ([mediaType isEqualToString:@"public.image"]){
      image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
      NSData *data;
      if (UIImagePNGRepresentation(image) == nil) {
      data = UIImageJPEGRepresentation(image, 1);
      } else {
      data = UIImagePNGRepresentation(image);
      }

        NSFileManager *fileManager = [NSFileManager defaultManager];
        NSString *filePath = [NSString stringWithString:[self getPath:@"image1"]];         //将图片存储到本地documents
         [fileManager createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil];
         [fileManager createFileAtPath:[filePath stringByAppendingString:@"/image.png"] contents:dataattributes:nil];
        
        UIImage *editedImage = [[UIImage alloc] init];
        editedImage = image;
        CGRect rect = CGRectMake(0, 0, 64, 96);
        UIGraphicsBeginImageContext(rect.size);
        [editedImage drawInRect:rect];
        editedImage = UIGraphicsGetImageFromCurrentImageContext();
        
        UIButton *imageButton = [UIButton buttonWithType:UIButtonTypeCustom];
        imageButton.frame = CGRectMake(10, 10, 64, 96);
        [imageButton setImage:editedImage forState:UIControlStateNormal];
        [self.view addSubview:imageButton];
        [imageButton addTarget:self action:@selector(imageAction:)forControlEvents:UIControlEventTouchUpInside];
        [ipc dismissModalViewControllerAnimated:YES];
      

      } else {
      NSLog(@"MEdia");
      }

    上面的代码是当从相册里面选取图片之后保存到本地程序沙盒,在上面我们得到的图片中不能够得到图片名字,
    以及不清楚图片格式,所以这个时候我们需要将其转换成NSdata二进制存储,
    image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
    NSData *data;
    if (UIImagePNGRepresentation(image) == nil) {
    data = UIImageJPEGRepresentation(image, 1);
    } else {
    data = UIImagePNGRepresentation(image);
    }
    UIImagePNGRepresentation转换PNG格式的图片为二进制,如果图片的格式为JPEG则返回nil;
    [fileManager createFileAtPath:[filePath stringByAppendingString:@"/image.png"] contents:data attributes:nil]; 将图片保存为PNG格式
    [fileManager createFileAtPath:[filePath stringByAppendingString:@"/image.jpg"] contents:data attributes:nil]; 将图片保存为JPEG格式
    我们也可以写成下面的格式存储图片
    NSString *pngImage = [filePath stringByAppendingPathComponent:@"Documents/image.png"];
    NSString *jpgImage = [filePath stringByAppendingPathComponent:@"Documents/image.jpg"];
    [data writeToFile:pngImage atomically:YES];
    [data writeToFile:jpgImage atomically:YES];提到从摄像头/相册获取图片是面向终端用户的,由用户去浏览并选择图片为程序使用。在这里,我们需要过UIImagePickerController类来和用户交互。
    使用UIImagePickerController和用户交互,我们需要实现2个协议<UIImagePickerControllerDelegate,UINavigationControllerDelegate>。
    View Code
    代码如下 复制代码

    pragma mark 从用户相册获取活动图片

    • (void)pickImageFromAlbum
      {
      imagePicker = [[UIImagePickerController alloc] init];
      imagePicker.delegate =self;
      imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
      imagePicker.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
      imagePicker.allowsEditing =YES;

      [self presentModalViewController:imagePicker animated:YES];
      }
      我们来看看上面的从相册获取图片,我们首先要实例化UIImagePickerController对象,然后设置imagePicker对象为当前对象,设置imagePicker的图片来源为UIImagePickerControllerSourceTypePhotoLibrary,表明当前图片的来源为相册,除此之外还可以设置用户对图片是否可编辑。
      View Code
      代码如下 复制代码

    pragma mark 从摄像头获取活动图片

    • (void)pickImageFromCamera
      {
      imagePicker = [[UIImagePickerController alloc] init];
      imagePicker.delegate =self;
      imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
      imagePicker.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
      imagePicker.allowsEditing =YES;

      [self presentModalViewController:imagePicker animated:YES];
      }
      //打开相机

    • (IBAction)touch_photo:(id)sender {
      // for iphone
      UIImagePickerController *pickerImage = [[UIImagePickerController alloc] init];
      if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
      pickerImage.sourceType = UIImagePickerControllerSourceTypeCamera;
      pickerImage.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:pickerImage.sourceType];

      }
      pickerImage.delegate =self;
      pickerImage.allowsEditing =YES;//自定义照片样式
      [self presentViewController:pickerImage animated:YES completion:nil];
      }
      以上是从摄像头获取图片,和从相册获取图片只是图片来源的设置不一样,摄像头图片的来源为UIImagePickerControllerSourceTypeCamera。
          在和用户交互之后,用户选择好图片后,会回调选择结束的方法。
      -(void)imagePickerController:(UIImagePickerController)picker didFinishPickingMediaWithInfo:(NSDictionary)info
      {
      //初始化imageNew为从相机中获得的--
      UIImage imageNew = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
      //设置image的尺寸
      CGSize imagesize = imageNew.size;
      imagesize.height =626;
      imagesize.width =413;
      //对图片大小进行压缩--
      imageNew = [self imageWithImage:imageNew scaledToSize:imagesize];
      NSData imageData = UIImageJPEGRepresentation(imageNew,0.00001);
      if(m_selectImage==nil)
      {
      m_selectImage = [UIImage imageWithData:imageData];
      NSLog(@"m_selectImage:%@",m_selectImage);
      [self.TakePhotoBtn setImage:m_selectImage forState:UIControlStateNormal];
      [picker dismissModalViewControllerAnimated:YES];
      return ;
      }
      [picker release];
      }
      //对图片尺寸进行压缩--
      -(UIImage
      )imageWithImage:(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;
      }
      图片保存到本地document里面--以及图片格式的转换
      IOS开发之保存图片到Documents目录及PNG,JPEG格式相互转换

    • (void)imagePickerController:(UIImagePickerController )picker didFinishPickingMediaWithInfo:(NSDictionary)info {
      NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
      if ([mediaType isEqualToString:@"public.image"]){
      image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
      NSData *data;
      if (UIImagePNGRepresentation(image) == nil) {
      data = UIImageJPEGRepresentation(image, 1);
      } else {
      data = UIImagePNGRepresentation(image);
      }

        NSFileManager *fileManager = [NSFileManager defaultManager];
        NSString *filePath = [NSString stringWithString:[self getPath:@"image1"]];         //将图片存储到本地documents
         [fileManager createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil];
         [fileManager createFileAtPath:[filePath stringByAppendingString:@"/image.png"] contents:dataattributes:nil];
        
        UIImage *editedImage = [[UIImage alloc] init];
        editedImage = image;
        CGRect rect = CGRectMake(0, 0, 64, 96);
        UIGraphicsBeginImageContext(rect.size);
        [editedImage drawInRect:rect];
        editedImage = UIGraphicsGetImageFromCurrentImageContext();
        
        UIButton *imageButton = [UIButton buttonWithType:UIButtonTypeCustom];
        imageButton.frame = CGRectMake(10, 10, 64, 96);
        [imageButton setImage:editedImage forState:UIControlStateNormal];
        [self.view addSubview:imageButton];
        [imageButton addTarget:self action:@selector(imageAction:)forControlEvents:UIControlEventTouchUpInside];
        [ipc dismissModalViewControllerAnimated:YES];
      

      } else {
      NSLog(@"MEdia");
      }

    上面的代码是当从相册里面选取图片之后保存到本地程序沙盒,在上面我们得到的图片中不能够得到图片名字,
    以及不清楚图片格式,所以这个时候我们需要将其转换成NSdata二进制存储,
    image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
    NSData *data;
    if (UIImagePNGRepresentation(image) == nil) {
    data = UIImageJPEGRepresentation(image, 1);
    } else {
    data = UIImagePNGRepresentation(image);
    }
    UIImagePNGRepresentation转换PNG格式的图片为二进制,如果图片的格式为JPEG则返回nil;
    [fileManager createFileAtPath:[filePath stringByAppendingString:@"/image.png"] contents:data attributes:nil]; 将图片保存为PNG格式
    [fileManager createFileAtPath:[filePath stringByAppendingString:@"/image.jpg"] contents:data attributes:nil]; 将图片保存为JPEG格式
    我们也可以写成下面的格式存储图片
    NSString *pngImage = [filePath stringByAppendingPathComponent:@"Documents/image.png"];
    NSString *jpgImage = [filePath stringByAppendingPathComponent:@"Documents/image.jpg"];
    [data writeToFile:pngImage atomically:YES];
    [data writeToFile:jpgImage atomically:YES];

    相关文章

      网友评论

        本文标题:iOS图片压缩

        本文链接:https://www.haomeiwen.com/subject/fnerkttx.html