繁体   English   中英

从可调整大小的UIImageView的图像中裁剪部分

[英]crop section from resizeable UIImageView's image

我有一个UIImageView,它从UIImagePickerController获取图像。UIImageView设置为Aspect Fit Im,使用手势识别器来移动,缩放和旋转此UIImageView

我有第二个,小得多的UIImageView第二个UIImageView在第一个的前面并居中

我想做的是能够移动,缩放和旋转第一个UIImageView到位,然后按一个按钮以创建一个仅包含原始图像在第二个UIImageView范围内可见的部分的新图像。

我尝试了很多方法来裁剪图像而没有成功。 我尝试的所有操作都会裁剪图像,但是返回的图像不是我期望的。 我得到的结果似乎是“全尺寸”图像顶部,右侧部分的旋转部分。

我正在使用Trevor的Bike Shed中的UIImage类别

我的代码:

。H

@interface BubbleBossViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate, UIGestureRecognizerDelegate>{
    IBOutlet UIImageView *smallCropperWindow;
    IBOutlet UIImageView *imageViewForChosenImage;
    IBOutlet UIView *canvas;
    CGFloat _lastScale;
    CGFloat _lastRotation;
    CGFloat _firstX;
    CGFloat _firstY;
    CAShapeLayer *_marque;

}
@property BOOL newMedia;
- (IBAction)useCamera:(id)sender;
- (IBAction)useCameraRoll:(id)sender;
- (IBAction)crop:(id)sender;

@end

相关.m- (void)crop:(id)sender {

smallCropperWindow.image=[imageViewForChosenImage.image croppedImage: (CGRect)smallCropperWindow.frame];

}

在UIImage + Resize.h中

- (UIImage *)croppedImage:(CGRect)bounds;

在UIImage + Resize.m中

- (UIImage *)croppedImage:(CGRect)bounds {
    CGFloat scale = MAX(self.scale, 1.0f);
    CGRect scaledBounds = CGRectMake(bounds.origin.x * scale, bounds.origin.y * scale, bounds.size.width * scale, bounds.size.height * scale);
    CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], scaledBounds);
    UIImage *croppedImage = [UIImage imageWithCGImage:imageRef scale:self.scale orientation:UIImageOrientationUp];
    CGImageRelease(imageRef);
    return croppedImage;
}

屏幕截图显示了问题: 在此处输入图片说明

中间的小方块应充满婴儿的脸,而不是全尺寸图片的地板一部分。

我在这里做错了什么?

您正在进行的计算似乎不正确。 尝试这个,

  1. 首先,您必须使图像外观合适。
  2. 然后找到比率heightRatio=image.size.height/imageView.frame.height;
  3. 然后找到比率weidthRatio=image.size.width/imageView.frame.width;

现在,不必传递smallCropperWindow.frame ,而要做三件事,

  1. 平移小作物窗口的中心。将进行大量计算,因为宽高比适合的图像不会从imageview的原点开始。
  2. 缩放croppedWindow的宽度和高度,然后传递此帧进行裁剪。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM