2012-07-12 29 views
7

Tôi đã làm rất nhiều nỗ lực từ phía tôi. cuối cùng tôi cần giúp đỡ. nhờcắt một hình ảnh được phóng to trong ImageView bên trong scrollView

Mục tiêu: 1) Làm thế nào tôi phù hợp với IMAGExem bên scrollview

2) Làm thế nào tôi cắt một hình ảnh thu nhỏ trong scrollview bên trong.

Tôi có một imageView bên trong Chế độ xem cuộn. Tôi muốn cắt hình ảnh sau khi phóng to được hiển thị bên trong ranh giới scrollview. Tôi đã cắt hình ảnh nhưng nó không chính xác giống như tôi muốn.

Ở đây tôi đặt backgroundColor Black thành scrollView của tôi. Và khi tôi đặt imageView bên trong nó, nó không phù hợp. enter image description here

sau khi hình ảnh zoom bên trong xem di chuyển được

enter image description here

và sau khi hình ảnh cây trồng là

enter image description here

và mã của tôi là ở đây:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    CGRect frame1 = CGRectMake(50,50,200,200); 

    CGRect frame2 = CGRectMake(50,50,200,200); 

    imageView1=[[UIImageView alloc]initWithFrame:frame1]; 

    imageView1.image= [UIImage imageNamed:@"back.jpeg"]; 

    imageView1.backgroundColor=[UIColor brownColor]; 

    imageView1.contentMode = UIViewContentModeScaleAspectFit; 



    scroll=[[UIScrollView alloc]initWithFrame:frame2]; 

    scroll.backgroundColor=[UIColor blackColor]; 

    [scroll addSubview:imageView1]; 

    scroll.delegate=self; 

[self.view addSubview:scroll]; 

[self setContentSizeForScrollView]; 

self.imageView1.userInteractionEnabled = YES; 

} 

thiết lập s xem Croll contentSize

-(void)setContentSizeForScrollView 
{ 
// scroll.contentSize = CGSizeMake(imageView1.frame.size.width,imageView1.frame.size.height); 

    scroll.contentSize = CGSizeMake(200, 200); 
    scroll.minimumZoomScale = .50; 
    scroll.maximumZoomScale = 1.5; 
} 

và logic cây trồng của tôi là

-(IBAction)cropButtonClicked 
{ 
    //Calculate the required area from the scrollview 

CGRect rect = CGRectMake(50, 50, 200,200); 


UIImage *image = [self imageByCropping:imageView1.image toRect:rect]; 

imageView1.image=image; 


imageView1.contentMode = UIViewContentModeScaleAspectFit; 


} 

Và hình ảnh cây trồng phương pháp này:

- (UIImage*)imageByCropping:(UIImage *)myImage toRect:(CGRect)cropToArea{ 
    CGImageRef cropImageRef = CGImageCreateWithImageInRect(myImage.CGImage, cropToArea); 
    UIImage* cropped = [UIImage imageWithCGImage:cropImageRef]; 

    CGImageRelease(cropImageRef); 
    return cropped; 
} 

Trả lời

3

trả lời của câu hỏi của riêng tôi: Sau nhiều nỗ lực tôi tìm thấy câu trả lời cả hai câu hỏi của tôi.

và nó hoạt động tốt cho tôi. Tôi chia sẻ ở đây, có thể nó giúp ai đó. :)

1) Hình ảnh phù hợp Xem bên trong Chế độ xem cuộn. Tôi sử dụng số này link

- (void)centerScrollViewContents { 

CGSize boundsSize = scroll.bounds.size; 
CGRect contentsFrame = self.imageView1.frame; 

if (contentsFrame.size.width < boundsSize.width) { 
contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width)/2.0f; 
} 
else { 
contentsFrame.origin.x = 0.0f; 
} 

if (contentsFrame.size.height < boundsSize.height) { 
    contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height)/2.0f; 
} 
else { 
contentsFrame.origin.y = 0.0f; 
} 

self.imageView1.frame = contentsFrame; 
} 

2) Cắt hình thu nhỏ trong cuộn bên trongXem. Tôi sử dụng này link

