iOS圖片壓縮

提到從攝像頭/相冊(cè)獲取圖片是面向終端用戶的,由用戶去瀏覽并選擇圖片為程序使用磅崭。在這里柱徙,我們需要過UIImagePickerController類來和用戶交互。
使用UIImagePickerController和用戶交互应闯,我們需要實(shí)現(xiàn)2個(gè)協(xié)議<UIImagePickerControllerDelegate,UINavigationControllerDelegate>。
View Code
代碼如下 復(fù)制代碼

pragma mark 從用戶相冊(cè)獲取活動(dòng)圖片

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

}
我們來看看上面的從相冊(cè)獲取圖片挂捻,我們首先要實(shí)例化UIImagePickerController對(duì)象碉纺,然后設(shè)置imagePicker對(duì)象為當(dāng)前對(duì)象,設(shè)置imagePicker的圖片來源為UIImagePickerControllerSourceTypePhotoLibrary细层,表明當(dāng)前圖片的來源為相冊(cè)惜辑,除此之外還可以設(shè)置用戶對(duì)圖片是否可編輯唬涧。
View Code
代碼如下 復(fù)制代碼

pragma mark 從攝像頭獲取活動(dòng)圖片

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

}
//打開相機(jī)

  • (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];
    }
    以上是從攝像頭獲取圖片疫赎,和從相冊(cè)獲取圖片只是圖片來源的設(shè)置不一樣,攝像頭圖片的來源為UIImagePickerControllerSourceTypeCamera碎节。
        在和用戶交互之后捧搞,用戶選擇好圖片后,會(huì)回調(diào)選擇結(jié)束的方法狮荔。
    -(void)imagePickerController:(UIImagePickerController)picker didFinishPickingMediaWithInfo:(NSDictionary)info
    {
    //初始化imageNew為從相機(jī)中獲得的--
    UIImage imageNew = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
    //設(shè)置image的尺寸
    CGSize imagesize = imageNew.size;
    imagesize.height =626;
    imagesize.width =413;
    //對(duì)圖片大小進(jìn)行壓縮--
    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];
    }
    //對(duì)圖片尺寸進(jìn)行壓縮--
    -(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里面--以及圖片格式的轉(zhuǎn)換
    IOS開發(fā)之保存圖片到Documents目錄及PNG胎撇,JPEG格式相互轉(zhuǎn)換

  • (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"]];         //將圖片存儲(chǔ)到本地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");
    }

上面的代碼是當(dāng)從相冊(cè)里面選取圖片之后保存到本地程序沙盒,在上面我們得到的圖片中不能夠得到圖片名字殖氏,
以及不清楚圖片格式晚树,所以這個(gè)時(shí)候我們需要將其轉(zhuǎn)換成NSdata二進(jìn)制存儲(chǔ),
image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
NSData *data;
if (UIImagePNGRepresentation(image) == nil) {
data = UIImageJPEGRepresentation(image, 1);
} else {
data = UIImagePNGRepresentation(image);
}
UIImagePNGRepresentation轉(zhuǎn)換PNG格式的圖片為二進(jìn)制雅采,如果圖片的格式為JPEG則返回nil爵憎;
[fileManager createFileAtPath:[filePath stringByAppendingString:@"/image.png"] contents:data attributes:nil]; 將圖片保存為PNG格式
[fileManager createFileAtPath:[filePath stringByAppendingString:@"/image.jpg"] contents:data attributes:nil]; 將圖片保存為JPEG格式
我們也可以寫成下面的格式存儲(chǔ)圖片
NSString *pngImage = [filePath stringByAppendingPathComponent:@"Documents/image.png"];
NSString *jpgImage = [filePath stringByAppendingPathComponent:@"Documents/image.jpg"];
[data writeToFile:pngImage atomically:YES];
[data writeToFile:jpgImage atomically:YES];提到從攝像頭/相冊(cè)獲取圖片是面向終端用戶的慨亲,由用戶去瀏覽并選擇圖片為程序使用。在這里宝鼓,我們需要過UIImagePickerController類來和用戶交互刑棵。
使用UIImagePickerController和用戶交互,我們需要實(shí)現(xiàn)2個(gè)協(xié)議<UIImagePickerControllerDelegate,UINavigationControllerDelegate>愚铡。
View Code
代碼如下 復(fù)制代碼

