ユーザーがカメラから画像をキャプチャするか、ライブラリから画像を選択できるようにしています。この画像はUIImageView
. ユーザーは、が に設定されているUIImagePickerController
場合とまったく同じように、バウンディング ボックス内で画像をスケーリングおよび配置できるようになりました。allowsEditing
YES
ユーザーが結果に満足して [完了] をタップすると、トリミングされUIImage
た . CGImageCreateWithImageInRect
これはスケーリングを考慮していないため、使用すると問題が発生します。変換は、次のように imageView に適用されます。
CGAffineTransform transform = CGAffineTransformScale(self.imageView.transform, newScale, newScale);
[self.imageView setTransform:transform];
ジェスチャレコグナイザの使用。
何が起こっているのかと思います。UIImageView がスケーリングされて移動され、UIViewContentModeScaleAspectFit が保持されている UIImage に適用され、画像をトリミングするように要求すると、正確にそれが行われます - スケーリングの位置に関係なく。私がこれを考える理由は、画像を拡大縮小したり移動したりせずに [完了] をタップするだけで、すぐにトリミングが機能するからです。
次のように画像をトリミングします。
- (UIImage *)cropImage:(UIImage*) img toRect:(CGRect)rect {
CGFloat scale = [[UIScreen mainScreen] scale];
if (scale>1.0) {
rect = CGRectMake(rect.origin.x*scale , rect.origin.y*scale, rect.size.width*scale, rect.size.height*scale);
}
CGImageRef imageRef = CGImageCreateWithImageInRect([img CGImage], rect);
UIImage *result = [UIImage imageWithCGImage:imageRef scale:self.imageView.image.scale orientation:self.imageView.image.imageOrientation];
// UIImage *result = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
return result;
}
メインビューのサブビューであるビューからcropRectを渡します(UIImagePickerControllerのような正方形のオーバーレイボックス)。メイン UIView には、スケーリングされる UIImageView と、切り抜き四角形を表示する UIView があります。
「見たとおりの結果が得られる」クロッピングを行うにはどうすればよいですか。また、どの要素を考慮に入れる必要がありますか。または、階層またはスケーリングを別の方法で実装する必要があるかどうかの提案かもしれません。