Функция сохранения GLPaint (Сохранить текущий экран с фоновым изображением) - PullRequest
5 голосов
/ 12 марта 2012

В настоящее время я работаю с приложением для рисования на основе GLpaint. Сохранение текущего экрана становится беспокойной болью для меня. У меня есть ViewController, в верхней части контроллера представления я загрузил мой UIIMageView и UIView (PaintingView). Теперь кажется, что я рисую на вершине UIImageView.

Мне удалось получить мой текущий рисунок с этим вопросом GLPaint сохранить изображение . Когда я пытаюсь захватить мой текущий рисунок, я получаю свой рисунок, но с черным экраном. Что я хотел, так это мой рисунок с фоновым изображением (UIImageView). Должен ли я наложить UIView с UIImageView?

Ответы [ 2 ]

2 голосов
/ 05 декабря 2013

Вы должны загрузить свое изображение, используя OpenGL, а не UIKit (как UIImageView).В противном случае вы сможете захватывать только OpenGLView как отдельное изображение, а также UIKit View как другое изображение.

Чтобы сделать это, вы должны отобразить изображение в текстуре в классе PaintingViewпредоставляется в примере GLpaint, а затем загружает его, рисуя четырехугольник поверх вашего чертежного вида.

0 голосов
/ 30 января 2014

Я использую этот код, чтобы получить мое изображение из 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;
}

И этот, чтобы объединить его с фоновым изображением:

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

Примерно так:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...