pragma mark 從用戶相冊(cè)獲取活動(dòng)圖片

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

    [self presentModalViewController:imagePicker animated:YES];
    }
    我們來看看上面的從相冊(cè)獲取圖片蛉签,我們首先要實(shí)例化UIImagePickerController對(duì)象,然后設(shè)置imagePicker對(duì)象為當(dāng)前對(duì)象沥寥,設(shè)置imagePicker的圖片來源為UIImagePickerControllerSourceTypePhotoLibrary碍舍,表明當(dāng)前圖片的來源為相冊(cè),除此之外還可以設(shè)置用戶對(duì)圖片是否可編輯邑雅。
    View Code
    代碼如下 復(fù)制代碼

pragma mark 從攝像頭獲取活動(dòng)圖片

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

    [self presentModalViewController:imagePicker animated:YES];
    }
    //打開相機(jī)

  • (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];
    }
    以上是從攝像頭獲取圖片乒验,和從相冊(cè)獲取圖片只是圖片來源的設(shè)置不一樣,攝像頭圖片的來源為UIImagePickerControllerSourceTypeCamera蒂阱。
        在和用戶交互之后锻全,用戶選擇好圖片后,會(huì)回調(diào)選擇結(jié)束的方法录煤。
    -(void)imagePickerController:(UIImagePickerController)picker didFinishPickingMediaWithInfo:(NSDictionary)info
    {
    //初始化imageNew為從相機(jī)中獲得的--
    UIImage imageNew = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
    //設(shè)置image的尺寸
    CGSize imagesize = imageNew.size;
    imagesize.height =626;
    imagesize.width =413;
    //對(duì)圖片大小進(jìn)行壓縮--
    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];
    }
    //對(duì)圖片尺寸進(jìn)行壓縮--
    -(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里面--以及圖片格式的轉(zhuǎn)換
    IOS開發(fā)之保存圖片到Documents目錄及PNG鳄厌,JPEG格式相互轉(zhuǎn)換

  • (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"]];         //將圖片存儲(chǔ)到本地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");
    }

上面的代碼是當(dāng)從相冊(cè)里面選取圖片之后保存到本地程序沙盒,在上面我們得到的圖片中不能夠得到圖片名字妈踊,
以及不清楚圖片格式了嚎,所以這個(gè)時(shí)候我們需要將其轉(zhuǎn)換成NSdata二進(jìn)制存儲(chǔ),
image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
NSData *data;
if (UIImagePNGRepresentation(image) == nil) {
data = UIImageJPEGRepresentation(image, 1);
} else {
data = UIImagePNGRepresentation(image);
}
UIImagePNGRepresentation轉(zhuǎn)換PNG格式的圖片為二進(jìn)制廊营,如果圖片的格式為JPEG則返回nil歪泳;
[fileManager createFileAtPath:[filePath stringByAppendingString:@"/image.png"] contents:data attributes:nil]; 將圖片保存為PNG格式
[fileManager createFileAtPath:[filePath stringByAppendingString:@"/image.jpg"] contents:data attributes:nil]; 將圖片保存為JPEG格式
我們也可以寫成下面的格式存儲(chǔ)圖片
NSString *pngImage = [filePath stringByAppendingPathComponent:@"Documents/image.png"];
NSString *jpgImage = [filePath stringByAppendingPathComponent:@"Documents/image.jpg"];
[data writeToFile:pngImage atomically:YES];
[data writeToFile:jpgImage atomically:YES];

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市露筒,隨后出現(xiàn)的幾起案子呐伞,更是在濱河造成了極大的恐慌,老刑警劉巖慎式,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伶氢,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡瘪吏,警方通過查閱死者的電腦和手機(jī)癣防,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掌眠,“玉大人蕾盯,你說我怎么就攤上這事±侗” “怎么了级遭?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵香嗓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我装畅,道長(zhǎng)靠娱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任掠兄,我火速辦了婚禮像云,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蚂夕。我一直安慰自己迅诬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布婿牍。 她就那樣靜靜地躺著侈贷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪等脂。 梳的紋絲不亂的頭發(fā)上俏蛮,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音上遥,去河邊找鬼搏屑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛粉楚,可吹牛的內(nèi)容都是我干的辣恋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼模软,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼伟骨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起燃异,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤携狭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后特铝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暑中,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡壹瘟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年鲫剿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稻轨。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡灵莲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出殴俱,到底是詐尸還是另有隱情政冻,我是刑警寧澤枚抵,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站明场,受9級(jí)特大地震影響汽摹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜苦锨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一逼泣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舟舒,春花似錦拉庶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至夺鲜,卻和暖如春皆尔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背币励。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工床佳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人榄审。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓砌们,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親搁进。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浪感,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容