2011-07-08 5 views
2

ではありません。はprevioslyもう一方とジェスチャーUIImageViewによって回転マージ。 WYSは2つのUIImageViewをマージしようとしたときに、私はクレイジー取得していますWYG

状況:

  • 背景UIImageView (userPhotoImageView)
  • 、随分挟まと が、私は私の関数を呼び出す

を回転させることができるオーバーレイ UIImageView(productPhotoImageView) UIImages上では、私はそれらを含むUIImageViewからcoordsと新しいストレッチサイズを取ることができます(彼らは私のクラスで合成されています)

- (UIImage *)mergeImage:(UIImage *)bottomImg withImage:(UIImage *)topImg; 

多分最も簡単な方法は、次のように新しいCGContextRefトップUIImageViewの層をレンダリングすることになります。

[bottomImg drawInRect:CGRectMake(0, 0, bottomImg.size.width, bottomImg.size.height)]; 
    [productPhotoImageView.layer renderInContext:ctx]; 

しかし、このように私はprevioslyジェスチャーによって適用される回転効果を失います。

GestureEffectsを再現し、このような文脈で、それを描画するためにUIImageにAffineTransformationを適用しようとしていることになる第二の方法:

UIImage * scaledTopImg = [topImg imageByScalingProportionallyToSize:productPhotoView.frame.size]; 
    UIImage * rotatedScaledTopImg = [scaledTopImg imageRotatedByDegrees:ANGLE];  
    [rotatedScaledTopImg drawAtPoint:CGPointMake(productPhotoView.frame.origin.x, productPhotoView.frame.origin.y)]; 

この第二のアプローチの問題は、私は正確にできないんだということですユーザが対話を開始以来RotationGestureをので、次のコールバックを適用した後に0にリセットされるので、この最終的な回転度(上記のコードに充填されるべきアングル・パラメータに)量を取得する現在の回転からのデルタです。

2つ目のUIImageViewsがその瞬間に表示されるので、最も簡単な方法が最初のものになりますが、実際にはまだそれを行うことができませんでした。

答えて

0

私は同じ問題を抱えています。

私は回転に関してのみ問題があります。

私はジェスチャーレコグナイザーを使用して、移動、スケール、回転を行います。

最初にスケールを正しく保存したところ、位置は正しいものの、保存された画像には回転を適用しませんでした。

今、それはあなたが回転角度を知りたい場合は私がそれを得る

に動作します:

CGFloat angle = atan2(overlay.transform.b, overlay.transform.a); 

と回転と:

CGContextRotateCTM(context, angle); 

あなたは異なるアプローチを持っている場合は聞かせください私は知っている。

3

役立つので、あまりworkaroundyたグレート;)

ので、私はそれがここでの操作は私をなった後の写真をマージするために、いくつかのコード例を中心に見つけることはかなり難しい参照するので、それが役立つことことを願って:

- (UIImage *)mergeImage:(UIImage *)bottomImg withImage:(UIImage *)topImg { 

    UIImage * scaledTopImg = [topImg imageByScalingProportionallyToSize:productPhotoView.frame.size]; 

    UIGraphicsBeginImageContext(scaledTopImg.size); 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextTranslateCTM(ctx, scaledTopImg.size.width * 0.5f, scaledTopImg.size.height * 0.5f);  
    CGFloat angle = atan2(productPhotoView.transform.b, productPhotoView.transform.a);  
    CGContextRotateCTM(ctx, angle);  
    [scaledTopImg drawInRect:CGRectMake(- scaledTopImg.size.width * 0.5f, -(scaledTopImg.size.height * 0.5f), scaledTopImg.size.width, scaledTopImg.size.height)]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    UIGraphicsBeginImageContext(bottomImg.size); 
    [bottomImg drawInRect:CGRectMake(0, 0, bottomImg.size.width, bottomImg.size.height)];  
    [newImage drawInRect:CGRectMake(productPhotoView.frame.origin.x, productPhotoView.frame.origin.y, newImage.size.width, newImage.size.height)]; 
    UIImage *newImage2 = UIGraphicsGetImageFromCurrentImageContext();  
    UIGraphicsEndImageContext();  

    return newImage2; 
} 

私はバックグラウンドイメージを取得して以来、最初にオーバーレイビューにトランスフォーメーションを適用するだけのコンテキストを作成し、保存してボトムレイヤーの上に書き込むよりも簡単でした。

オーバーレイビューを回転する前にCTM変換に注意してください。イメージがその中心を中心に回転している間に、{0,0}に配置された軸を中心に回転します。

よろしく

+0

imageByScalingProportionallyToSize:productPhotoViewのメソッド定義をアップロードして、statement of mergeImageメソッドをアップロードできますか? –

+0

imageByScalingProportionallyToSize Definitionを入力してください – mouness2020

3

okが基本的にすべてのこのクレイジーなマージのもののための別の回避策はありますが、それは決定的にエレガントなソリューションではありません。どんな種類のAffineTransformationも扱わないようにするにはImageScreenをキャプチャしてからトリミングしてください。

CGImageRef screenImage = UIGetScreenImage(); 
CGRect fullRect = [[UIScreen mainScreen] applicationFrame]; 
CGImageRef saveCGImage = CGImageCreateWithImageInRect(screenImage, fullRect); 
CGRect cropRect = CGRectMake(x,y,width,height); 
CGImageRef saveCGImage = CGImageCreateWithImageInRect(screenImage, cropRect); 

あなたにはそれがエレガントではありませんでしたが、誰かにとっては役に立ちそうです。

関連する問題