だから私は一日中それをやっていて運が悪かったし、言うまでもなく非常にイライラしていました.多くの例とダウンロード可能なカテゴリを調べました.すべてが画像を完璧にトリミングできることを宣伝しています. 彼らは何をしますが、AVCaptureSessionを介して生成された画像からそれを実行しようとすると、うまくいきません。私はこれら両方の情報源を調べました
http://codefuel.wordpress.com/2011/04/22/image-cropping-from-a-uiscrollview/
http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/
最初のリンクからのプロジェクトは、宣伝どおりに直接機能するようですが、ハックしてAVキャプチャ画像で同じ魔法を行うとすぐに...いいえ...
誰かがこれについて洞察を持っていますか?参照用の私のコードもここにあります。
- (IBAction)TakePhotoPressed:(id)sender
{
AVCaptureConnection *videoConnection = nil;
for (AVCaptureConnection *connection in stillImageOutput.connections)
{
for (AVCaptureInputPort *port in [connection inputPorts])
{
if ([[port mediaType] isEqual:AVMediaTypeVideo] )
{
videoConnection = connection;
break;
}
}
if (videoConnection) { break; }
}
//NSLog(@"about to request a capture from: %@", stillImageOutput);
[stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error)
{
CFDictionaryRef exifAttachments = CMGetAttachment( imageSampleBuffer, kCGImagePropertyExifDictionary, NULL);
if (exifAttachments)
{
// Do something with the attachments.
//NSLog(@"attachements: %@", exifAttachments);
}
else
NSLog(@"no attachments");
NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];
UIImage *image = [[UIImage alloc] initWithData:imageData];
NSLog(@"%f",image.size.width);
NSLog(@"%f",image.size.height);
float scale = 1.0f/_scrollView.zoomScale;
CGRect visibleRect;
visibleRect.origin.x = _scrollView.contentOffset.x * scale;
visibleRect.origin.y = _scrollView.contentOffset.x * scale;
visibleRect.size.width = _scrollView.bounds.size.width * scale;
visibleRect.size.height = _scrollView.bounds.size.height * scale;
UIImage* cropped = [self cropImage:image withRect:visibleRect];
[croppedImage setImage:cropped];
[image release];
}
];
[croppedImage setHidden:NO];
}
上記で使用したcropImage関数。
-(UIImage*)cropImage :(UIImage*)originalImage withRect :(CGRect) rect
{
CGRect transformedRect=rect;
if(originalImage.imageOrientation==UIImageOrientationRight)
{
transformedRect.origin.x = rect.origin.y;
transformedRect.origin.y = originalImage.size.width-(rect.origin.x+rect.size.width);
transformedRect.size.width = rect.size.height;
transformedRect.size.height = rect.size.width;
}
CGImageRef cr = CGImageCreateWithImageInRect(originalImage.CGImage, transformedRect);
UIImage* cropped = [UIImage imageWithCGImage:cr scale:originalImage.scale orientation:originalImage.imageOrientation];
[croppedImage setFrame:CGRectMake(croppedImage.frame.origin.x,
croppedImage.frame.origin.y,
cropped.size.width,
cropped.size.height)];
CGImageRelease(cr);
return cropped;
}
また、スクロールビューと avcapture セッションの初期化を投稿するために、できるだけ多くの情報を提供して、私の苦境で私を助けてくれる人は誰でも冗長で武装したいと思っています。ただし、それは少し多すぎるかもしれませんので、見たい場合はお尋ねください。
コードが実際に行うことの結果については?..
写真を撮る前はこんな感じ
以降...
編集:
さて、私は今いくつかのビューを持っていますが、コメントがないので、誰もそれを理解していないか、あまりにも単純なので、私がもう一度考え出すだろうと思っていました... いずれにせよ、私は何の進歩もしていません. ここに興味のある人のために、コードがすべて設定された小さなサンプルアプリがあり、私が何をしているかを見ることができます
https://docs.google.com/open?id=0Bxr4V3a9QFM_NnoxMkhzZTVNVEE