2016-05-30 8 views
0

Ich verwende die folgende Beschnittmethode, um ein uiimage zuzuschneiden, das in einem UIImageView sitzt, das dann in einem UIScrollView sitzt.Problem mit cropImage-Methode auf Bild in UIScrollView ergibt falsches Bild

-(UIImage *)cropImage:(UIImage *)image 
{ 
    float scale = 1.0f/_scrollView.zoomScale; 

    NSLog(@"Oh and heres that zoomScale: %f", _scrollView.zoomScale); 

    CGRect visibleRect; 
    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; 

    NSLog(@"Oh and here's that CGRect: %f", visibleRect.origin.x); 
    NSLog(@"Oh and here's that CGRect: %f", visibleRect.origin.y); 
    NSLog(@"Oh and here's that CGRect: %f", visibleRect.size.width); 
    NSLog(@"Oh and here's that CGRect: %f", visibleRect.size.height); 

    CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], visibleRect); 
    UIImage *croppedImage = [[UIImage alloc] initWithCGImage:imageRef]; 
    CGImageRelease(imageRef); 

    return croppedImage; 
} 

Ich brauche das Bild zu einer CGSize von (321,115) beschnitten. Nach dem Beschneiden des Bildes und dem Betrachten der Druckergebnisse kann ich sehen, dass visibleRect (0,0,321,115) ist - was es sein soll, die croppedImage UIIage hat dann Breite: 321 und Höhe: 115. Aus irgendeinem Grund scheint das Bild jedoch vollständig zu weit herangezoomt zu sein (die Methode hat einen kleineren Teil des Originalbilds auf eine Größe von 321x115 zugeschnitten).

Warum schneidet diese Methode mein Bild nicht richtig ab?

-als eine Randnotiz: Wenn ich diese Methode aufrufen, rufe ich wie _croppedImage = [self cropImage:_imageView.image];, die eine UIImage-Eigenschaft einer benutzerdefinierten UIView-Klasse auf das zugeschnittene Bild setzt.

Antwort

2

Bitte versuchen Sie diese Funktion. Es kann dir helfen.

Parameter:

  1. UIImage
  2. CGSize (321,115) oder jede Größe

// Ernte Bild - Bild wird von der vollständigen Bild zuschneiden

- (UIImage *)cropImageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize { 
    double ratio; 
    double delta; 
    CGPoint offset; 

    //make a new square size, that is the resized imaged width 
    CGSize sz = CGSizeMake(newSize.width, newSize.width); 

    //figure out if the picture is landscape or portrait, then 
    //calculate scale factor and offset 
    if (image.size.width > image.size.height) { 
     ratio = newSize.width/image.size.width; 
     delta = (ratio*image.size.width - ratio*image.size.height); 
     offset = CGPointMake(delta/2, 0); 
    } 
    else { 
     ratio = newSize.width/image.size.height; 
     delta = (ratio*image.size.height - ratio*image.size.width); 
     offset = CGPointMake(0, delta/2); 
    } 

    //make the final clipping rect based on the calculated values 
    CGRect clipRect = CGRectMake(-offset.x, 
           -offset.y, 
           (ratio * image.size.width) + delta, 
           (ratio * image.size.height) + delta); 


    //start a new context, with scale factor 0.0 so retina displays get 
    //high quality image 
    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { 
     UIGraphicsBeginImageContextWithOptions(sz, YES, 0.0); 
    } else { 
     UIGraphicsBeginImageContext(sz); 
    } 
    UIRectClip(clipRect); 
    [image drawInRect:clipRect]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return newImage; 
} 

Um nur ausgewählte Bereiche zu beschneiden Bild

Bitte überprüfen Sie this link

+0

Wie berücksichtigt dieser Code meine UIScrollView zoomScale? Ich muss den scaleFactor des UIScrollView berücksichtigen, sonst wird der ausgewählte Bereich nicht beschnitten – Chisx

+0

Es bedeutet, dass nur ausgewählte Bereiche beschnitten werden sollen. Recht ? Wenn ja, dann überprüfen Sie bitte die bearbeitete Antwort –

+0

Ja, ich habe es fast funktioniert mit http://stackoverflow.com/questions/7760191/cropping-a-uiimage-according-to-the-viewport-inside-a-uiscrollview, aber es gibt Probleme mit diesem Code .. nur etwas aus. Und ja .. nur ausgewählte Bereich .. Grundsätzlich der gezoomte Bereich oder der Bereich, der in UIScrollView erscheint. Das ist nahe, aber das ist nicht ganz das, wonach ich suche, der Link, den ich hier geteilt habe, ist im Grunde das, wonach ich suchte, aber es funktioniert nicht vollständig. – Chisx

Verwandte Themen