UIGraphicsBeginImageContext(CGSizeMake(200, 200)); 

    [scroll.layer renderInContext:UIGraphicsGetCurrentContext()]; 

    UIImage *fullScreenshot = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    imageView1.contentMode = UIViewContentModeScaleAspectFill; 

    UIImageWriteToSavedPhotosAlbum(fullScreenshot, nil, nil, nil); 

    return fullScreenshot; 
2

Tôi đã có một vấn đề tương tự gần đây, tôi nhận được các giải pháp sử dụng các ý tưởng tương đối (Xá, b = Xá, c - xB, c)

-(IBAction)crop:(id)sender{ 

     // F = frame 
     // i = image 
     // iv = imageview 
     // sv = self.view 
     // of = offset 

     //Frame Image in imageView coordinates 
     CGRect Fi_iv = [self frameForImage:self.image inImageViewAspectFit:self.imageView]; 

     //Frame ImageView in self.view coordinates 
     CGRect Fiv_sv = self.imageView.frame; 

     //Frame Image in self.view coordinates 
     CGRect Fi_sv = CGRectMake(Fi_iv.origin.x + Fiv_sv.origin.x 
            ,Fi_iv.origin.y + Fiv_sv.origin.y, 
            Fi_iv.size.width, Fi_iv.size.height); 
     //ScrollView offset 
     CGPoint offset = self.scrollView.contentOffset; 

     //Frame Image in offset coordinates 
     CGRect Fi_of = CGRectMake(Fi_sv.origin.x - offset.x, 
             Fi_sv.origin.y - offset.y, 
             Fi_sv.size.width, 
             Fi_sv.size.height); 

     CGFloat scale = self.imageView.image.size.width/Fi_of.size.width; 

     //the crop frame in image offset coordinates 
     CGRect Fcrop_iof = CGRectMake((self.cropView.frame.origin.x - Fi_of.origin.x)*scale, 
             (self.cropView.frame.origin.y - Fi_of.origin.y)*scale, 
             self.cropView.frame.size.width*scale, 
             self.cropView.frame.size.height*scale); 

     UIImage *image = [self image:self.imageView.image cropRect:Fcrop_iof]; 
     // Use this crop image... 

Bạn có thể cắt hình ảnh sử dụng:

//Use this code to crop when you have the right frame 
-(UIImage*)image:(UIImage *)image cropRect:(CGRect)frame 
{ 
    // Create a new UIImage 
    CGImageRef imageRef = CGImageCreateWithImageInRect(image.CGImage, frame); 
    UIImage *croppedImage = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef); 

    return croppedImage; 
} 

Vì bạn đang sử dụng ImageView trong Aspect Fit, bạn cần phải tính toán khung ảnh bên trong IMAGExem

-(CGRect)frameForImage:(UIImage*)image inImageViewAspectFit:(UIImageView*)imageView 
{ 
    float imageRatio = image.size.width/image.size.height; 

    float viewRatio = imageView.frame.size.width/imageView.frame.size.height; 

    if(imageRatio < viewRatio) 
    { 
     float scale = imageView.frame.size.height/image.size.height; 

     float width = scale * image.size.width; 

     float topLeftX = (imageView.frame.size.width - width) * 0.5; 

     return CGRectMake(topLeftX, 0, width, imageView.frame.size.height); 
    } 
    else 
    { 
     float scale = imageView.frame.size.width/image.size.width; 

     float height = scale * image.size.height; 

     float topLeftY = (imageView.frame.size.height - height) * 0.5; 

     return CGRectMake(0, topLeftY, imageView.frame.size.width, height); 
    } 
} 

Tôi hy vọng mã này có thể hoạt động cho bạn vì nó hoạt động với tôi.

Tốt nhất,

Rafael.

+0

Tôi đang làm rung chuyển điều này. Vấn đề duy nhất tôi tìm thấy với mã ở trên là trong mã bên dưới tiêu đề "// khung cắt ảnh trong tọa độ bù đắp hình ảnh". Bạn đang sử dụng self.cropview.frame trong khi tôi sử dụng self.cropview.bounds. –

+1

Cool ..... cảm ơn dude..working awesome .. – Gokul

Các vấn đề liên quan