Skip to content
This repository was archived by the owner on Nov 4, 2023. It is now read-only.

Conversation

@skn3
Copy link

@skn3 skn3 commented Jan 30, 2014

Added two methods to the monkey Image class so module developers can have more access to images.
GetSurface() just returns the images surface object
GetSurfaceRegion(frame:int=0) returns the x,y,width,height the image/frame takes up in the images surface.

These two are very useful methods and I have used for for stuff like saving images to photo gallery on iOS. For example I could convert a monkey image to UIImage with something like:

Local region := image.GetSurfaceRegion()
SaveNativeFunction(image.GetSurface(), region[0],region[1],region[2],region[3],"blah.png")
//allocate read in array
NSInteger dataLength = surfaceWidth * surfaceHeight * 4;
GLubyte *buffer = (GLubyte *) malloc(dataLength);

//remember old frame buffer
GLint oldFrameBuffer;
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldFrameBuffer);

//setup temp frame buffer
GLuint frameBuffer;
glGenFramebuffers(1, &frameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, surface->texture, 0);

glViewport(surfaceX, surfaceY, surfaceWidth, surfaceHeight);
glReadPixels(surfaceX, surfaceY, surfaceWidth, surfaceHeight, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

//restore frame buffer
glBindFramebuffer(GL_FRAMEBUFFER, oldFrameBuffer);

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

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

//make the cgimage
CGImageRef imageRef = CGImageCreate(surfaceWidth, surfaceHeight, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);

//make the uiimage
UIImage *image = [UIImage imageWithCGImage:imageRef];

//free it
CGImageRelease(imageRef);
CGColorSpaceRelease(colorSpaceRef);
CGDataProviderRelease(provider);
free(buffer);

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant