こんにちは!
iPhoneカメラを使った写真合成アプリを作りたいと思っています。
撮った写真を拡大・縮小・範囲の切り取りをしたいのですが、
何か参考になるサイト等ありましたら教えてください。
書籍などで探してみたのですが、これといった参考になるものがなく困っています。
よろしくお願いします!
iPhoneアプリ作成
-
reopard
Re: iPhoneアプリ作成
説明不足でわかりづらいと思うので追記します。
cameraoverlayviewを使い、カメラ起動時の画面にimageを置くことはできたのですが、写真を撮った後、その写真を拡大・縮小・回転できる編集画面へ移りたいのですが、何か参考になるサイト等ありましたら教えてください。
機能的にはanimalizerというアプリのようにしたいのですが、何か良い方法がありましたらご教授ください。
//camera_tutorial_overlayviewcontroller.h//
#define CAMERA_TRANSFORM_X 1
#define CAMERA_TRANSFORM_Y 1.12412
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHTH 480
@interface Cam_tutorial_overlayViewController : UIViewController {
UIView *overlayView;
}
@property (nonatomic, retain) IBOutlet UIView *overlayView;
//camera_tutorial_overlayviewcontroller.m//
@synthesize overlayView;
- (void) viewDidAppear:(BOOL)animated{
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.showsCameraControls = NO;
picker.navigationBarHidden = YES;
picker.wantsFullScreenLayout = YES;
picker.cameraViewTransform = CGAffineTransformScale(picker.cameraViewTransform,CAMERA_TRANSFORM_X,CAMERA_TRANSFORM_Y);
picker.cameraOverlayView = overlayView;
[self presentModalViewController:picker animated:YES];
[picker release];
[super viewDidAppear:YES];
}
cameraoverlayviewを使い、カメラ起動時の画面にimageを置くことはできたのですが、写真を撮った後、その写真を拡大・縮小・回転できる編集画面へ移りたいのですが、何か参考になるサイト等ありましたら教えてください。
機能的にはanimalizerというアプリのようにしたいのですが、何か良い方法がありましたらご教授ください。
//camera_tutorial_overlayviewcontroller.h//
#define CAMERA_TRANSFORM_X 1
#define CAMERA_TRANSFORM_Y 1.12412
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHTH 480
@interface Cam_tutorial_overlayViewController : UIViewController {
UIView *overlayView;
}
@property (nonatomic, retain) IBOutlet UIView *overlayView;
//camera_tutorial_overlayviewcontroller.m//
@synthesize overlayView;
- (void) viewDidAppear:(BOOL)animated{
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.showsCameraControls = NO;
picker.navigationBarHidden = YES;
picker.wantsFullScreenLayout = YES;
picker.cameraViewTransform = CGAffineTransformScale(picker.cameraViewTransform,CAMERA_TRANSFORM_X,CAMERA_TRANSFORM_Y);
picker.cameraOverlayView = overlayView;
[self presentModalViewController:picker animated:YES];
[picker release];
[super viewDidAppear:YES];
}
-
reopard
Re: iPhoneアプリ作成
説明不足でわかりづらいと思うので追記します。
cameraoverlayviewを使い、カメラ起動時の画面にimageを置くことはできたのですが、写真を撮った後、その写真を拡大・縮小・回転できる編集画面へ移りたいのですが、何か参考になるサイト等ありましたら教えてください。
機能的にはanimalizerというアプリのようにしたいのですが、何か良い方法がありましたらご教授ください。
//camera_tutorial_overlayviewcontroller.h//
#define CAMERA_TRANSFORM_X 1
#define CAMERA_TRANSFORM_Y 1.12412
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHTH 480
@interface Cam_tutorial_overlayViewController : UIViewController {
UIView *overlayView;
}
@property (nonatomic, retain) IBOutlet UIView *overlayView;
//camera_tutorial_overlayviewcontroller.m//
@synthesize overlayView;
- (void) viewDidAppear:(BOOL)animated{
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.showsCameraControls = NO;
picker.navigationBarHidden = YES;
picker.wantsFullScreenLayout = YES;
picker.cameraViewTransform = CGAffineTransformScale(picker.cameraViewTransform,CAMERA_TRANSFORM_X,CAMERA_TRANSFORM_Y);
picker.cameraOverlayView = overlayView;
[self presentModalViewController:picker animated:YES];
[picker release];
[super viewDidAppear:YES];
}

