11

だから私はキャンバス(UIView)とUIImageViewを持っています、キャンバスはimageviewのマスクとして機能します

ここに画像の説明を入力してください

UIGestureRecognizersを使用して、キャンバスの下にあるUIImageViewをズームおよび回転しています。

最終的な画像を変換したい(キャンバスに表示してUIImageに変換する、1つの解決策は、キャンバスを以下のような画像に変換することです

UIGraphicsBeginImageContext(self.canvas.bounds.size);
[self.canvas.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *newCombinedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

これで問題なく動作しますが、このソリューションの問題は、画像がキャンバスのサイズにトリミングされるため、解像度が非常に低くなることです。

私が調べたもう1つのオプションは、いくつかのカスタムUIImageカテゴリを使用して回転および拡大縮小することでした。

[[[self.photoImage image] imageRotatedByDegrees:rotaton_angle] 
     imageAtRect:CGRectMake(x,y width,height)]

回転角を指定する必要があります(UIGesture Delegateによって提供される回転角は度またはラジアンではなく、x、y、幅、高さがあります。これらは何らかのスケールに基づいて計算する必要があると思います(スケール値を取得します) UIGestureデリゲートからですが、この関数には正しくないようです)

ここには多くの解決策があり、長方形を指定してトリミングして画像化するためのガイドとなります。しかし、私の場合、rectは画像と同じスケールではなく、回転も含まれます。

どんな助けでもありがたいです。

4

2 に答える 2

2

私はこれをなんとか解決しました、これが私の解決策です、それは間違いなく最もきれいではありませんが、それは機能します。

パン、ズーム、回転の3つを処理する必要がありました。

最初に、UIGestureRecognizer Delegateを使用して、3つすべてのUIGestureRecognizerStateEndedで増分する累積値を取得しました。

次に、回転には、ここで説明したUIImageカテゴリを使用しました

    self.imagetoEdit = [self.imagetoEdit imageRotatedByRadians:total_rotation];

ズーム(スケール)にはGPUImageを使用しました(アプリ全体でこれを使用しています)

GPUImageTransformFilter *scaleFilter = [[GPUImageTransformFilter alloc] init];
[scaleFilter setAffineTransform:CGAffineTransformMakeScale(total_scale, total_scale)];
[scaleFilter prepareForImageCapture];
self.imagetoEdit = [scaleFilter imageByFilteringImage:self.imagetoEdit];

パンのために、私はこれをやっています。(最もクリーンなコードではありません:S)上記のUIImage+Categoriesも使用します。

CGFloat x_ = (translation_point.x/canvas.frame.size.width)*self.imagetoEdit.size.width;
CGFloat y_ = (translation_point.y/canvas.frame.size.height)*self.imagetoEdit.size.height;
CGFloat xx = 0;
CGFloat yy = 0;
CGFloat ww = self.imagetoEdit.size.width-x_;
CGFloat hh = self.imagetoEdit.size.height-y_;

if (translation_point.x < 0) {
    xx = x_*-1;
    ww = self.imagetoEdit.size.width + xx;
}

if (translation_point.y < 0) {
    yy = y_*-1;
    hh = self.imagetoEdit.size.height + yy;
}

CGRect cgrect = CGRectMake(xx,yy, ww, hh);
self.imagetoEdit = [self.imagetoEdit imageAtRect:cgrect];

すべてが機能しているようです。

于 2013-03-27T09:01:16.050 に答える
1

これは役立つかもしれません... UIImageの正しいサイズ変更

ARCなどの更新が必要になるかもしれませんが...Githubに投稿した人もいると思います。

于 2013-03-20T09:05:34.717 に答える