2

問題就像當圖像大小超過60 kb時,它不會將圖像發佈到Web服務,但如果圖像大小小於60 kb ,它發佈到Web服務。如何減小目標中圖像的大小c

如何在目標c中減小圖像的大小。 以下是我在用的將是設備,它未能將圖像發送到網絡服務的問題,而是能在iPhone模擬器成功發送的代碼,

-(IBAction)sendEmail:(id)sender 
{ 
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 

    NSLog(@"TABLEDIC%@",appDelegate.tableDic); 
    //Parsing 
    recordResults = FALSE; 

    NSString *soapMessage = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" 
          "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" 
          "<soap:Body>\n" 
          "<CreateTextMail xmlns=\"http://tempuri.org/\">\n" 
          "<listid>%@</listid>\n" 
          "<fromid>%@</fromid>\n" 
          "<subject>%@</subject>\n" 
          "<replyto>%@</replyto>\n" 
          "<loginid>%@</loginid>\n" 
          "<fromname>%@</fromname>\n" 
          "<forward>%@</forward>\n" 
          "<subscribe>%@</subscribe>\n" 
          "<mailpriority>%@</mailpriority>\n" 
          "<recievermailtext>%@</recievermailtext>\n" 
          "<mailbody>%@</mailbody>\n" 
          "<emailname>%@</emailname>\n" 
          "<signature>%@</signature>\n" 
          "<listname>%@</listname>\n" 
          "<emailtype>%@</emailtype>\n" 
          "<imagecontent>%@</imagecontent>\n" 
          "<imagename>%@</imagename>" 
          "</CreateTextMail>\n" 
          "</soap:Body>\n" 
          "</soap:Envelope>\n",[appDelegate.tableDic valueForKey:@"tableID"],[appDelegate.tableDic valueForKey:@"fromname"],[appDelegate.tableDic valueForKey:@"subject"],[appDelegate.tableDic valueForKey:@"replyto"],[appDelegate.tableDic valueForKey:@"loginid"],[appDelegate.tableDic valueForKey:@"fromname"],forward.text,subscribe.text,[appDelegate.tableDic valueForKey:@"mailpriority"],receivermailtext.text,body.text,[appDelegate.tableDic valueForKey:@"emailName"],[appDelegate.tableDic valueForKey:@"signature"],[appDelegate.tableDic valueForKey:@"tableName"],emailType,strEncoded,imageName.text 
          ]; 

    NSLog(@"SOPA%@",soapMessage); 

    NSURL *url = [NSURL URLWithString:@"http://www.xxx.net/xxx/xxx.asmx"]; 
    NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url]; 
    NSString *msgLength = [NSString stringWithFormat:@"%d",[soapMessage length]]; 


    [theRequest addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
    [theRequest addValue:@"http://tempuri.org/CreateTextMail" forHTTPHeaderField:@"SOAPAction"]; 
    [theRequest addValue:msgLength forHTTPHeaderField:@"Content-Length"]; 
    [theRequest setHTTPMethod:@"POST"]; 
    [theRequest setHTTPBody:[soapMessage dataUsingEncoding:NSUTF8StringEncoding]]; 

    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 

    NSHTTPURLResponse *urlResponse = nil; 
    NSError *error = [[NSError alloc] init]; 
    NSData *responseData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&urlResponse error:&error]; 

    NSString *result = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 
    NSLog(@"Response Code : %d",[urlResponse statusCode]); 
    if([urlResponse statusCode] >= 200 && [urlResponse statusCode] < 300) 
    { 
     NSLog(@"Response: %@",result); 
    } 

    if(theConnection) 
    { 
     webData = [NSMutableData data]; 
    } 
    else 
    { 
     NSLog(@"theConnection is NULL"); 
    } 

    [subject resignFirstResponder]; 
    [replyto resignFirstResponder]; 
    [loginid resignFirstResponder]; 
    [fromname resignFirstResponder]; 
    [emailName resignFirstResponder]; 
    [signature resignFirstResponder]; 
    [listName resignFirstResponder]; 



} 


-(void)takeCamera 
{ 
    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) 
    { 
     NSLog(@"take a photo"); 
     UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; 
     imagePicker.delegate = (id)self; 
     imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera; 

     imagePicker.mediaTypes = [NSArray arrayWithObjects:(NSString *)kUTTypeImage, nil]; 
     imagePicker.allowsEditing = NO; 
     [self presentModalViewController:imagePicker animated:YES]; 

     newMedia = YES; 
    } 
} 

-(void)pickCameraRoll 
{ 
    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum]) 
    { 
     UIImagePickerController *imagePicker = [[UIImagePickerController alloc]init]; 
     imagePicker.delegate = (id)self; 
     imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
     imagePicker.mediaTypes = [NSArray arrayWithObjects:(NSString *)kUTTypeImage, nil]; 
     imagePicker.allowsEditing = NO; 
     [self presentModalViewController:imagePicker animated:YES]; 
     newMedia = NO; 
    } 
} 

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; 
    [self dismissModalViewControllerAnimated:YES]; 
    if([mediaType isEqualToString:(NSString *)kUTTypeImage]) 
    { 
     UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; 
     imageView.image = image; 
     NSData *myData = UIImagePNGRepresentation(image); 
     // NSLog(@"NSData : %@",myData); 

     [Base64 initialize]; 
     strEncoded = [Base64 encode:myData]; 
     NSLog(@"strEncoded : %@",strEncoded); 

     if(newMedia) 
      UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:finishedSavingWithError:contextInfo:), nil); 
     NSLog(@"image pick"); 
    } 
    else if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) 
    { 

    } 
} 

-(void)image:(UIImage *)image finishedSavingWithError:(NSError *)error contextInfo:(void *)contextInfo 
{ 
    if(error) 
    { 
     UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Save Failed" message:@"Failed to save image" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [alert show]; 
    } 
} 

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

。 任何建議都會非常有幫助。 在此先感謝。

+0

從哪裏設置或獲取該行中指定的imagename .... valueForKey:@「tableName」],emailType,strEncoded,imageName.text]; –

+0

一些來自文本字段的值和一些來自字典的值。 – shasha

+0

imageName.text來自textField right。您是否在imageName文本字段中鍵入圖像名稱,或者您從其他位置將其取回 –

回答

3

圖像的大小可以通過增加壓縮而犧牲圖像質量來降低。

用途:UIImageJPEGRepresentation

UIImage *compressedImage = UIImageJPEGRepresentation(theImage, 0.5); 
+1

其中0.5是壓縮。它的範圍是從0-1。 0是最大壓縮率(最低質量)。 –

2

對於解壓縮圖像使用下面的代碼,它循環直到圖像尺寸減小到最大圖像尺寸。

CGFloat maxCompressionFactor = 0.1f; 
CGFloat compressionFactor = 0.9f; 
int maxImageSize = 60 * 1024; 

NSData *imageData = UIImageJPEGRepresentation(image, compressionFactor); 

while ([imageData length] > maxImageSize && compressionFactor > maxCompressionFactor) 
{ 
    compressionFactor -= 0.1; 
    imageData = UIImageJPEGRepresentation(image, compressionFactor); 
}