zoukankan      html  css  js  c++  java
  • ffmpeg开发系列-YUV转RGB

    常用YUV转RGB java代码
    
    
    public class YuvToRGB {
    	private static int R = 0;
    	private static int G = 1;
    	private static int B = 2;
    	//I420是yuv420格式,是3个plane,排列方式为(Y)(U)(V)
    	public static int[] I420ToRGB(byte[] src, int width, int height){
    		int numOfPixel = width * height;
    		int positionOfV = numOfPixel;
    		int positionOfU = numOfPixel/4 + numOfPixel;
    		int[] rgb = new int[numOfPixel*3];
    		for(int i=0; i<height; i++){
    			int startY = i*width;
    			int step = (i/2)*(width/2);
    			int startU = positionOfV + step;
    			int startV = positionOfU + step;
    			for(int j = 0; j < width; j++){
    				int Y = startY + j;
    				int U = startU + j/2;
    				int V = startV + j/2;
    				int index = Y*3;
    				RGB tmp = yuvTorgb(src[Y], src[U], src[V]);
    				rgb[index+R] = tmp.r;
    				rgb[index+G] = tmp.g;
    				rgb[index+B] = tmp.b;
    			}
    		}
    		
    		return rgb;
    	}
    	
    	private static class RGB{
    		public int r, g, b;
    	}
    	
    	private static RGB yuvTorgb(byte Y, byte U, byte V){
    		RGB rgb = new RGB();
    		rgb.r = (int)((Y&0xff) + 1.4075 * ((V&0xff)-128));
    		rgb.g = (int)((Y&0xff) - 0.3455 * ((U&0xff)-128) - 0.7169*((V&0xff)-128));
    		rgb.b = (int)((Y&0xff) + 1.779 * ((U&0xff)-128));
    		rgb.r =(rgb.r<0? 0: rgb.r>255? 255 : rgb.r);
    		rgb.g =(rgb.g<0? 0: rgb.g>255? 255 : rgb.g);
    		rgb.b =(rgb.b<0? 0: rgb.b>255? 255 : rgb.b);
    		return rgb;
    	}
    	
    	//YV16是yuv422格式,是三个plane,(Y)(U)(V)
    	public static int[] YV16ToRGB(byte[] src, int width, int height){
    		int numOfPixel = width * height;
    		int positionOfU = numOfPixel;
    		int positionOfV = numOfPixel/2 + numOfPixel;
    		int[] rgb = new int[numOfPixel*3];
    		for(int i=0; i<height; i++){
    			int startY = i*width;
    			int step = i*width/2;
    			int startU = positionOfU + step;
    			int startV = positionOfV + step;
    			for(int j = 0; j < width; j++){
    				int Y = startY + j;
    				int U = startU + j/2;
    				int V = startV + j/2;
    				int index = Y*3;
    				//rgb[index+R] = (int)((src[Y]&0xff) + 1.4075 * ((src[V]&0xff)-128));
    				//rgb[index+G] = (int)((src[Y]&0xff) - 0.3455 * ((src[U]&0xff)-128) - 0.7169*((src[V]&0xff)-128));
    				//rgb[index+B] = (int)((src[Y]&0xff) + 1.779 * ((src[U]&0xff)-128));
    				RGB tmp = yuvTorgb(src[Y], src[U], src[V]);
    				rgb[index+R] = tmp.r;
    				rgb[index+G] = tmp.g;
    				rgb[index+B] = tmp.b;
    			}
    		}
    		return rgb;
    	}
    	
    	//YV12是yuv420格式,是3个plane,排列方式为(Y)(V)(U)
    	public static int[] YV12ToRGB(byte[] src, int width, int height){
    		int numOfPixel = width * height;
    		int positionOfV = numOfPixel;
    		int positionOfU = numOfPixel/4 + numOfPixel;
    		int[] rgb = new int[numOfPixel*3];
    
    		for(int i=0; i<height; i++){
    			int startY = i*width;
    			int step = (i/2)*(width/2);
    			int startV = positionOfV + step;
    			int startU = positionOfU + step;
    			for(int j = 0; j < width; j++){
    				int Y = startY + j;
    				int V = startV + j/2;
    				int U = startU + j/2;
    				int index = Y*3;
    				
    				//rgb[index+R] = (int)((src[Y]&0xff) + 1.4075 * ((src[V]&0xff)-128));
    				//rgb[index+G] = (int)((src[Y]&0xff) - 0.3455 * ((src[U]&0xff)-128) - 0.7169*((src[V]&0xff)-128));
    				//rgb[index+B] = (int)((src[Y]&0xff) + 1.779 * ((src[U]&0xff)-128));
    				RGB tmp = yuvTorgb(src[Y], src[U], src[V]);
    				rgb[index+R] = tmp.r;
    				rgb[index+G] = tmp.g;
    				rgb[index+B] = tmp.b;
    			}
    		}
    		return rgb;
    	}
    	
    	//YUY2是YUV422格式,排列是(YUYV),是1 plane
    	public static int[] YUY2ToRGB(byte[] src, int width, int height){
    		int numOfPixel = width * height;
    		int[] rgb = new int[numOfPixel*3];
    		int lineWidth = 2*width;
    		for(int i=0; i<height; i++){
    			int startY = i*lineWidth;
    			for(int j = 0; j < lineWidth; j+=4){
    				int Y1 = j + startY;
    				int Y2 = Y1+2;
    				int U = Y1+1;
    				int V = Y1+3;
    				int index = (Y1>>1)*3;
    				RGB tmp = yuvTorgb(src[Y1], src[U], src[V]);
    				rgb[index+R] = tmp.r;
    				rgb[index+G] = tmp.g;
    				rgb[index+B] = tmp.b;
    				index += 3;
    				tmp = yuvTorgb(src[Y2], src[U], src[V]);
    				rgb[index+R] = tmp.r;
    				rgb[index+G] = tmp.g;
    				rgb[index+B] = tmp.b;
    			}
    		}
    		return rgb;
    	}
    	
    	//UYVY是YUV422格式,排列是(UYVY),是1 plane
    	public static int[] UYVYToRGB(byte[] src, int width, int height){
    		int numOfPixel = width * height;
    		int[] rgb = new int[numOfPixel*3];
    		int lineWidth = 2*width;
    		for(int i=0; i<height; i++){
    			int startU = i*lineWidth;
    			for(int j = 0; j < lineWidth; j+=4){
    				int U = j + startU;
    				int Y1 = U+1;
    				int Y2 = U+3;
    				int V = U+2;
    				int index = (U>>1)*3;
    				RGB tmp = yuvTorgb(src[Y1], src[U], src[V]);
    				rgb[index+R] = tmp.r;
    				rgb[index+G] = tmp.g;
    				rgb[index+B] = tmp.b;
    				index += 3;
    				tmp = yuvTorgb(src[Y2], src[U], src[V]);
    				rgb[index+R] = tmp.r;
    				rgb[index+G] = tmp.g;
    				rgb[index+B] = tmp.b;
    			}
    		}
    		return rgb;
    	}
    	
    	//NV21是YUV420格式,排列是(Y), (VU),是2 plane
    	public static int[] NV21ToRGB(byte[] src, int width, int height){
    		int numOfPixel = width * height;
    		int positionOfV = numOfPixel;
    		int[] rgb = new int[numOfPixel*3];
    
    		for(int i=0; i<height; i++){
    			int startY = i*width;
    			int step = i/2*width;
    			int startV = positionOfV + step;
    			for(int j = 0; j < width; j++){
    				int Y = startY + j;
    				int V = startV + j/2;
    				int U = V + 1;
    				int index = Y*3;
    				RGB tmp = yuvTorgb(src[Y], src[U], src[V]);
    				rgb[index+R] = tmp.r;
    				rgb[index+G] = tmp.g;
    				rgb[index+B] = tmp.b;
    			}
    		}
    		return rgb;
    	}
    	
    	//NV12是YUV420格式,排列是(Y), (UV),是2 plane
    	public static int[] NV12ToRGB(byte[] src, int width, int height){
    		int numOfPixel = width * height;
    		int positionOfU = numOfPixel;
    		int[] rgb = new int[numOfPixel*3];
    
    		for(int i=0; i<height; i++){
    			int startY = i*width;
    			int step = i/2*width;
    			int startU = positionOfU + step;
    			for(int j = 0; j < width; j++){
    				int Y = startY + j;
    				int U = startU + j/2;
    				int V = U + 1;
    				int index = Y*3;
    				RGB tmp = yuvTorgb(src[Y], src[U], src[V]);
    				rgb[index+R] = tmp.r;
    				rgb[index+G] = tmp.g;
    				rgb[index+B] = tmp.b;
    			}
    		}
    		return rgb;
    	}
    	
    	//NV16是YUV422格式,排列是(Y), (UV),是2 plane
    	public static int[] NV16ToRGB(byte[] src, int width, int height){
    		int numOfPixel = width * height;
    		int positionOfU = numOfPixel;
    		int[] rgb = new int[numOfPixel*3];
    
    		for(int i=0; i<height; i++){
    			int startY = i*width;
    			int step = i*width;
    			int startU = positionOfU + step;
    			for(int j = 0; j < width; j++){
    				int Y = startY + j;
    				int U = startU + j/2;
    				int V = U + 1;
    				int index = Y*3;
    				RGB tmp = yuvTorgb(src[Y], src[U], src[V]);
    				rgb[index+R] = tmp.r;
    				rgb[index+G] = tmp.g;
    				rgb[index+B] = tmp.b;
    			}
    		}
    		return rgb;
    	}
    	
    	//NV61是YUV422格式,排列是(Y), (VU),是2 plane
    	public static int[] NV61ToRGB(byte[] src, int width, int height){
    		int numOfPixel = width * height;
    		int positionOfV = numOfPixel;
    		int[] rgb = new int[numOfPixel*3];
    
    		for(int i=0; i<height; i++){
    			int startY = i*width;
    			int step = i*width;
    			int startV = positionOfV + step;
    			for(int j = 0; j < width; j++){
    				int Y = startY + j;
    				int V = startV + j/2;
    				int U = V + 1;
    				int index = Y*3;
    				RGB tmp = yuvTorgb(src[Y], src[U], src[V]);
    				rgb[index+R] = tmp.r;
    				rgb[index+G] = tmp.g;
    				rgb[index+B] = tmp.b;
    			}
    		}
    		return rgb;
    	}
    	
    	//YVYU是YUV422格式,排列是(YVYU),是1 plane
    	public static int[] YVYUToRGB(byte[] src, int width, int height){
    		int numOfPixel = width * height;
    		int[] rgb = new int[numOfPixel*3];
    		int lineWidth = 2*width;
    		for(int i=0; i<height; i++){
    			int startY = i*lineWidth;
    			for(int j = 0; j < lineWidth; j+=4){
    				int Y1 = j + startY;
    				int Y2 = Y1+2;
    				int V = Y1+1;
    				int U = Y1+3;
    				int index = (Y1>>1)*3;
    				RGB tmp = yuvTorgb(src[Y1], src[U], src[V]);
    				rgb[index+R] = tmp.r;
    				rgb[index+G] = tmp.g;
    				rgb[index+B] = tmp.b;
    				index += 3;
    				tmp = yuvTorgb(src[Y2], src[U], src[V]);
    				rgb[index+R] = tmp.r;
    				rgb[index+G] = tmp.g;
    				rgb[index+B] = tmp.b;
    			}
    		}
    		return rgb;
    	}
    	
    	//VYUY是YUV422格式,排列是(VYUY),是1 plane
    	public static int[] VYUYToRGB(byte[] src, int width, int height){
    		int numOfPixel = width * height;
    		int[] rgb = new int[numOfPixel*3];
    		int lineWidth = 2*width;
    		for(int i=0; i<height; i++){
    			int startV = i*lineWidth;
    			for(int j = 0; j < lineWidth; j+=4){
    				int V = j + startV;
    				int Y1 = V+1;
    				int Y2 = V+3;
    				int U = V+2;
    				int index = (U>>1)*3;
    				RGB tmp = yuvTorgb(src[Y1], src[U], src[V]);
    				rgb[index+R] = tmp.r;
    				rgb[index+G] = tmp.g;
    				rgb[index+B] = tmp.b;
    				index += 3;
    				tmp = yuvTorgb(src[Y2], src[U], src[V]);
    				rgb[index+R] = tmp.r;
    				rgb[index+G] = tmp.g;
    				rgb[index+B] = tmp.b;
    			}
    		}
    		return rgb;
    	}
    }
    
    
    
    
    

    每天早上叫醒你的不是闹钟,而是心中的梦~
  • 相关阅读:
    UVA-1623 Enter The Dragon (贪心)
    UVA-1619 Feel Good (单调队列)
    UVA-11536 Smallest Sub-Array
    UVA-1617 Laptop (贪心)
    UVA-10570 Meeting with Aliens (枚举+贪心)
    UVA-1153 Keep the Customer Satisfied (贪心)
    UVA-1614 Hell on the Markets(贪心+推理) (有待补充)
    UVA-1613 K-Graph Oddity (着色问题)
    UVA-1612 Guess (贪心)
    todo:open和fopen的区别
  • 原文地址:https://www.cnblogs.com/vintion/p/4116960.html
Copyright © 2011-2022 走看看