2

私は、画像のパン、スケーリング、回転などの機能を持つアプリに取り組んでいます。最初に、画像の UIImageView に適用されるすべてのジェスチャ認識を実装しましたが、実際の画像が同じままであることに気付き、変更する必要がありました。

この種の問題を扱う SO に関する質問 -回転した UIImageView から UIImage を作成する- を見つけ、実際に Magic Bullet Dave が提供したコードを使用することができました。ただし、私のアプリは画像の回転だけでなくスケーリングもサポートするはずなので、変更する必要がありました。彼は基本的に、回転した画像が収まる CGRect を返すメソッドを作成しました。問題は、スケーリングされた画像を適切に囲むために CGRect をスケーリングできないことです。アプリで画像を回転させ (シミュレーターで実行)、テスト目的で保存された png バージョンを観察すると、CGRect は画像の上隅と下隅をクリップします。画像が 90 度回転するほど、それは切り取られます。

これは、CGRect を返すメソッドです。

- (CGRect) getBoundingRectAfterRotation: (CGRect) rectangle byAngle: (CGFloat) angleOfRotation {

    // Calculate the width and height of the bounding rectangle using basic trig
    CGFloat newWidth = rectangle.size.width * fabs(cosf(angleOfRotation)) + rectangle.size.height * fabs(sinf(angleOfRotation));
    CGFloat newHeight = rectangle.size.height * fabs(cosf(angleOfRotation)) + rectangle.size.width * fabs(sinf(angleOfRotation));

    // Calculate the position of the origin
    CGFloat newX = rectangle.origin.x + ((rectangle.size.width - newWidth) / 2);
    CGFloat newY = rectangle.origin.y + ((rectangle.size.height - newHeight) / 2);

    // Create the new rectangle
    CGRect rotatedRect = CGRectMake(newX, newY, newWidth, newHeight);
    return CGRectApplyAffineTransform(rotatedRect, CGAffineTransformScale(originalState, theScale, theScale));
}

ご覧のとおり、回転した画像の CGRect を取得してスケーリングしようとしましたが、役に立ちませんでした。次に、実際のイメージの作成に使用されます。

CGFloat angle = totalAngle;
UIImage *viewImage;

// Get image width, height of the bounding rectangle
CGRect boundingRect = [self getBoundingRectAfterRotation: self.photoView.bounds byAngle:angle];

// Create a graphics context the size of the bounding rectangle
UIGraphicsBeginImageContext(boundingRect.size);
CGContextRef context = UIGraphicsGetCurrentContext();

// Rotate and translate the context
CGAffineTransform transform = CGAffineTransformIdentity;
transform = CGAffineTransformTranslate(transform, boundingRect.size.width/2, boundingRect.size.height/2);
transform = CGAffineTransformRotate(transform, angle);
transform = CGAffineTransformScale(transform, theScale, -theScale);

CGContextConcatCTM(context, transform);

これは明らかに完了していないため、コードはまだクリーンアップされていません。現在、CGRect を必要以上に大きくすることで回避策を作成しましたが、もちろんこれは避けたいと考えています。

どんな助けでも大歓迎です。

4

0 に答える 0