前言
在graphics包下的Matrix是一個3x3的矩陣,按網(wǎng)上的的圖是這樣的
??MSCALE_X, MSCALE_Y表示縮放;
?MSKEW_X, MSKEW_Y表示錯切,與上面兩個參數(shù)一起達到圖像旋轉(zhuǎn)效果;
MTRANS_X, MTRANS_Y表示平移;
?MPERSP_0, MPERSP_1表示透視;
MPERSP_2固定為1。
在把圖像矩陣應(yīng)用到OpenGL中時遇到了問題:glsl中獲取到的矩陣是歸一化的,需要先把原來的矩陣進行歸一化處理。
推導(dǎo)過程
按照矩陣乘法規(guī)則
如果考慮到透視變換,則最終的坐標(biāo)X=x/z, Y=y/z;
設(shè)顯示目標(biāo)的尺寸為Tw,Th,歸一化的坐標(biāo)則是x1=X/Tw, y1=Y/Th;
? ............①
?? ?............②
設(shè)圖像原始寬高為w,h,歸一化的矩陣為
那么,參照上面的等式,有
同樣,考慮到透視變換,最終的歸一化的坐標(biāo)x1,y1為
? ............③
?? ............④
①③聯(lián)立并化簡可得到
上式的每一項均為0,才能保證結(jié)果一定為0,因此有
? (1)? ???(2)? ??(3)
? (4)
? (5)
? (6)
同理,②④聯(lián)立可得
? (7)??? (8)??? (9)
理論上(1)-(9)共9個方程,b0-b8共9個未知數(shù),可以解方程,但其實a8=b8=1,所以上述方程組可以化簡,最終結(jié)果是文章來源:http://www.zghlxwxcb.cn/news/detail-422028.html
有興趣的朋友可以推導(dǎo)驗證一下。文章來源地址http://www.zghlxwxcb.cn/news/detail-422028.html
代碼實現(xiàn)
/**
* 圖像縮放矩陣歸一化
*
* @param src 圖像裁剪及縮放矩陣,length=9
* @param width 圖像原寬度
* @param height 圖像原高度
* @param targetWidth 目標(biāo)圖像寬度,即顯示的圖像寬度,如100像素的寬度拉伸顯示在300像素的View中,則應(yīng)為100
* @param targetHeight 目標(biāo)圖像高度,即顯示的圖像高度
*/
public static float[] normalize(float[] src, int width, int height, int targetWidth, int targetHeight) {
float[] values = new float[9];
values[Matrix.MSCALE_X] = src[0] * width / targetWidth;
values[Matrix.MSKEW_X] = src[1] * height / targetWidth;
values[Matrix.MTRANS_X] = src[2] / targetWidth;
values[Matrix.MSKEW_Y] = src[3] * width / targetHeight;
values[Matrix.MSCALE_Y] = src[4] * height / targetHeight;
values[Matrix.MTRANS_Y] = src[5] / targetHeight;
values[Matrix.MPERSP_0] = src[6] * width;
values[Matrix.MPERSP_1] = src[7] * height;
values[Matrix.MPERSP_2] = src[8];
return values;
}
到了這里,關(guān)于Android中的圖像矩陣歸一化的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!