2012-07-12 8 views
7

Ho già fatto molti sforzi dal mio lato. finalmente ho bisogno di aiuto. grazieritagliare un'immagine ingrandita in ImageView all'interno di scrollView

Obiettivo: 1) Come mi adatto IMAGEVIEW all'interno ScrollView

2) Come ritagliare ho una foto ingrandita in ScrollView all'interno.

Ho un imageView all'interno di Scroll View. Voglio un'immagine di ritaglio dopo lo zoom che è visualizzata all'interno del limite della pagina di scorrimento. Ho già ritagliato l'immagine ma non è esattamente la stessa che voglio.

Qui ho impostato backgroundColor Black sulla mia scrollView. E quando inserisco ImageView al suo interno, non è adatto. enter image description here

dopo lo zoom dell'immagine vista interna di scorrimento è

enter image description here

e l'immagine delle colture dopo l'

enter image description here

e il mio codice è qui:

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

} 

impostazione s vista 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; 
} 

e la mia logica raccolto è

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


} 

E questa immagine metodo di coltura:

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

    CGImageRelease(cropImageRef); 
    return cropped; 
} 

risposta

3

risposta della mia domanda: Dopo molti sforzi ho trovato la risposta di entrambe le mie domande.

e funziona bene per me. Condivido qui, potrebbe essere di aiuto a qualcuno. :)

1) Adatta immagine Visualizza all'interno della Vista di scorrimento. Io uso questo 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) Raccolto di un'immagine ingrandita in ScrollView all'interno. Io uso questo link

UIGraphicsBeginImageContext(CGSizeMake(200, 200)); 

    [scroll.layer renderInContext:UIGraphicsGetCurrentContext()]; 

    UIImage *fullScreenshot = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    imageView1.contentMode = UIViewContentModeScaleAspectFill; 

    UIImageWriteToSavedPhotosAlbum(fullScreenshot, nil, nil, nil); 

    return fullScreenshot; 
2

Ho avuto un problema simile di recente, ho avuto la soluzione utilizzando l'idea relativa (Xa, b = Xa, 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... 

È possibile ritagliare la immagine utilizzando:

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

Dal momento che si sta utilizzando l'ImageView in Aspect Fit, è necessario calcolare la cornice dell'immagine all'interno della ImageView

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

Spero che questo codice possa funzionare per voi come ha funzionato per me.

Best,

Rafael.

+0

Sto cullando questo. L'unico problema che ho riscontrato con il codice sopra riportato è nel codice sotto l'intestazione "// frame di ritaglio nelle coordinate di offset dell'immagine". Stai usando self.cropview.frame mentre io ho usato self.cropview.bounds. –

+1

Cool ..... grazie amico ... lavoro fantastico ... – Gokul

Problemi correlati