gpuimagerawdataoutput
gpuimagerawdataoutput實現了gpuimageinput協議,它可以將輸入的幀快取轉換為原始資料。
- (id)initwithimagesize:(cgsize)newimagesize resultsinbgraformat:(bool)resultsinbgraformat;
- (id)initwithimagesize:(cgsize)newimagesize resultsinbgraformat:(bool)resultsinbgraformat;
self
.enabled = yes;
locknextframebuffer = no;
outputbgra = resultsinbgraformat;
imagesize = newimagesize;
hasreadfromthecurrentframe = no;
_rawbytesforimage = null;
inputrotation = kgpuimagenorotation;
[gpuimagecontext useimageprocessingcontext];
// 如果使用了bgra ,則選擇kgpuimagecolorswizzlingfragmentshaderstring著色器
if ( (outputbgra && ![gpuimagecontext supportsfasttextureupload]) || (!outputbgra && [gpuimagecontext supportsfasttextureupload]) )
// 否則選用kgpuimagepassthroughfragmentshaderstring著色器
else
if (!dataprogram.initialized)
}// 獲取統一變數和屬性
datapositionattribute = [dataprogram attributeindex:@"position"];
datatexturecoordinateattribute = [dataprogram attributeindex:@"inputtexturecoordinate"];
datainputtextureuniform = [dataprogram uniformindex:@"inputimagetexture"];
return
self;
}
// data access
// 獲取特定位置的畫素向量
- (gpubytecolorvector)coloratlocation:(cgpoint)locationinimage;
// 每行資料大小
- (nsuinteger)bytesperrowinoutput;
// 設定紋理大小
- (void)setimagesize:(cgsize)newimagesize;
// 鎖定、與解鎖幀快取
- (void)lockframebufferforreading;
- (void)unlockframebufferafterreading;
// 獲取特定位置的畫素向量
- (gpubytecolorvector)coloratlocation:(cgpoint)locationinimage;
// nslog(@"row end");
// gpubytecolorvector byteatone = imagecolorbytes[1];
// gpubytecolorvector byteatwidth = imagecolorbytes[(int)imagesize.width - 3];
// gpubytecolorvector byteatheight = imagecolorbytes[(int)(imagesize.height - 1) * (int)imagesize.width];
// nslog(@"byte 1: %d, %d, %d, byte 2: %d, %d, %d, byte 3: %d, %d, %d", byteatone.red, byteatone.green, byteatone.blue, byteatwidth.red, byteatwidth.green, byteatwidth.blue, byteatheight.red, byteatheight.green, byteatheight.blue);
// 控制邊界,0 < x < width, 0 < y < height,
cgpoint locationtopickfrom = cgpointzero;
locationtopickfrom.x = min(max(locationinimage.x, 0.0), (imagesize.width - 1.0));
locationtopickfrom.y = min(max((imagesize.height - locationinimage.y), 0.0), (imagesize.height - 1.0));
// 如果是bgra輸出,則把rgba資料轉為bgra資料
if (outputbgra)
else
}// 每行資料大小
- (nsuinteger)bytesperrowinoutput;
// 設定輸出紋理大小
- (void)setimagesize:(cgsize)newimagesize
}// 鎖定幀快取
- (void)lockframebufferforreading;
// 解鎖幀快取
- (void)unlockframebufferafterreading;
// 獲取rgba資料
- (glubyte *)rawbytesforimage;
if (hasreadfromthecurrentframe)
else
else
hasreadfromthecurrentframe = yes;
});return _rawbytesforimage;
}}
GPUImage原始碼解讀 五
從cache中獲取乙個gpuimageframebuffer物件,如果獲取失敗,那麼建立乙個新的gpuimageframebuffer物件。param framebuffersize 物件的大小 param textureoptions 紋理的配置資訊 param onlytexture 指示是否只...
GPUImage原始碼解讀 二
這篇文章主要是閱讀gpuimage框架中的 glprogram gpuimagecontext 兩個重要類的原始碼。這兩個類是 gpuimage 框架的基礎,裡面涉及的知識也有 opengl es 基礎 和 多執行緒 基礎。以下是原始碼內容 glprogram 一 glprogram glprogr...
openTLD 原始碼解讀
首先是run tld 在其次就是tldexample 最後到了初始化函式tldinit 第乙個比較關鍵的函式 bb scan 將影象網格化,將首先 scale 1.2.10 10 21 個規格 在每個規格上打網格 這個函式有乙個比較重要的方法 ntuples 就是重複 因為網格上的點很多點有相同的x...