2016-06-30 102 views
10

ho già implementato vernice/disegnare utilizzando:Getting UIImage per soli limiti particolare attratti - PaintView

- (void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event 
-(void) touchesMoved: (NSSet *) touches withEvent: (UIEvent *) event 
- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event 

Ora problema è che per ogni linea tracciata, voglio ottenere quell'immagine particolare linea/vernice. Non voglio l'immagine dell'intero schermo, solo l'area/limiti di linea/pittura disegnata.

Il motivo è che voglio eseguire il pan gesture/eliminare la funzionalità su quella linea/pittura disegnata.

L'utente può disegnare più righe, quindi desidera UIImage per tutte queste righe separatamente.

Qualsiasi logica o frammento di codice sarà davvero utile

Grazie in anticipo

risposta

1

A seconda dell'applicazione, in particolare quante volte hai intenzione di fare questo in una fila, si può essere in grado di creare un diverso immagine/strato per ogni linea di pittura. La tua immagine finale sarebbe essenzialmente tutte le singole linee disegnate l'una sull'altra.

Potrebbe essere più efficiente creare una vista personalizzata per acquisire eventi di tocco. È possibile memorizzare l'elenco delle coordinate di tocco per ciascuna linea di disegno e renderle tutte contemporaneamente in una combinazione di disegni personalizzati. In questo modo si memorizzano elenchi di coordinate per ogni linea di disegno e si può comunque accedere a ciascuno di essi, invece di un elenco di immagini. È possibile calcolare l'area/i limiti dalle coordinate utilizzate per il rendering della linea.

Contesto e codice aggiuntivi potrebbero essere utili, non sono sicuro di capire completamente cosa stai cercando di realizzare!

+0

Ogni frammento di codice sarà utile –

+0

sarebbe utile se hai postato la vernice/disegnare metodi così me stesso o gli altri potrebbe essere in grado di farlo più facilmente. – bradkratky

+0

Sto usando questa libreria https://github.com/megavolt605/MVPaint –

1

Diamo un'occhiata al progetto MVPaint. Sembra che tu abbia un oggetto:

MVPaintDrawing _drawing;

che contiene un array di MVPaintTransaction. È possibile scorrere su quelli MVPaintTransaction per disegnare un UIImage.

Quindi, prima si può aggiungere un metodo per ottenere un'immagine da un MVPaintTransaction:

- (UIImage *) imageToDrawWithSize:(CGSize) size xScale:(CGFloat)xScale yScale:(CGFloat)yScale { 

    UIGraphicsBeginImageContext(size); 
    CGContextScaleCTM(UIGraphicsGetCurrentContext(), xScale, yScale); 

    // call the existing draw method  
    [self draw]; 

    UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return result; 
} 

Quindi aggiungere un metodo per ottenere una serie di immagini dalla matrice di MVPaintTransaction nella classe MVPaintDrawing:

- (NSArray *) getImagesFromDrawingOnSurface: (UIImageView *) surface xScale: (CGFloat) xScale yScale: (CGFloat) yScale{ 

    NSMutableArray *imageArray = [NSMutableArray new]; 
    for (MVPaintTransaction * transaction in _drawing) { 
     UIImage *image = [transaction imageToDrawWithSize:surface.frame.size xScale:xScale yScale:yScale]; 
     [imageArray addObject:image]; 
    } 

    return imageArray; 
} 

In questo modo avrai una matrice di UIImage corrispondente a ciascuna linea che hai disegnato. Se si vuole quelle immagini abbiano la dimensione possibile "minimo" (intendo senza Ergänzungstimme alfa), è possibile applicare this method (ho aggiunto nella classe MVPaintTransaction):

- (UIImage *)trimmedImage:(UIImage *)img { 

    CGImageRef inImage = img.CGImage; 
    CFDataRef m_DataRef; 
    m_DataRef = CGDataProviderCopyData(CGImageGetDataProvider(inImage)); 

    UInt8 * m_PixelBuf = (UInt8 *) CFDataGetBytePtr(m_DataRef); 

    size_t width = CGImageGetWidth(inImage); 
    size_t height = CGImageGetHeight(inImage); 

    CGPoint top,left,right,bottom; 

    BOOL breakOut = NO; 
    for (int x = 0;breakOut==NO && x < width; x++) { 
     for (int y = 0; y < height; y++) { 
      int loc = x + (y * width); 
      loc *= 4; 
      if (m_PixelBuf[loc + 3] != 0) { 
       left = CGPointMake(x, y); 
       breakOut = YES; 
       break; 
      } 
     } 
    } 

    breakOut = NO; 
    for (int y = 0;breakOut==NO && y < height; y++) { 

     for (int x = 0; x < width; x++) { 

      int loc = x + (y * width); 
      loc *= 4; 
      if (m_PixelBuf[loc + 3] != 0) { 
       top = CGPointMake(x, y); 
       breakOut = YES; 
       break; 
      } 

     } 
    } 

    breakOut = NO; 
    for (int y = height-1;breakOut==NO && y >= 0; y--) { 

     for (int x = width-1; x >= 0; x--) { 

      int loc = x + (y * width); 
      loc *= 4; 
      if (m_PixelBuf[loc + 3] != 0) { 
       bottom = CGPointMake(x, y); 
       breakOut = YES; 
       break; 
      } 

     } 
    } 

    breakOut = NO; 
    for (int x = width-1;breakOut==NO && x >= 0; x--) { 

     for (int y = height-1; y >= 0; y--) { 

      int loc = x + (y * width); 
      loc *= 4; 
      if (m_PixelBuf[loc + 3] != 0) { 
       right = CGPointMake(x, y); 
       breakOut = YES; 
       break; 
      } 

     } 
    } 


    CGFloat scale = img.scale; 

    CGRect cropRect = CGRectMake(left.x/scale, top.y/scale, (right.x - left.x)/scale, (bottom.y - top.y)/scale); 
    UIGraphicsBeginImageContextWithOptions(cropRect.size, 
              NO, 
              scale); 
    [img drawAtPoint:CGPointMake(-cropRect.origin.x, -cropRect.origin.y) 
      blendMode:kCGBlendModeCopy 
       alpha:1.]; 
    UIImage *croppedImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    CFRelease(m_DataRef); 
    return croppedImage; 
} 

Poi basta sostituire nel primo metodo :

return result; 

da

return [self trimmedImage:result]; 
+0

No, questo non funziona, ho provato il tuo codice –

+0

Beh, l'ho provato anche io prima di postare e se chiamo getImagesFromDrawingOnSurface, ottengo un array di UIImage (ciascuno l'immagine rappresenta una linea disegnata che è ciò che chiedi). Il mio codice non cambia il modo in cui le linee vengono visualizzate (per fare questo potresti aver bisogno di creare array di UIImageView per esempio). –