在OpenGL中對(duì)于大長(zhǎng)腿的實(shí)現(xiàn)相當(dāng)于對(duì)圖片部分區(qū)域做拉伸嗡髓,然后緩存成在幀緩沖區(qū)作為下一次操作的原始圖片隅茎,從而達(dá)到多重修改的目的干发,而真正的原圖本身沒(méi)有發(fā)生改變实胸。
現(xiàn)在來(lái)一步步分析:
第一步初始化基本組件翅帜;
第二步是區(qū)域劃分姻檀,頂點(diǎn)坐標(biāo)和紋理坐標(biāo)的對(duì)應(yīng),下一次繪制都是需要重新對(duì)應(yīng)涝滴;
第三步拉伸和顯示 baseEffect做圖像處理后的展示绣版;
第四步圖片獲取存取(頂點(diǎn)坐標(biāo)和紋理坐標(biāo)->GLSL繪制圖片->幀緩沖區(qū)->紋理/新圖片 濾鏡鏈)當(dāng)次處理的結(jié)果歼疮,作為下一次處理的原始圖片杂抽;
重點(diǎn)方法解析:
?GLuintframeBuffer;
? GLuinttexture;
? glGenFramebuffers(1, &frameBuffer);//glGenFramebuffers 生成幀緩存區(qū)對(duì)象名稱;
? glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);//glBindFramebuffer 綁定一個(gè)幀緩存區(qū)對(duì)象;
glFramebufferTexture2D 紋理圖片加載幀緩存區(qū)
生成幀緩沖區(qū)后保存臨時(shí)的紋理對(duì)象/幀緩存區(qū)對(duì)象;
? self.tmpTexture= texture;
? self.tmpFrameBuffer= frameBuffer;
從幀緩沖區(qū)中獲取圖片
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);//讀取像素
?CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer, size, NULL);//使用data和size 數(shù)組來(lái)訪問(wèn)buffer數(shù)據(jù)
?CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();//顏色空間格式;
?CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;//位圖圖形的組件信息 - 默認(rèn)的
?CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;//顏色映射
?CGImageRefimageRef =CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider,NULL,NO, renderingIntent);//將幀緩存區(qū)里像素點(diǎn)繪制到一張圖片上
//. 此時(shí)的 imageRef 是上下顛倒的,調(diào)用 CG 的方法重新繪制一遍韩脏,剛好翻轉(zhuǎn)過(guò)來(lái)
?UIGraphicsBeginImageContext(CGSizeMake(width, height));?//創(chuàng)建一個(gè)圖片context
? CGContextRef context = UIGraphicsGetCurrentContext();
? CGContextDrawImage(context,CGRectMake(0,0, width, height), imageRef);//將圖片繪制上去
? UIImage *image = UIGraphicsGetImageFromCurrentImageContext();//從context中獲取圖片
? UIGraphicsEndImageContext();?//結(jié)束圖片context處理
UIImageWriteToSavedPhotosAlbum(image,self,@selector(image:didFinishSavingWithError:contextInfo:),nil);//保存圖片