1、png图片转换成ayuv图像
Bitmap logoBitmap = BitmapFactory.decodeResource(context.getResources(), logoResId, null);
if(logoBitmap != null){
int width = logoBitmap.getWidth();
int height = logoBitmap.getHeight();
mLogoWidth = width;
mLogoHeight = height;
int pixels[] = new int[width * height];
logoBitmap.getPixels(pixels, 0, width, 0, 0, width, height);
mLogoAYuv = new byte[width * height * 4];
int a = 0;
int r = 0, g = 0, b = 0;
int R ,G, B;
int k = 0;
int y, u, v;
for(int i = 0; i < height; i++){
for(int j = 0; j < width; j++){
//Y = 0.299R + 0.587G + 0.114B;
//U = -0.147R - 0.289G + 0.436B;
//V = 0.615R - 0.515G - 0.100B;
a = ((pixels[i*width + j] & 0xff000000) >> 24);
r = ((pixels[i*width + j] & 0x00ff0000)>>16);
g = ((pixels[i*width + j] & 0xff00)>>8);
b = ((pixels[i*width + j] & 0xff));
B = b;
G = g;
R = r;
y = (int)(0.299*r + 0.587*g + 0.114*b);
u = (int)(-0.1684*r - 0.3316*g + 0.5*b + 128);
v = (int)(0.5*r - 0.4187*g - 0.0813*b + 128);
mLogoAYuv[k++] = (byte)a;
mLogoAYuv[k++] = (byte) y;
mLogoAYuv[k++] = (byte) u;
mLogoAYuv[k++] = (byte) v;
}
}
mInit = true;
logoBitmap.recycle();
}
2、ayuv图像与yuv12图像合成
/**
* yuv12 图像合成水印
* @param env
* @param obj
* @param srcFrameArray yuv12 图像
* @param srcFrameWidth yuv12图像宽
* @param srcFrameHeight yuv12图像高
* @param imageWaterMarkFrameArray 水印图像数据
* @param imageWidth 水印图像宽
* @param imageHeight 水印图像高
* @param x 合成图像中水印的x坐标
* @param y 合成图像中水印的y坐标
*/
static void com_android_driving_WaterMark_ImageComposite(JNIEnv *env, jobject obj, jbyteArray srcFrameArray, jint srcFrameWidth, jint srcFrameHeight,
jbyteArray imageWaterMarkFrameArray, jint imageWidth, jint imageHeight, jint startX, jint startY){
jbyte* pSrcFrame = (jbyte*) env->GetByteArrayElements(srcFrameArray, NULL);
jbyte* pImageWaterMarkFrame = (jbyte*) env->GetByteArrayElements(imageWaterMarkFrameArray, NULL);
int k = 0;
unsigned char y0 = 0;
unsigned char u0 = 0;
unsigned char v0 = 0;
unsigned char alpha = 0;
unsigned char y1 = 0;
unsigned char u1 = 0;
unsigned char v1 = 0;
int compositePosY = 0;
int compositePosV = 0;
int compositePosU = 0;
int maxY = startY + imageHeight;
int maxX = startX + imageWidth;
int srcYTotalSize = srcFrameWidth * srcFrameHeight;
int srcVTotalSize = srcYTotalSize / 4;
int imageLineBytes = imageWidth * 4;
for(int i = startY ; i < maxY; i = i+2){
for(int j = startX; j < maxX; j = j+2){
alpha = pImageWaterMarkFrame[k];
y0 = pImageWaterMarkFrame[k+1];
u0 = pImageWaterMarkFrame[k+2];
v0 = pImageWaterMarkFrame[k+3];
compositePosY = i * srcFrameWidth + j;
compositePosV = srcYTotalSize + (srcFrameWidth / 2) * (i /2) + j / 2;
compositePosU = compositePosV + srcVTotalSize;
y1 = pSrcFrame[compositePosY];
v1 = pSrcFrame[compositePosV];
u1 = pSrcFrame[compositePosU];
//第一排第一个点
pSrcFrame[compositePosY] = ( y0 * alpha + y1 * ( 255 - alpha ) ) / 255;
pSrcFrame[compositePosV] = ( v0 * alpha + v1 * ( 255 - alpha ) ) / 255;
pSrcFrame[compositePosU] = ( u0 * alpha + u1 * ( 255 - alpha ) ) / 255;
//第一排第二个点
alpha = pImageWaterMarkFrame[k+ 4];
y0 = pImageWaterMarkFrame[k+ 5];
y1 = pSrcFrame[compositePosY+1];
pSrcFrame[compositePosY+1] = ( y0 * alpha + y1 * ( 255 - alpha ) ) / 255;
//第二排第一个点
alpha = pImageWaterMarkFrame[k+ imageLineBytes];
y0 = pImageWaterMarkFrame[k+ 1 + imageLineBytes];
y1 = pSrcFrame[compositePosY+srcFrameWidth];
pSrcFrame[compositePosY+srcFrameWidth] = ( y0 * alpha + y1 * ( 255 - alpha ) ) / 255;
//第二排第二个点
alpha = pImageWaterMarkFrame[k + 4 + imageLineBytes];
y0 = pImageWaterMarkFrame[k + 5 + imageLineBytes];
y1 = pSrcFrame[compositePosY + srcFrameWidth + 1];
pSrcFrame[compositePosY+srcFrameWidth + 1] = ( y0 * alpha + y1 * ( 255 - alpha ) ) / 255;
k += 8;
}
k += imageLineBytes;
}
env->ReleaseByteArrayElements(srcFrameArray, pSrcFrame, JNI_ABORT);
env->ReleaseByteArrayElements(imageWaterMarkFrameArray, pImageWaterMarkFrame, JNI_ABORT);
}