andoird PNG 图片与yuv12图像合成

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值