Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UIImagePickerController forces images in other views to full size

In one spot of my app, I need to use the camera, so I call up the UIImagePickerController. Unfortunately, once I return from the controller, most of the pictures in the app are full size, no matter what their UIImageView attributes say. The exception appears to be UIImageViews in UITableViewCells. This applies to all views in the app, not just ones that have direct connection to the viewcontroller that called the UIImagePickerController. Once while I was messing around, trying to troubleshoot, the problem seemed to disappear on its own, though I have not been able to replicate that.

The code is as follows.

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    if(![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){
        UIAlertView *errorAlertView = [[UIAlertView alloc] initWithTitle:@"Error"
                                                           message:@"Device has no camera"
                                                           delegate:nil
                                                           cancelButtonTitle:@"OK"
                                                           otherButtonTitles:nil];
        [errorAlertView show];
        [_app.navController popPage];
    }
    else if(firstTime){
        UIImagePickerController *picker = [[UIImagePickerController  alloc] init];
        picker.delegate = self;
        picker.allowsEditing = YES;
        picker.sourceType = UIImagePickerControllerSourceTypeCamera;

        firstTime = false;

        [self presentViewController:picker animated:YES completion:NULL];
    }
}

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    UIImage *cameraImage = info[UIImagePickerControllerEditedImage];
    [picker dismissViewControllerAnimated:YES completion:NULL];

    NSString *folderName = @"redApp";
    if([_page hasChild:[RWPAGE FOLDER]]){
        folderName = [_page getStringFromNode:[RWPAGE FOLDER]];
    }

    NSDate *datetimeNow = [[NSDate alloc] init];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd_HH-mm-ss-SSS"];
    NSString *filename = [NSString stringWithFormat:@"%@.png",[dateFormatter stringFromDate:datetimeNow]];

    NSString *applicationDocumentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *folderPath = [applicationDocumentsDir stringByAppendingPathComponent:folderName];
    NSString *filePath = [folderPath stringByAppendingPathComponent:filename];

    NSError *error = nil;
    if(![[NSFileManager defaultManager] fileExistsAtPath:folderPath isDirectory:nil]){
        [[NSFileManager defaultManager] createDirectoryAtPath:folderPath withIntermediateDirectories:NO
                                                        attributes:nil error:&error];
    }

    if(error != nil){
        NSLog(@"Create directory error: %@", error);
    }

    [UIImagePNGRepresentation(cameraImage) writeToFile:filePath options:NSDataWritingAtomic error:&error];

    if(error != nil){
        NSLog(@"Error in saving image to disk. Error : %@", error);
    }

    RWXmlNode *nextPage = [_xml getPage:[_page getStringFromNode:[RWPAGE CHILD]]];
    nextPage = [nextPage deepClone];
    [nextPage addNodeWithName:[RWPAGE FILEPATH] value:filePath];

    [_app.navController pushViewWithPage:nextPage];
}

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    [picker dismissViewControllerAnimated:YES completion:NULL];

    [_app.navController popPage];
}

Edit: To expand upon the above.

The base of the app is a Custom Container View Controller, acting mostly like a Navigation Controller. When a user navigates to a page (what I call the combination of a view and view controller) it is displayed on the Custom Container view, and the previous page is stored in a stack.

One of my pages calls upon a UIImagePicker. Once the image picker has been closed again, and I return to the app, problems appear across the app when I open new pages. I don't see problems on every page, but they are on several independent pages. Most pages look completely unaffected, while the problem pages appear to not obey their constraints.

like image 587
Rubberduck Avatar asked Dec 10 '13 12:12

Rubberduck


2 Answers

if you want to compress image use

+(UIImage *)resizeImage:(UIImage*)image newSize:(CGSize)newSize
{
CGRect newRect = CGRectIntegral(CGRectMake(0, 0, newSize.width, newSize.height));
CGImageRef imageRef = image.CGImage;

UIGraphicsBeginImageContextWithOptions(newSize, NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();

// Set the quality level to use when rescaling
CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
CGAffineTransform flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, newSize.height);

CGContextConcatCTM(context, flipVertical);
// Draw into the context; this scales the image
CGContextDrawImage(context, newRect, imageRef);

// Get the resized image from the context and a UIImage
CGImageRef newImageRef = CGBitmapContextCreateImage(context);
UIImage *newImage = [UIImage imageWithCGImage:newImageRef];

CGImageRelease(newImageRef);
UIGraphicsEndImageContext();

return newImage;
}

or +(UIImage *)scaleImage:(UIImage *)image toSize:(CGSize)targetSize {

CGFloat scaleFactor = 1.0;


if (image.size.width > targetSize.width || image.size.height > targetSize.height)
    if (!((scaleFactor = (targetSize.width / image.size.width)) > (targetSize.height / image.size.height))) //scale to fit width, or
        scaleFactor = targetSize.height / image.size.height; // scale to fit heigth.

UIGraphicsBeginImageContext(targetSize);


CGRect rect = CGRectMake((targetSize.width - image.size.width * scaleFactor) / 2,
                         (targetSize.height -  image.size.height * scaleFactor) / 2,
                         image.size.width * scaleFactor, image.size.height * scaleFactor);


[image drawInRect:rect];


UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return scaledImage;
}
like image 105
Charan Giri Avatar answered Oct 15 '22 21:10

Charan Giri


Try like this :-

    UIImage *thumbnail =[UIImage imageNamed:@"yourimage.png"];
    CGSize itemSize = CGSizeMake(35, 35);
    UIGraphicsBeginImageContext(itemSize);
    CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);
    [thumbnail drawInRect:imageRect];
   // Now this below image contains compressed image
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
like image 44
Hussain Shabbir Avatar answered Oct 15 '22 20:10

Hussain Shabbir