5

問題は、画像サイズが 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 シミュレーターでは正常に送信できるデバイスの問題は何でしょうか。どんな提案も非常に役に立ちます。前もって感謝します。

4

2 に答える 2

4

画像を解凍するには、次のコードを使用します。画像サイズが最大画像サイズに縮小されるまでループします。

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);
}
于 2012-09-26T13:00:58.407 に答える
3

画質を犠牲にして圧縮率を上げることで、画像のサイズを小さくすることができます。

使用: UIImageJPEGRepresentation

UIImage *compressedImage = UIImageJPEGRepresentation(theImage, 0.5);
于 2012-09-26T12:49:21.227 に答える