juce_ImagePicker.h
[code]/*
This file is part of the JUCE library - "Jules’ Utility Class Extensions"
Copyright 2004-11 by Raw Material Software Ltd.
JUCE can be redistributed and/or modified under the terms of the GNU General
Public License (Version 2), as published by the Free Software Foundation.
A copy of the license is included in the JUCE distribution, or can be found
online at www.gnu.org/licenses.
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
To release a closed-source product which uses JUCE, commercial licenses are
available: visit www.rawmaterialsoftware.com/juce for more information.
==============================================================================
*/
#ifndef JUCE_IMAGE_PICKER_JUCEHEADER
#define JUCE_IMAGE_PICKER_JUCEHEADER
#if JUCE_IOS
class JUCE_API ImagePicker
{
public:
ImagePicker();
~ImagePicker();
//==============================================================================
enum Orientation
{
Up, // default orientation
Down, // 180 deg rotation
Left, // 90 deg CCW
Right, // 90 deg CW
UpMirrored, // as above but image mirrored along other axis. horizontal flip
DownMirrored, // horizontal flip
LeftMirrored, // vertical flip
RightMirrored, // vertical flip
};
//==============================================================================
class JUCE_API Listener
{
public:
/** Destructor. */
virtual ~Listener() {}
virtual void imagePickerFinished (const Image& image, Orientation orientation) = 0;
virtual void imagePickerCanceled() {}
};
void addListener (Listener* newListener);
void removeListener (Listener* listener);
//==============================================================================
void show();
//==============================================================================
void saveToPhotosAlbum (const Image& imageToSave);
//==============================================================================
/** @internal */
void sendImagePickerFinishedMessage (void* picker, void* info);
/** @internal */
void sendImagePickerCanceledMessage (void* picker);
private:
ListenerList listeners;
Orientation orientation;
//==============================================================================
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ImagePicker);
};
#endif
#endif // JUCE_IMAGE_PICKER_JUCEHEADER
[/code]
juce_ios_ImagePicker.mm
[code]/*
This file is part of the JUCE library - "Jules’ Utility Class Extensions"
Copyright 2004-11 by Raw Material Software Ltd.
JUCE can be redistributed and/or modified under the terms of the GNU General
Public License (Version 2), as published by the Free Software Foundation.
A copy of the license is included in the JUCE distribution, or can be found
online at www.gnu.org/licenses.
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
To release a closed-source product which uses JUCE, commercial licenses are
available: visit www.rawmaterialsoftware.com/juce for more information.
==============================================================================
*/
END_JUCE_NAMESPACE
//==============================================================================
@interface JuceUIImagePicker : UIImagePickerController <UINavigationControllerDelegate, UIImagePickerControllerDelegate>
{
@private
juce::ImagePicker* owner;
}
@end
@implementation JuceUIImagePicker
-
(id) initWithOwner: (juce::ImagePicker*) owner_
{
if ((self = [super init]) != nil)
{
owner = owner_;self.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; self.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType: UIImagePickerControllerSourceTypeSavedPhotosAlbum]; self.allowsEditing = NO; self.delegate = self;
}
return self;
} -
(void) dealloc
{
[super dealloc];
} -
(void) imagePickerController: (UIImagePickerController*) picker didFinishPickingMediaWithInfo: (NSDictionary*) info
{
owner->sendImagePickerFinishedMessage (self, info);
} -
(void) imagePickerControllerDidCancel: (UIImagePickerController*) picker
{
self.delegate = nil;
owner->sendImagePickerCanceledMessage (self);
}
-
(UIViewController*) topLevelViewController
{
UIResponder* responder = ((UIView*) [[UIApplication sharedApplication].keyWindow.subviews objectAtIndex: 0]).nextResponder;if ([responder isKindOfClass: [UIViewController class]])
{
return (UIViewController*) responder;
}return nil;
}
@end
BEGIN_JUCE_NAMESPACE
//==============================================================================
ImagePicker::ImagePicker()
: orientation (Up)
{
}
ImagePicker::~ImagePicker()
{
}
//==============================================================================
void ImagePicker::addListener (Listener* const newListener)
{
listeners.add (newListener);
}
void ImagePicker::removeListener (Listener* const listener)
{
listeners.remove (listener);
}
//==============================================================================
void ImagePicker::show()
{
UIViewController* controller = [JuceUIImagePicker topLevelViewController];
if (controller != nil)
{
JuceUIImagePicker* imagePicker = [[JuceUIImagePicker alloc] initWithOwner: this];
[controller presentModalViewController: imagePicker animated: YES];
}
}
//==============================================================================
void ImagePicker::saveToPhotosAlbum (const Image& imageToSave)
{
JPEGImageFormat jpgff;
MemoryOutputStream mos;
jpgff.writeImageToStream (imageToSave, mos);
UIImage* im = [UIImage imageWithData: [NSData dataWithBytes: mos.getData() length: mos.getDataSize()]];
im = [UIImage imageWithCGImage: im.CGImage scale: 1.0f orientation: (UIImageOrientation) orientation];
UIImageWriteToSavedPhotosAlbum (im, nil, nil, nil);
}
//==============================================================================
void ImagePicker::sendImagePickerFinishedMessage (void* picker_, void* info)
{
UIViewController* controller = [JuceUIImagePicker topLevelViewController];
if (controller != nil)
{
[controller dismissModalViewControllerAnimated: YES];
JuceUIImagePicker* imagePicker = (JuceUIImagePicker*) picker_;
[imagePicker release];
}
NSDictionary* dictionary = (NSDictionary*) info;
NSString* mediaType = [dictionary objectForKey: UIImagePickerControllerMediaType];
UIImage* originalImage = nil;
if (CFStringCompare ((CFStringRef) mediaType, kUTTypeImage, 0) == kCFCompareEqualTo)
{
originalImage = (UIImage*) [dictionary objectForKey: UIImagePickerControllerOriginalImage];
}
if (CFStringCompare ((CFStringRef) mediaType, kUTTypeMovie, 0) == kCFCompareEqualTo)
{
// Intentionally empty..
}
NSData* data = UIImageJPEGRepresentation (originalImage, 0.0f);
Image im = ImageFileFormat::loadFrom (data.bytes, data.length);
orientation = (Orientation) originalImage.imageOrientation;
listeners.call (&Listener::imagePickerFinished, im, orientation);
}
void ImagePicker::sendImagePickerCanceledMessage (void* picker_)
{
UIViewController* controller = [JuceUIImagePicker topLevelViewController];
if (controller != nil)
{
[controller dismissModalViewControllerAnimated: YES];
JuceUIImagePicker* imagePicker = (JuceUIImagePicker*) picker_;
[imagePicker release];
}
}[/code]
This is still work in progress, and feels like it needs to be an iOS FileChooser implementation;