Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to decrease the size of the Image in objective c

The problem is like, when the image size is more than 60 kb, it is not posting the image to the web service , but if the image size is less than 60 kb, its posting to the web service.

How to decrease the size of the Image in objective c. The following is the code which i am using,

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

What would be the problem in the device,where it is failing to send the image to the web service, but able to send successfully in the iphone simulator. Any suggestions would be very helpful. Thanks in advance.

like image 760
shasha Avatar asked Sep 26 '12 10:09

shasha


1 Answers

For decompressing image use following code, It loops untill the image size reduces to maximum image size.

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);
}
like image 171
Rashid Avatar answered Nov 14 '22 21:11

Rashid