从可调整大小的图像查看图像裁剪部分

时间:2014-01-03 05:34:53

标签: ios objective-c image uiimageview crop

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

我有第二个,小得多的UIImageView 第二个UIImageView位于第一个

的前面并以第一个

为中心

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

我尝试了很多方法来裁剪图像而没有成功。我尝试的所有东西都会裁剪图像,但返回的图像并不是我所期望的。我得到的东西似乎是FULL SIZE图像顶部右手部分的旋转部分。

我正在使用Trevor’s 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 - (无效)作物:(ID)发送方{

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;
}

显示问题的屏幕截图: enter image description here

中间的小方块应该用babbie的脸填充,而不是全尺寸图像中的一部分地板。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

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

  1. 首先,你必须使图像方面合适。
  2. 然后找到比率heightRatio=image.size.height/imageView.frame.height;
  3. 然后找到比率weidthRatio=image.size.width/imageView.frame.width;
  4. 现在不是传递你的smallCropperWindow.frame,而是要做三件事,

    1. 翻译小裁剪窗口的中心。由于纵横比拟图像不会从图像视图的原点开始,所以会进行大量计算。
    2. 缩放croppedWindow的宽度和高度,并传递此帧以进行裁剪。