如何减小目标c中图像的大小

时间:2012-09-26 10:32:33

标签: iphone objective-c web-services soap uiimagepickercontroller

问题是,当图像大小超过60 kb时,它不会将图像发布到Web服务,但如果图像大小小于60 kb,则将其发布到Web服务。

如何减小目标c中图像的大小。 以下是我正在使用的代码,

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

设备中的问题是什么,它无法将图像发送到Web服务,但能够在iphone模拟器中成功发送。 任何建议都会非常有帮助。 提前谢谢。

2 个答案:

答案 0 :(得分:3)

通过牺牲图像质量来增加压缩,可以减小图像的大小。

使用:UIImageJPEGRepresentation

UIImage *compressedImage = UIImageJPEGRepresentation(theImage, 0.5);

答案 1 :(得分:3)

对于使用以下代码解压缩图像,它会循环,直到图像大小减小到最大图像大小。

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