Why do I get an exception when pulling an image from UIImagePickerController? - iphone

i get image from uiimagepickerviewcontroller and set it in global file but when i try to retrieve it from global it will not display in uiimageview
following is code of delegate method form which i get image
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo
{
UIImage *tempimg = image;
[Global setimage:tempimg];
isphototeken = TRUE;
[picker dismissModalViewControllerAnimated:NO];
[tblsubmenu reloadData];
NSLog(#"global image %#",[Global getimage]);
[picker release];
}
error at display time
bad exception application is terminate

I think the problem is with this line.
NSLog(#"global image %#",[Global getimage]);
giving image to the log???
you just try to comment out this line and run and check whether the application runs or not

Related

Resize taking photo through default camera

I am using UIImagePickerViewController to take photo from iPhone default camera in my App and storing it in Document directory. It is taking long time to complete the process and also it is displaying very slowly on tableview.Does resizing image help here?
-(IBAction)takePhoto:(id)sender
{
if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera])
{
imgPicker.sourceType = UIImagePickerControllerSourceTypeCamera;
[self presentModalViewController:imgPicker animated:YES];
}
}
-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *pickedImage = [info objectForKey:UIImagePickerControllerOriginalImage];
[self dismissModalViewControllerAnimated:YES];
NSData *imageData = UIImagePNGRepresentation(pickedImage);
NSString *path = [SAVEDIMAGE_DIR stringByAppendingPathComponent:#"image.png"];
[imageData writeToFile:path atomically:YES];
}
Sure!
I do the following in my app:
store the image in an image store in a background thread
create a thumbnail (also in background thread), store this thumbnail in a core data table; in an field of type ID
So I get a smooth UI, where the User can take about a picture every 2 seconds.
The smoothness of the table views are also no problem. Although I populate the TableViewCells ImageViews also from a background-thread (preparing the image in the background, assigning to the UIImageView in the mainthread, of course).
I hope, that helps you. Further questions are welcome.
Some code for your convenience:
As Imagestore I use these: https://github.com/snowdon/Homepwner/blob/master/Homepwner/ImageStore.m
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
[self performSelectorInBackground:#selector(saveFoto:) withObject:info];
// you should add some code for indicating the save process
}
// saves the photo in background-thread
-(void)saveFoto:(NSDictionary*)info {
// the following is some stuff that I do in my app - you will probably do some other things
UIImage *image = [ImageHelper normalizeImageRotation: [info objectForKey:UIImagePickerControllerOriginalImage]];
UIImage *thumb = [ImageHelper image:image fitInSize:CGSizeMake(imgWidth, imgWidth) trimmed:YES];
NSString *myGUID = myGUIDCreator();
[[ImageStore defaultImageStore] setImage:image forKey:myGUID];
myCoreDataManagedObject.thumb = thumb;
[self performSelectorOnMainThread:#selector(showYourResultsInTheUI:) withObject:thumb waitUntilDone:NO]; // every UI-Update has to be done in the mainthread!
}

not able to save UIImage from iphone photolibrary

I am trying to save a image by picking it from iphone photo library. But I am not able to save it. My UIImage object suddenly releases. I am getting following error:
* -[UIImage release]: message sent to deallocated instance 0x83fa5b0
Please check my code below:
-(void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info {
NSLog(#"finish picking media");
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
if ([mediaType isEqualToString:#"public.image"]){
UIImage *selectedImage = [info objectForKey:UIImagePickerControllerOriginalImage];
NSLog(#"found an image");
selectedImage=[self scaleAndRotateImage:selectedImage];
NSLog(#"image scaled");
//add image to mainpic
imgvwProfile.image = selectedImage;
NSLog(#"11");
//[ setImage:selectedImage forState:UIControlStateNormal];
self.imgPic=selectedImage;
//self.isMainPicImageModified=YES;
NSLog(#"22");
//[self sendImage:selectedImage];
NSLog(#"selectedimage width:%f ht:%f",selectedImage.size.width,selectedImage.size.height);
[self saveImage:selectedImage withImageName:#"profilePic.png"];
NSLog(#"33");
}
}
The error appears when NSLog(#"11"); has been execute.
Can some one please help me why I am getting this error?
Thanks
Pankaj
Can you change below line and check whether this statement makes problem or not.
imgvwProfile.image = selectedImage;
To
imgvwProfile.image = [selectedImage retain];
Let me know now your app crash in this function or not.
If the error occurs immediatly after NSLog(#"11") has been executed (you see 11 in the console right?), then it's happening while releasing the former UIImage of self.imgPic. To verify this just put self.imgPic = null; at the beginning of the method.
If so check your code for former release calls on imgPic or other variables pointing to the same UIImage instance. Maybe in scaleAndRotateImage or other methods.

iPhone camera delay after taking picture in flash mode

iPhone camera delayed after taking picture in flash mode, I used UIImagePicker controller and used takePicture for capturing the picture, it is working well in all modes except if the flash mode is on. when it is on it is taking some time to process the image. why is this happening. Can anybody help me in this. my code is below.
to take picture i used
[picker takePicture];
after user took the picture...
imagePickerController:didFinishPickingMediaWithInfo:(NSDictionary *)info
{
[picker dismissModelviewControllerAnimated:YES];
}
I find it takes a while to process the picture under any sitaution. In my didFinishPickingMediaWithInfo I load up a view over the top of my main view to tell the user I'm processing the image.
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *picture = [info valueForKey:UIImagePickerControllerOriginalImage];
[self dismissModalViewControllerAnimated:YES];
[self performSelectorInBackground:#selector(processImage:) withObject:picture];
_activityView = [[PSActivityView alloc] initWithFrame:CGRectZero];
_activityView.text = NSLocalizedString(#"Processing...", nil);
[self.view addSubview:_activityView];
[self.view bringSubviewToFront:_activityView];
}
The PSActivityView class sizes itself in the layoutSubViews method and the processImage method deals with the image and dismisses the _activityView when it's finished.
Seems to keep users happy with my app.

iPhone camera shoots photos rapidly, but has problems saving them

I'm attempting to take and save photos with the camera rapidly, as quickly as the iPhone can. The problem is that they don't save until the end and it then takes forever, or about 1/2 to 3/4 don't save at all (Write busy error or -[NSKeyedUnarchiver initForReadingWithData:]: data is NULL).
I bet I'm just overloading the phone's memory, but I can't think of a way to handle it efficiently. The standard iPhone camera app can handle it just fine -- snap away at almost 1 photo/second and it saves with no problem.
Any ideas on how to manage the process/memory better so that it can save as it goes but still shoot rapidly?
Here's a bit of my code. takePicture is called whenever self.readyToTake = YES.
- (void)takePicture {
self.delegate = self;
[super takePicture];
self.readyToTake = NO;
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
self.readyToTake = YES;
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
UIImageWriteToSavedPhotosAlbum(image, self, #selector(image:didFinishSavingWithError:contextInfo:), nil);
}
- (void)image:(UIImage*)image didFinishSavingWithError:(NSError *)error contextInfo:(NSDictionary*)info {
if (error)
{
NSLog([NSString stringWithFormat:#"** ERROR SAVING PHOTO: %#", [error localizedDescription]]);
}
}
Thank you for your help!
EDIT
If I resize the photos to much smaller dimensions before saving, like 480x640, I have no problem saving quickly. However, I'm wanting to capture and save full-size images. The native Camera app seems to handle it fine.
you can do like this.
ie., enable taking the next photo only after the previous photo is saved.
Also introduce autorelease pool for memory management.
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
UIImageWriteToSavedPhotosAlbum(image, self, #selector(image:didFinishSavingWithError:contextInfo:), nil);
[pool drain];
}
- (void)image:(UIImage*)image didFinishSavingWithError:(NSError *)error contextInfo:(NSDictionary*)info {
if (error)
{
NSLog([NSString stringWithFormat:#"** ERROR SAVING PHOTO: %#", [error localizedDescription]]);
}
self.readyToTake = YES;
}
The first thing I'd try is offloading those calls asynchronously to a dispatch queue:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
self.readyToTake = YES;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
UIImageWriteToSavedPhotosAlbum(image, self, #selector(image:didFinishSavingWithError:contextInfo:), nil);
});
}
If you're still having trouble, I'd look into AVCaptureSession and friends. This gives you a lot more control and generally better performance. There's a great sample project using this method at the developer portal: SquareCam
EDIT
You could also try using AssetsLibrary instead of UIImageWriteToSavedPhotosAlbum (This is what we use in all our apps) Something like:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
self.readyToTake = YES;
// you probably want to create this once and keep it around as a property
// on your controller
ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init];
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
[library writeImageToSavedPhotosAlbum:image.CGImageRef orientation:(ALAssetOrientation)image.orientation completionBlock:^(NSURL *assetURL, NSError *error) {
// do whatever you need to do when the image is saved
}];
}
there is one best example app on developer.apple.com site in which the solution for your problem is shown in it they save photos for 1second interval automatically when user tap on "timed" button here is its code it surely helps you as i can able to store 5 consicutive photos 1/second speed
Please see page MyViewController.m and after getting images in array you can save them to the photo album using some function on another queue

iPhone: " 'class_name' may not respond to methd_name" and "Unrecognized selector" Errors

I have written an application in which I want to convert a .jpg image to .bmp format but I it fails with the error:
class_name' may not respond to
methd_name".
My code is following :
#import "CalculateRGBViewController.h"
#implementation CalculateRGBViewController
#synthesize skinImage;
#synthesize lblRedColor,btn,img;
struct pixel {
unsigned char r, g, b,a;
};
-(IBAction)btnClick:(id) sender{
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentModalViewController:picker animated:YES];
}
-(void)imagePickerController:(UIImagePickerController *) picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
[picker dismissModalViewControllerAnimated:YES];
skinImage. image = [info objectForKey:#"UIImagePickerControllerOriginalImage"];
}
+(void)calculateRGB:(UIImage *)skinImage {
struct pixel *pixels = (struct pixel *) calloc(1, skinImage.size.width * skinImage.size.height * sizeof(struct pixel));
if (pixels != nil)
{
// Create a new bitmap
CGContextRef context = CGBitmapContextCreate(
(void*) pixels,
skinImage.size.width,
skinImage.size.height,
8,
skinImage.size.width * 4,
CGImageGetColorSpace(skinImage.CGImage),
kCGImageAlphaPremultipliedLast
);
NSLog( #"Pixel data one red (%i)", context);
}
}
-(IBAction)btnCalRGB:(id) sender
{
[self calculateRGB];
}
The shown me following code.
-(IBAction)btnCalRGB:(id) sender
{
[self calculateRGB];
}
Warning: CalculateRGBController may not respond to calculateRGB in btnCalRGB button function.
Edit01:
I have also implemented in my code but it again showing same warning.
[self calculateRGB:anUIImage];
-(IBAction)btnCalRGB:(id) sender;
but it again showing same warning. When the button above is pressed, the program throws and exception.
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[UIImage skinImage]: unrecognized selector sent to
You call the method wrong. You must call it like this;
[self calculateRGB:anUIImage];
Your method takes an UIImage as an argument, so you must send it when you call the method. You should also add
+(void)calculateRGB:(UIImage *)skinImage;
to your .h file
Use this
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo {
instead of this
-(void)imagePickerController:(UIImagePickerController *) picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
and you can write
skinImage.image = image;
First of all, to get rid of the error:
+(void)calculateRGB:(UIImage *)skinImage
Should be
- (void)calculateRGB:(UIImage *)skinImage
The + is for class methods, you're about to call this on instances (this is we you need to use the -). So the error is because you try to call the instance method but there is no instance method named calculateRGB:.
The method wants an UIImage to do it's calculation on. This means you should call it (like EEE told you already):
[self calculateRGB:anImage];
anImage would be an UIImage instance you provide. This could be the skinImage that you're already using in the implementation, as shown in your code.
Apart from this, I would recommend not to use an UIViewController subclass for stuff like calculating the RGB values of an image. You should probably use a category of UIImage for this.