GLPaint save image

后端 未结 5 1260
南笙
南笙 2021-01-31 23:39

I\'m trying to develop a complex painting application on the iPhone. I\'m currently drawing using Quartz (e.g. CGContext...). Unfortunately the Quartz overhead is

5条回答
  •  隐瞒了意图╮
    2021-02-01 00:22

    This code will not leak memory like the above solution and accounts for dynamic view size as well as retina vs standard displays:

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

    The others leak memory because the last parameter to CGDataProviderCreateWithData is supposed to be a function to free memory, and they also leave out the CGRelease functions.

提交回复
热议问题