1

だから私は一日中それをやっていて運が悪かったし、言うまでもなく非常にイライラしていました.多くの例とダウンロード可能なカテゴリを調べました.すべてが画像を完璧にトリミングできることを宣伝しています. 彼らは何をしますが、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

4

1 に答える 1

3

このちょっとした難問は、ほぼ一週間後に私を困惑させただけでなく、私の質問を見た人のうち、何の提案もしなかった人はほとんどいなかったようです。この特定の問題については、この方法で機能させることができなかったと言わざるを得ません。私がこれをするまで

[self HideElements];

UIGraphicsBeginImageContext(chosenPhotoView.frame.size);
[chosenPhotoView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

[self ShowElements];

それだけで、コードが少なくなり、すぐに機能しました。したがって、スクロールビューを介して画像をトリミングしようとする代わりに、その時点で画面のスクリーンショットを撮り、スクロールビューのフレーム変数を使用して画像をトリミングします。そして、要素の非表示/表示機能は、必要な画像上の重複する要素を非表示にします。

于 2012-10-15T02:36:21.437 に答える