700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Android NV21与Bitmap相互转换 可实时添加水印

Android NV21与Bitmap相互转换 可实时添加水印

时间:2019-03-29 03:40:34

相关推荐

Android NV21与Bitmap相互转换 可实时添加水印

获取相机回调数据

@Overridepublic void onPreviewFrame(byte[] data, Camera camera) {//这里的data便是原始视频数据}

将视频数据转化为bitmap

public Bitmap nv21ToBitmap(byte[] nv21, int width, int height){if (yuvType == null){yuvType = new Type.Builder(renderScript, Element.U8(renderScript)).setX(nv21.length);in = Allocation.createTyped(renderScript, yuvType.create(), Allocation.USAGE_SCRIPT);rgbaType = new Type.Builder(renderScript, Element.RGBA_8888(renderScript)).setX(width).setY(height);out = Allocation.createTyped(renderScript, rgbaType.create(), Allocation.USAGE_SCRIPT);}in.copyFrom(nv21);yuvToRgbIntrinsic.setInput(in);yuvToRgbIntrinsic.forEach(out);Bitmap bmpout = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);out.copyTo(bmpout);return bmpout;}

在bitmap上写字(水印) 然后将bitmap转化为NV21数据推送出去

byte[] bitmapToNv21(int inputWidth, int inputHeight, Bitmap scaled) {int[] argb = new int[inputWidth * inputHeight];scaled.getPixels(argb, 0, inputWidth, 0, 0, inputWidth, inputHeight);byte[] yuv = new byte[inputWidth * inputHeight * 3 / 2];encodeYUV420SP(yuv, argb, inputWidth, inputHeight);scaled.recycle();return yuv;}public void encodeYUV420SP(byte[] yuv420sp, int[] argb, int width, int height) {final int frameSize = width * height;int yIndex = 0;int uvIndex = frameSize;int a, R, G, B, Y, U, V;int index = 0;for (int j = 0; j < height; j++) {for (int i = 0; i < width; i++) {a = (argb[index] & 0xff000000) >> 24; // a is not used obviouslyR = (argb[index] & 0xff0000) >> 16;G = (argb[index] & 0xff00) >> 8;B = (argb[index] & 0xff) >> 0;// well known RGB to YUV algorithmY = ( ( 66 * R + 129 * G + 25 * B + 128) >> 8) + 16;U = ( ( -38 * R - 74 * G + 112 * B + 128) >> 8) + 128;V = ( ( 112 * R - 94 * G - 18 * B + 128) >> 8) + 128;// NV21 has a plane of Y and interleaved planes of VU each sampled by a factor of 2// meaning for every 4 Y pixels there are 1 V and 1 U. Note the sampling is every other// pixel AND every other scanline.yuv420sp[yIndex++] = (byte) ((Y < 0) ? 0 : ((Y > 255) ? 255 : Y));if (j % 2 == 0 && index % 2 == 0) {yuv420sp[uvIndex++] = (byte)((V<0) ? 0 : ((V > 255) ? 255 : V));yuv420sp[uvIndex++] = (byte)((U<0) ? 0 : ((U > 255) ? 255 : U));}index ++;}}}//处理private byte[] parseByte(byte[] dst) {Bitmap bitmapAll = nv21ToBitmap(dst, mVideoParameters.width, mVideoParameters.height);Bitmap bitmapAllNew=bitmapAll.copy(Bitmap.Config.ARGB_8888,true);Canvas canvas = new Canvas(bitmapAllNew);Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);paint.setColor(Color.WHITE);paint.setTextSize(30);canvas.drawText(name, mVideoParameters.width/2 -40, 60, paint);byte[] newBytes = bitmapToNv21(mVideoParameters.width, mVideoParameters.height,bitmapAllNew);if(newBytes!=null){return newBytes;}else{return null;}}

结束!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。