2012-03-11 1 views
5

Attualmente sto lavorando con un'applicazione di disegno basata su GLpaint. Salvare lo schermo corrente diventa un dolore frenetico per me. Ho un ViewController, nella parte superiore del controller di visualizzazione ho caricato il mio UIIMageView e UIView (PaintingView). Ora sembra che sto disegnando sulla parte superiore di UIImageView.GLPaint Salva funzione (Salva la schermata corrente con l'immagine di sfondo)

Sono riuscito a ottenere il mio disegno corrente con questa domanda GLPaint save image. Quando cerco di catturare il mio disegno corrente ottengo il mio disegno ma con uno schermo nero. Quello che desideravo è il mio disegno con l'immagine di sfondo (UIImageView). Dovrei sovrapporre l'UIView con UIImageView?

risposta

2

È necessario caricare l'immagine utilizzando OpenGL, non UIKit (come UIImageView). In caso contrario, sarà possibile acquisire OpenGLView come immagine singola e Vista UIKit come immagine diversa.

Per fare ciò, è necessario eseguire il rendering dell'immagine in una Texture nella classe PaintingView fornita in GLpaint example e quindi caricarla tracciando un quadratino sulla vista del disegno.

0

Io uso questo codice per afferrare la mia immagine da OpenGL:

-(BOOL)iPhoneRetina{ 
    return ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))?YES:NO; 
} 

void releasePixels(void *info, const void *data, size_t size) { 
    free((void*)data); 
} 

-(UIImage *) glToUIImage{ 

    int imageWidth, imageHeight; 

    int scale = [self iPhoneRetina]?2:1; 

    imageWidth = self.frame.size.width*scale; 
    imageHeight = self.frame.size.height*scale; 

    NSInteger myDataLength = imageWidth * imageHeight * 4; 

    // allocate array and read pixels into it. 
    GLubyte *buffer = (GLubyte *) malloc(myDataLength); 
    glReadPixels(0, 0, imageWidth, imageHeight, GL_RGBA, GL_UNSIGNED_BYTE, buffer); 

    // make data provider with data. 
    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer, myDataLength, releasePixels); 

    // prep the ingredients 
    int bitsPerComponent = 8; 
    int bitsPerPixel = 32; 
    int bytesPerRow = 4 * imageWidth; 
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB(); 
    CGBitmapInfo bitmapInfo = kCGImageAlphaPremultipliedLast; 
    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault; 

    // make the cgimage 

    CGImageRef imageRef = CGImageCreate(imageWidth, imageHeight, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent); 

    UIImage *myImage = [UIImage imageWithCGImage:imageRef scale:scale orientation:UIImageOrientationDownMirrored]; //Render image flipped, since OpenGL's data is mirrored 

    CGImageRelease(imageRef); 
    CGColorSpaceRelease(colorSpaceRef); 

    CGDataProviderRelease(provider); 

    return myImage; 
} 

E questo per unire un'immagine di sfondo con:

-(UIImage*)mergeImage:(UIImage*)image1 withImage:(UIImage*)image2{ 

    CGSize size = image1.size; 

    UIGraphicsBeginImageContextWithOptions(size, NO, 0); 

    [image1 drawAtPoint:CGPointMake(0.0f, 0.0f)]; 
    [image2 drawAtPoint:CGPointMake(0.0f, 0.0f)]; 

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

    return result; 
} 

Qualcosa di simile a questo:

finalImage = [self mergeImage: BackgroundImage withImage [self glToUIImage]];