2015-02-24 81 views
3

我有一个UIImageView(红色方块),将显示一个UIImage必须缩放(我可以接收图像大于或小于UIImageView)。缩放之后,UIImage的显示部分是它的中心。UIImageView内移动UIImage

我需要的是在蓝色方块中显示图像的一部分,我如何存档它?

我只能够得到图像大小(高度和宽度),但它显示原始大小,当它应该是缩放的。

self.viewIm = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 120, 80)]; 
self.viewIm.backgroundColor = [UIColor greenColor]; 
self.viewIm.layer.borderColor = [UIColor redColor].CGColor; 
self.viewIm.layer.borderWidth = 5.0; 
UIImage *im = [UIImage imageNamed:@"benjen"]; 
self.viewIm.image = im; 
self.viewIm.contentMode = UIViewContentModeScaleAspectFill; 
// self.viewim.clipsToBounds = YES; 
[self.view addSubview:self.viewIm]; 

enter image description here

+0

尝试UIViewContentModeTop – Mornirch 2015-02-24 21:48:04

+0

'UIViewContentModeTop'将没有形成规模,所以不是一种选择? – jherran 2015-02-24 21:50:36

+0

使用UIGraphicsContext创建一个新的图像自定义大小? – Mornirch 2015-02-24 21:55:35

回答

1

我在this answer找到了一个非常好的近似值。其中,类别调整图像大小,然后使用中心点进行裁剪。我使用(0,0)作为原点将其调整为裁剪。由于我不需要一个类别,因此我将它用作单一方法。

- (UIImage *)imageByScalingAndCropping:(UIImage *)image forSize:(CGSize)targetSize { 
    UIImage *sourceImage = image; 
    UIImage *newImage = nil; 
    CGFloat scaleFactor = 0.0; 
    CGFloat scaledWidth = targetSize.width; 
    CGFloat scaledHeight = targetSize.height; 

    if (CGSizeEqualToSize(image.size, targetSize) == NO) { 
     if ((targetSize.width/image.size.width) > (targetSize.height/image.size.height)) { 
      scaleFactor = targetSize.width/image.size.width; // scale to fit height 
     } else { 
      scaleFactor = targetSize.height/image.size.height; // scale to fit width 
     } 

     scaledWidth = image.size.width * scaleFactor; 
     scaledHeight = image.size.height * scaleFactor; 
    } 

    UIGraphicsBeginImageContext(targetSize); // this will crop 

    CGRect thumbnailRect = CGRectZero; 
    thumbnailRect.origin = CGPointZero; 
    thumbnailRect.size.width = scaledWidth; 
    thumbnailRect.size.height = scaledHeight; 

    [sourceImage drawInRect:thumbnailRect]; 

    newImage = UIGraphicsGetImageFromCurrentImageContext(); 

    if(newImage == nil) { 
     NSLog(@"could not scale image"); 
    } 

    //pop the context to get back to the default 
    UIGraphicsEndImageContext(); 

    return newImage; 
} 

而且我的电话是这样的:

self.viewIm = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 120, 80)]; 
self.viewIm.image = [self imageByScalingAndCropping:[UIImage imageNamed:@"benjen"] forSize:CGSizeMake(120, 80)]; 
[self.view addSubview:self.viewIm]; 
1

尝试是这样的:

CGRect cropRect = CGRectMake(0,0,200,200); 
CGImageRef imageRef = CGImageCreateWithImageInRect([ImageToCrop CGImage],cropRect); 
UIImage *image = [UIImage imageWithCGImage:imageRef]; 
CGImageRelease(imageRef); 
+0

您的解决方案不会缩放图像。 – jherran 2015-02-24 22:13:35

2

做你想做什么,我建议你寻找到CALayercontentsRect财产。

既然看到你的答案,我一直在努力找出适当的解决方案一段时间,但数学逃避我,因为contentsRect:的sx和y参数看起来有点神秘......但是这里有一些代码可能指向你在正确的方向...

float imageAspect = self.imageView.image.size.width/self.imageView.image.size.height; 
float imageViewAspect = self.imageView.frame.size.width/self.imageView.frame.size.height; 

if (imageAspect > imageViewAspect) { 
    float scaledImageWidth = self.imageView.frame.size.height * imageAspect; 
    float offsetWidth = -((scaledImageWidth-self.imageView.frame.size.width)/2); 
    self.imageView.layer.contentsRect = CGRectMake(offsetWidth/self.imageView.frame.size.width, 0.0, 1.0, 1.0); 
} else if (imageAspect < imageViewAspect) { 
    float scaledImageHeight = self.imageView.frame.size.width * imageAspect; 
    float offsetHeight = ((scaledImageHeight-self.imageView.frame.size.height)/2); 
    self.imageView.layer.contentsRect = CGRectMake(0.0, offsetHeight/self.imageView.frame.size.height, 1.0, 1.0); 
} 
+0

有用的线索。谢谢 – jherran 2015-02-25 19:30:27