2013-04-03 2 views
0

Задача: Обрезка с уменьшенным изображением в порядке. Обрезка с увеличенным изображением показывает изображение выше того, что должно быть. yOffset У меня есть, потому что квадрат урожая, который я хочу, начинается ниже, где выполняется прокрутка.Как захватить увеличенный UIImageView внутри Scrollview для обрезки?

Код:

CGRect rect; 
float yOffset = 84; 
rect.origin.x = floorf([scrollView contentOffset].x * zoomScale); 
rect.origin.y = floorf(([scrollView contentOffset].y + yOffset) * zoomScale); 
rect.size.width = floorf([scrollView bounds].size.width * zoomScale); 
rect.size.height = floorf((320 * zoomScale)); 

if (rect.size.width > 320) { 
    rect.size.width = 320; 
} 

if (rect.size.height > 320) { 
    rect.size.height = 320; 
} 

CGImageRef cr = CGImageCreateWithImageInRect([[imageView image] CGImage], rect); 

UIImage *img = imageView.image; //[UIImage imageWithCGImage:cr]; 

UIGraphicsBeginImageContext(rect.size); 

// translated rectangle for drawing sub image 
CGRect drawRect = CGRectMake(-rect.origin.x, -rect.origin.y, 320.0f, 320.0f); 
NSLog(@"drawRect: %@", NSStringFromCGRect(drawRect)); 
NSLog(@"rect: %@", NSStringFromCGRect(rect)); 

// draw image 
[img drawInRect:drawRect]; 

// grab image 
UIImage *cropped = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 

CGImageRelease(cr); 

[self.delegate imageCropper:self didFinishCroppingWithImage:cropped]; 

Что я делаю, что вызывает изображение, чтобы получить неправильную высоту при масштабировании?

ответ

9
UIImage* imageFromView(UIImage* srcImage, CGRect* rect) 
{ 
    CGImageRef cr = CGImageCreateWithImageInRect(srcImage.CGImage, *rect); 
    UIImage* cropped = [UIImage imageWithCGImage:cr]; 

    CGImageRelease(cr); 
    return cropped; 
} 
-(void) doneEditing 
{ 
    //Calculate the required area from the scrollview 
    CGRect visibleRect; 
    float scale = 1.0f/scrollView.zoomScale; 
    visibleRect.origin.x = scrollView.contentOffset.x * scale; 
    visibleRect.origin.y = scrollView.contentOffset.y * scale; 
    visibleRect.size.width = scrollView.bounds.size.width * scale; 
    visibleRect.size.height = scrollView.bounds.size.height * scale; 


    FinalOutputView* outputView = [[FinalOutputView alloc] initWithNibName:@"FinalOutputView" bundle:[NSBundle mainBundle]]; 
    outputView.image = imageFromView(imageView.image, &visibleRect); 

    [self.navigationController pushViewController:outputView animated:YES]; 
    [outputView release]; 
} 

Загрузка Orginal Изображение:

enter image description here

Изменение масштаба изображения:

enter image description here

Наконец Захват изображения

enter image description here

+0

Выглядит очень хорошо! Я вижу зеленую рамку сверху и снизу изображения. Похоже, что ширина и размер 240x240, потому что минимальный масштаб масштабирования прокрутки - 1,3. Тестирование .. любой совет? – quantumpotato

+0

Где в моем ответе или в вашем .., если мой ответ может помочь вам, тогда вы можете его принять –

0

Если вы хотите взять скриншот из всего зрения Scrollview (после масштабирования), вы можете сделать это:

UIImage* image = nil; 
UIGraphicsBeginImageContext(self.scrollView.contentSize); 
{ 
    //save previous frames 
    CGPoint savedContentOffset = self.scrollView.contentOffset; 
    CGRect savedFrame = self.scrollView.frame; 
    CGRect imgFrame = self.imageView.frame; 

    //set the frames with current content size 
    self.scrollView.contentOffset = CGPointZero; 
    self.scrollView.frame = CGRectMake(0, 0, self.scrollView.contentSize.width, self.scrollView.contentSize.height); 
    self.imageView.frame = self.scrollView.frame; 

    //render image now :) 
    [self.scrollView.layer renderInContext: UIGraphicsGetCurrentContext()]; 
    image = UIGraphicsGetImageFromCurrentImageContext(); 

    //now set the frames again with old ones :) 
    self.scrollView.contentOffset = savedContentOffset; 
    self.scrollView.frame = savedFrame; 
    self.imageView.frame = imgFrame; 
    [self viewForZoomingInScrollView:self.scrollView]; 
} 
UIGraphicsEndImageContext(); 

//get the documents path 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
//save file as savedImage.png 
NSString *savedImagePath = [documentsDirectory stringByAppendingPathComponent:@"savedImage.png"]; 

//get the png data from image 
NSData *imageData = UIImagePNGRepresentation(image); 
//write it now 
[imageData writeToFile:savedImagePath atomically:NO]; 
Смежные вопросы