xcode 在 iPhone 应用程序中存储图像时压缩/缩小/调整图像大小

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1445909/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 18:51:08  来源:igfitidea点击:

Compressing / down size / resize image while storing image in iPhone application

iphonexcodeuiimagepickercontroller

提问by Sagar R. Kothari

To understand my question please go through following:

要了解我的问题,请查看以下内容:

  • In my application user first taps on a button.
  • Image picker controller is displayed
  • user selects images / an image from it.
  • all that images must be saved to my iPhone application.
  • 在我的应用程序中,用户首先点击一个按钮。
  • 显示图像选择器控制器
  • 用户从中选择图像/图像。
  • 所有这些图像都必须保存到我的 iPhone 应用程序中。

I have already implemented this and for doing this I have implemented following code.

我已经实现了这一点,为此我实现了以下代码。

 -(IBAction)setPhoto:(id)sender {
    facPhotoPicker=[[UIImagePickerController alloc]init];
    facPhotoPicker.delegate=self;
    facPhotoPicker.sourceType=UIImagePickerControllerSourceTypePhotoLibrary;
    facPhotoPicker.allowsImageEditing=YES;
    facPhotoPicker.navigationBar.barStyle=UIBarStyleBlackOpaque;
    [self presentModalViewController:facPhotoPicker animated:YES];
}

-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info {
    NSData *imgData=UIImageJPEGRepresentation([info objectForKey:@"UIImagePickerControllerOriginalImage"],1);
    UIImage *img=[[UIImage alloc] initWithData:imgData];
    facImgView.image=img;
    [img release];
    NSString *str=[NSString stringWithFormat:@"%i.jpg",[currentFaculty facultyNo]];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *path = [NSString stringWithFormat:@"%@/%@", [paths objectAtIndex:0], str];
    [imgData writeToFile:path atomically:YES];
    [picker dismissModalViewControllerAnimated:YES];
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    [picker dismissModalViewControllerAnimated:YES];
}

But the problem is the user's iPhone may have larger images.

但问题是用户的 iPhone 可能有更大的图像。

I don't want to store that large images within application. for example

我不想在应用程序中存储那么大的图像。例如

  • user selects an image having size of 1200 x 800
  • But I want only 80 x 80 size image

    1. selected images should be down sized to my requirement / 8 mb image to less then 500 kb
    2. how to store image within resource directory instead of storing in documents directory?
  • 用户选择大小为 1200 x 800 的图像
  • 但我只想要 80 x 80 大小的图像

    1. 所选图像应缩小到我的要求/ 8 mb 图像小于 500 kb
    2. 如何将图像存储在资源目录中而不是存储在文档目录中?

回答by Sagar R. Kothari

This is solved.

这就解决了。

The main key for downsizing. I downsized an image up to 116 kb.

缩小规模的主要关键。我将图像缩小到 116 kb。



NSData *imgData=UIImageJPEGRepresentation([info objectForKey:@"UIImagePickerControllerOriginalImage"],compressionRatio);
while ([imgData length]>50000) { 
    compressionRatio=compressionRatio*0.5;
    imgData=UIImageJPEGRepresentation([info objectForKey:@"UIImagePickerControllerOriginalImage"],compressionRatio);
}


-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{
double compressionRatio=1;
NSData *imgData=UIImageJPEGRepresentation([info objectForKey:@"UIImagePickerControllerOriginalImage"],compressionRatio);
while ([imgData length]>50000) { 
    compressionRatio=compressionRatio*0.5;
    imgData=UIImageJPEGRepresentation([info objectForKey:@"UIImagePickerControllerOriginalImage"],compressionRatio);
}
UIImage *img=[[UIImage alloc] initWithData:imgData];
facImgView.image=img;
NSLog(@"%@",[info objectForKey:@"UIImagePickerControllerOriginalImage"],3);
[img release];


NSString *str=[NSString stringWithFormat:@"%i.jpg",[currentFaculty facultyNo]];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [NSString stringWithFormat:@"%@", [paths objectAtIndex:0]];
path=[path stringByDeletingLastPathComponent];
path=[NSString stringWithFormat:@"%@/%@",path,str];
[imgData writeToFile:path atomically:YES];
[picker dismissModalViewControllerAnimated:YES];
}

回答by zaph

2) You can not store in the Resources directory now in any directory within the application.

2) 您现在不能将资源目录存储在应用程序内的任何目录中。

回答by Sagar R. Kothari

  1. any one can store in resource directory / up level directory of documents directory by implementing following logic.
  1. 通过实现以下逻辑,任何人都可以存储在资源目录/文档目录的上级目录中。


-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{
NSData *imgData=UIImageJPEGRepresentation([info objectForKey:@"UIImagePickerControllerOriginalImage"],1);
UIImage *img=[[UIImage alloc] initWithData:imgData];
facImgView.image=img;
NSLog(@"%@",[info objectForKey:@"UIImagePickerControllerOriginalImage"],3);
[img release];
NSString *str=[NSString stringWithFormat:@"%i.jpg",[currentFaculty facultyNo]];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [NSString stringWithFormat:@"%@", [paths objectAtIndex:0]];
path=[path stringByDeletingLastPathComponent];
path=[NSString stringWithFormat:@"%@/%@",path,str]; // storing path
[imgData writeToFile:path atomically:YES]; // stores successfully 
[picker dismissModalViewControllerAnimated:YES];
}