在OpenGL的環境下把畫面存圖片 Code Snippet


在glpaint裡要把畫面存成照片需要加入以下的程式碼。


void ProviderReleaseData ( void *info, const void *data, size_t size ) {

free((void*)data);
}



-(UIImage*) upsideDownImageRepresenation{

int imageWidth = CGRectGetWidth([self bounds]);
int imageHeight = CGRectGetHeight([self bounds]);
//image buffer for export
NSInteger myDataLength = imageWidth* imageHeight * 4;
// allocate array and read pixels into it.
GLubyte *tempImagebuffer = (GLubyte *) malloc(myDataLength);
    
    glReadPixels(0, 0, imageWidth, imageHeight, GL_RGBA, GL_UNSIGNED_BYTE, tempImagebuffer);
// make data provider with data.
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, tempImagebuffer, myDataLength, ProviderReleaseData);
// 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);
// then make the uiimage from that
UIImage *myImage =  [UIImage imageWithCGImage:imageRef] ;
CGDataProviderRelease(provider);
CGImageRelease(imageRef);
CGColorSpaceRelease(colorSpaceRef);
    
    //make sure it is in the autorelease pool
[[myImage retain] autorelease];
    return myImage;
}




-(UIImage*) imageRepresentation{
UIImageView* upsideDownImageView=[[UIImageView alloc] initWithImage: [self upsideDownImageRepresenation]];
    
upsideDownImageView.transform=CGAffineTransformScale(upsideDownImageView.transform, 1, -1);
UIView* container=[[UIView alloc] initWithFrame:upsideDownImageView.frame];
[container addSubview:upsideDownImageView];
UIImage* toReturn=nil;
    
UIGraphicsBeginImageContext(container.frame.size);
[container.layer renderInContext:UIGraphicsGetCurrentContext()];
toReturn = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[upsideDownImageView release];
[container release];
     return toReturn;
}




設定存檔按鈕
-(void) saveImage{

    UIImageWriteToSavedPhotosAlbum([drawingView imageRepresentation], self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}

留言

這個網誌中的熱門文章

[心得] 圖解 微分、積分生活中的微積分-第一章

Objective-C的數學運算函式

c# 把List中重復的資料去掉