本文是針對(duì)NV21格式圖片進(jìn)行橫/豎屏拼圖
NV21:YVU排列喝峦,vu交錯(cuò)排列谣蠢,vu高度是y的一半眉踱,y占得字節(jié)數(shù)是width*height,剩下的字節(jié)數(shù)都是vu
為了更形象的展示,以4*4圖片為例子:
image.png
豎屏拼圖后是
image.png
橫屏拼圖后是
image.png
豎屏拼圖
首先進(jìn)行全部Y分量的交錯(cuò)填充谈宛,然后全部VU分量交錯(cuò)填充
橫屏拼圖
先是Y分量一行一行拼接吆录,然后再vu一行一行拼接
具體代碼如下:
private int width=640;
private int height=480;
private byte[] dataIr_y=new byte[width*height];
private byte[] dataRgb_y=new byte[width*height];
private byte[] dataIr_vu=new byte[width*height/2];
private byte[] dataRgb_vu=new byte[width*height/2];
private byte[] mergeData=new byte[width*height*3];
//豎屏拼接
private byte[] concat(byte[] data1, byte[] data2) {
System.arraycopy(data1, 0, dataIr_y, 0, dataIr_y.length);
System.arraycopy(data2, 0, dataRgb_y, 0, dataRgb_y.length);
System.arraycopy(data1,dataIr_y.length,dataIr_vu,0,dataIr_vu.length);
System.arraycopy(data2,dataRgb_y.length,dataRgb_vu,0,dataRgb_vu.length);
//y拼接
System.arraycopy(dataIr_y, 0, mergeData, 0, dataIr_y.length);
System.arraycopy(dataRgb_y,0, mergeData, dataRgb_y.length, dataRgb_y.length);
//vu拼接
System.arraycopy(dataIr_vu, 0, mergeData, dataIr_y.length+dataRgb_y.length, dataIr_vu.length);
System.arraycopy(dataRgb_vu, 0, mergeData, dataIr_y.length+data1.length, dataRgb_vu.length);
return mergeData;
}
//橫屏拼圖代碼
private byte[] concat(byte[] data1, byte[] data2) {
System.arraycopy(data1, 0, dataIr_y, 0, dataIr_y.length);
System.arraycopy(data2, 0, dataRgb_y, 0, dataRgb_y.length);
System.arraycopy(data1, dataIr_y.length, dataIr_vu, 0, data1.length - dataIr_y.length);
System.arraycopy(data2, dataRgb_y.length, dataRgb_vu, 0, data2.length - dataRgb_y.length);
//y分量一行一行拼接
int y = 0;
for (int i = 0; i < height; i++) {
System.arraycopy(dataIr_y, width * i, mergeData, width * y, width);
y++;
System.arraycopy(dataRgb_y, width * i, mergeData, width * y, width);
y++;
}
//vu分量一行一行拼接
int z = 0;
for (int i = 0; i < height / 2; i++) {
System.arraycopy(dataIr_vu, width * i, mergeData, width * height * 2 + z * width, width);
z++;
System.arraycopy(dataRgb_vu, width * i, mergeData, width * height * 2 + z * width, width);
z++;
}
return mergeData;
}