cameraoverlayviewを使い、カメラ起動時の画面にimageを置くことはできたのですが、写真を撮った後、その写真を拡大・縮小・回転できる編集画面へ移りたいのですが、何か参考になるサイト等ありましたら教えてください。
機能的にはanimalizerというアプリのようにしたいのですが、何か良い方法がありましたらご教授ください。
//camera_tutorial_overlayviewcontroller.h//
#define CAMERA_TRANSFORM_X 1
#define CAMERA_TRANSFORM_Y 1.12412
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHTH 480
@interface Cam_tutorial_overlayViewController : UIViewController {
UIView *overlayView;
}
@property (nonatomic, retain) IBOutlet UIView *overlayView;
//camera_tutorial_overlayviewcontroller.m//
@synthesize overlayView;
- (void) viewDidAppear:(BOOL)animated{
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.showsCameraControls = NO;
picker.navigationBarHidden = YES;
picker.wantsFullScreenLayout = YES;
picker.cameraViewTransform = CGAffineTransformScale(picker.cameraViewTransform,CAMERA_TRANSFORM_X,CAMERA_TRANSFORM_Y);
picker.cameraOverlayView = overlayView;
[self presentModalViewController:picker animated:YES];
[picker release];
[super viewDidAppear:YES];
}

-
めるぽん
Re: iPhoneアプリ作成
UIView の transform プロパティにアフィン変換用の行列を設定すれば回転拡大縮小が手軽にできるので、写真を撮った後の UIImage が取得できているならそれを使って編集操作を行ってみてはどうでしょうか。
-
reopard
Re: iPhoneアプリ作成
めるぽん先生ご回答ありがとうございます。
初心者中の初心者で済みません。。
もう少し詳しく教えて頂いてもいいでしょうか?
参考になるサイト、もしくは書籍などがあれば教えてください。
宜しくお願いします!
初心者中の初心者で済みません。。
もう少し詳しく教えて頂いてもいいでしょうか?
参考になるサイト、もしくは書籍などがあれば教えてください。
宜しくお願いします!
-
めるぽん
Re: iPhoneアプリ作成
書籍は知らないです。
いくつかサイトを挙げてもいいですが、検索して上位に来たものしか知らないので、恐らく自分で調べた方が理解しやすいでしょう。
カメラで撮ったイメージを編集して保存する、ということについて書かれたサイトは少ないかもしれませんが、カメラを撮ってイメージを取得する、イメージを編集する、イメージを保存する、という情報であればそれなりにあるはずなので、それらを組み合わせて作るのがいいと思います。
いくつかサイトを挙げてもいいですが、検索して上位に来たものしか知らないので、恐らく自分で調べた方が理解しやすいでしょう。
カメラで撮ったイメージを編集して保存する、ということについて書かれたサイトは少ないかもしれませんが、カメラを撮ってイメージを取得する、イメージを編集する、イメージを保存する、という情報であればそれなりにあるはずなので、それらを組み合わせて作るのがいいと思います。
-
reopard
Re: iPhoneアプリ作成
めるぽん先生、返信ありがとうございます!
自分なりに色々調べ、試行錯誤をしてみて再度コードを作成してみました。
カメラで撮影しイメージの取得まではできるようになったのですが、その後のイメージの編集ができず困っています。
めるぽん先生にお時間あれば、以下のソースコードを確認して頂き、アドバイスを頂ければ幸いです。
よろしくお願いします!
"camera_appViewController.h"
#import <UIKit/UIKit.h>
@interface camera_appViewController : UIViewController
<UIActionSheetDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate>
{
IBOutlet UIImageView* _imageView;
}
// アクション
- (IBAction)showCameraSheet;
@end
"camera_appViewController.m"
#import "camera_appViewController.h"
@implementation camera_appViewController
- (IBAction)showCameraSheet
{
// アクションシートを作る
UIActionSheet* sheet;
sheet = [[UIActionSheet alloc]
initWithTitle:@"Select Soruce Type"
delegate:self
cancelButtonTitle:@"Cancel"
destructiveButtonTitle:nil
otherButtonTitles:@"Photo Library", @"Camera", @"Saved Photos", nil];
[sheet autorelease];
// アクションシートを表示する
[sheet showInView:self.view];
}
- (void)actionSheet:(UIActionSheet*)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
// ボタンインデックスをチェックする
if (buttonIndex >= 3) {
return;
}
// ソースタイプを決定する
UIImagePickerControllerSourceType sourceType = 0;
switch (buttonIndex) {
case 0: {
sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
break;
}
case 1: {
sourceType = UIImagePickerControllerSourceTypeCamera;
break;
}
case 2: {
sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
break;
}
}
// 使用可能かどうかチェックする
if (![UIImagePickerController isSourceTypeAvailable:sourceType]) {
return;
}
// イメージピッカーを作る
UIImagePickerController* imagePicker;
imagePicker = [[UIImagePickerController alloc] init];
[imagePicker autorelease];
imagePicker.sourceType = sourceType;
imagePicker.allowsImageEditing = YES;
imagePicker.delegate = self;
// イメージピッカーを表示する
[self presentModalViewController:imagePicker animated:YES];
}
- (void)imagePickerController:(UIImagePickerController*)picker
didFinishPickingImage:(UIImage*)image
editingInfo:(NSDictionary*)editingInfo
{
// イメージピッカーを隠す
[self dismissModalViewControllerAnimated:YES];
// オリジナル画像を取得する
UIImage* originalImage;
originalImage = [editingInfo objectForKey:UIImagePickerControllerOriginalImage];
// グラフィックスコンテキストを作る
CGSize size = { 300, 400 };
UIGraphicsBeginImageContext(size);
// 画像を縮小して描画する
CGRect rect;
rect.origin = CGPointZero;
rect.size = size;
[originalImage drawInRect:rect];
// 描画した画像を取得する
UIImage* shrinkedImage;
shrinkedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// CGImageを取得する
CGImageRef cgImage;
cgImage = shrinkedImage.CGImage;
// 画像情報を取得する
size_t width;
size_t height;
size_t bitsPerComponent;
size_t bitsPerPixel;
size_t bytesPerRow;
CGColorSpaceRef colorSpace;
CGBitmapInfo bitmapInfo;
bool shouldInterpolate;
CGColorRenderingIntent intent;
width = CGImageGetWidth(cgImage);
height = CGImageGetHeight(cgImage);
bitsPerComponent = CGImageGetBitsPerComponent(cgImage);
bitsPerPixel = CGImageGetBitsPerPixel(cgImage);
bytesPerRow = CGImageGetBytesPerRow(cgImage);
colorSpace = CGImageGetColorSpace(cgImage);
bitmapInfo = CGImageGetBitmapInfo(cgImage);
shouldInterpolate = CGImageGetShouldInterpolate(cgImage);
intent = CGImageGetRenderingIntent(cgImage);
// データプロバイダを取得する
CGDataProviderRef dataProvider;
dataProvider = CGImageGetDataProvider(cgImage);
// ビットマップデータを取得する
CFDataRef data;
UInt8* buffer;
data = CGDataProviderCopyData(dataProvider);
buffer = (UInt8*)CFDataGetBytePtr(data);
// UIViewの生成
UIView *uv = [[UIView alloc] init];
uv.frame = self.view.bounds;
[self.view addSubview:uv];
// アフィン変換例文
// 回転
uv.transform = CGAffineTransformMakeRotation(M_PI * 90 / 180.0); // 90度回転
uv.transform = CGAffineTransformMakeRotation(M_PI); // 180度回転
// 拡大・縮小
uv.transform = CGAffineTransformMakeScale(0.8, 0.5); // 横0.8倍、縦0.5倍
uv.transform = CGAffineTransformMakeScale(3.0, 3.0); // 縦横3倍
// 移動
uv.transform =
CGAffineTransformMakeTranslation(100, -200); // 右に100px、上に200px移動
// 効果を与えたデータを作成する
CFDataRef effectedData;
effectedData = CFDataCreate(NULL, buffer, CFDataGetLength(data));
// 効果を与えたデータプロバイダを作成する
CGDataProviderRef effectedDataProvider;
effectedDataProvider = CGDataProviderCreateWithCFData(effectedData);
// 画像を作成する
CGImageRef effectedCgImage;
UIImage* effectedImage;
effectedCgImage = CGImageCreate(
width, height,
bitsPerComponent, bitsPerPixel, bytesPerRow,
colorSpace, bitmapInfo, effectedDataProvider,
NULL, shouldInterpolate, intent);
effectedImage = [[UIImage alloc] initWithCGImage:effectedCgImage];
[effectedImage autorelease];
// 画像を表示する
_imageView.image = effectedImage;
// 画像を保存する
UIImageWriteToSavedPhotosAlbum(effectedImage, self, nil, nil);
// 作成したデータを解放する
CGImageRelease(effectedCgImage);
CFRelease(effectedDataProvider);
CFRelease(effectedData);
CFRelease(data);
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker
{
// イメージピッカーを隠す
[self dismissModalViewControllerAnimated:YES];
}
自分なりに色々調べ、試行錯誤をしてみて再度コードを作成してみました。
カメラで撮影しイメージの取得まではできるようになったのですが、その後のイメージの編集ができず困っています。
めるぽん先生にお時間あれば、以下のソースコードを確認して頂き、アドバイスを頂ければ幸いです。
よろしくお願いします!
"camera_appViewController.h"
#import <UIKit/UIKit.h>
@interface camera_appViewController : UIViewController
<UIActionSheetDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate>
{
IBOutlet UIImageView* _imageView;
}
// アクション
- (IBAction)showCameraSheet;
@end
"camera_appViewController.m"
#import "camera_appViewController.h"
@implementation camera_appViewController
- (IBAction)showCameraSheet
{
// アクションシートを作る
UIActionSheet* sheet;
sheet = [[UIActionSheet alloc]
initWithTitle:@"Select Soruce Type"
delegate:self
cancelButtonTitle:@"Cancel"
destructiveButtonTitle:nil
otherButtonTitles:@"Photo Library", @"Camera", @"Saved Photos", nil];
[sheet autorelease];
// アクションシートを表示する
[sheet showInView:self.view];
}
- (void)actionSheet:(UIActionSheet*)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
// ボタンインデックスをチェックする
if (buttonIndex >= 3) {
return;
}
// ソースタイプを決定する
UIImagePickerControllerSourceType sourceType = 0;
switch (buttonIndex) {
case 0: {
sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
break;
}
case 1: {
sourceType = UIImagePickerControllerSourceTypeCamera;
break;
}
case 2: {
sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
break;
}
}
// 使用可能かどうかチェックする
if (![UIImagePickerController isSourceTypeAvailable:sourceType]) {
return;
}
// イメージピッカーを作る
UIImagePickerController* imagePicker;
imagePicker = [[UIImagePickerController alloc] init];
[imagePicker autorelease];
imagePicker.sourceType = sourceType;
imagePicker.allowsImageEditing = YES;
imagePicker.delegate = self;
// イメージピッカーを表示する
[self presentModalViewController:imagePicker animated:YES];
}
- (void)imagePickerController:(UIImagePickerController*)picker
didFinishPickingImage:(UIImage*)image
editingInfo:(NSDictionary*)editingInfo
{
// イメージピッカーを隠す
[self dismissModalViewControllerAnimated:YES];
// オリジナル画像を取得する
UIImage* originalImage;
originalImage = [editingInfo objectForKey:UIImagePickerControllerOriginalImage];
// グラフィックスコンテキストを作る
CGSize size = { 300, 400 };
UIGraphicsBeginImageContext(size);
// 画像を縮小して描画する
CGRect rect;
rect.origin = CGPointZero;
rect.size = size;
[originalImage drawInRect:rect];
// 描画した画像を取得する
UIImage* shrinkedImage;
shrinkedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// CGImageを取得する
CGImageRef cgImage;
cgImage = shrinkedImage.CGImage;
// 画像情報を取得する
size_t width;
size_t height;
size_t bitsPerComponent;
size_t bitsPerPixel;
size_t bytesPerRow;
CGColorSpaceRef colorSpace;
CGBitmapInfo bitmapInfo;
bool shouldInterpolate;
CGColorRenderingIntent intent;
width = CGImageGetWidth(cgImage);
height = CGImageGetHeight(cgImage);
bitsPerComponent = CGImageGetBitsPerComponent(cgImage);
bitsPerPixel = CGImageGetBitsPerPixel(cgImage);
bytesPerRow = CGImageGetBytesPerRow(cgImage);
colorSpace = CGImageGetColorSpace(cgImage);
bitmapInfo = CGImageGetBitmapInfo(cgImage);
shouldInterpolate = CGImageGetShouldInterpolate(cgImage);
intent = CGImageGetRenderingIntent(cgImage);
// データプロバイダを取得する
CGDataProviderRef dataProvider;
dataProvider = CGImageGetDataProvider(cgImage);
// ビットマップデータを取得する
CFDataRef data;
UInt8* buffer;
data = CGDataProviderCopyData(dataProvider);
buffer = (UInt8*)CFDataGetBytePtr(data);
// UIViewの生成
UIView *uv = [[UIView alloc] init];
uv.frame = self.view.bounds;
[self.view addSubview:uv];
// アフィン変換例文
// 回転
uv.transform = CGAffineTransformMakeRotation(M_PI * 90 / 180.0); // 90度回転
uv.transform = CGAffineTransformMakeRotation(M_PI); // 180度回転
// 拡大・縮小
uv.transform = CGAffineTransformMakeScale(0.8, 0.5); // 横0.8倍、縦0.5倍
uv.transform = CGAffineTransformMakeScale(3.0, 3.0); // 縦横3倍
// 移動
uv.transform =
CGAffineTransformMakeTranslation(100, -200); // 右に100px、上に200px移動
// 効果を与えたデータを作成する
CFDataRef effectedData;
effectedData = CFDataCreate(NULL, buffer, CFDataGetLength(data));
// 効果を与えたデータプロバイダを作成する
CGDataProviderRef effectedDataProvider;
effectedDataProvider = CGDataProviderCreateWithCFData(effectedData);
// 画像を作成する
CGImageRef effectedCgImage;
UIImage* effectedImage;
effectedCgImage = CGImageCreate(
width, height,
bitsPerComponent, bitsPerPixel, bytesPerRow,
colorSpace, bitmapInfo, effectedDataProvider,
NULL, shouldInterpolate, intent);
effectedImage = [[UIImage alloc] initWithCGImage:effectedCgImage];
[effectedImage autorelease];
// 画像を表示する
_imageView.image = effectedImage;
// 画像を保存する
UIImageWriteToSavedPhotosAlbum(effectedImage, self, nil, nil);
// 作成したデータを解放する
CGImageRelease(effectedCgImage);
CFRelease(effectedDataProvider);
CFRelease(effectedData);
CFRelease(data);
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker
{
// イメージピッカーを隠す
[self dismissModalViewControllerAnimated:YES];
}