當前位置:首頁 » 安卓系統 » yuvtorgbandroid

yuvtorgbandroid

發布時間: 2022-09-20 01:43:36

⑴ RGB與YUV

每個像素用1個bit表示,可表示的顏色范圍為雙色,即最傳統的黑和白。1個bit只能表示0,1兩種值。需要調色板,不過調色板只包含兩種顏色。

每個像素用4個bit表示,4個bit所能夠表示的索引范圍是0-15,共16個。也就是可以表示16種顏色。即調色板中包含16中顏色。

每個像素用8個bit表示。8個bit所能夠表示的索引范圍是0-255,共256個。也就是可以表示256中顏色。即調色板中包含256中顏色。

RGB像素格式中的bit存儲的是每一個像素點的R,G,B值

一個像素用16個bit = 2個byte表示 ,R=5 G=6 B=5

為什麼綠色為6位?

一個像素用16個bit = 2個byte,但是最高位不用,R=5 G=5 B=5

RGB24圖像每個像素用8個bit,共24個位表示,共3個位元組,注意:在內存中RGB各分量的排列順序為:BGR

RGB32圖像每個像素用32個bit表示,佔4個byte,R,G,B分量分別用8個bit表示,存儲順序為B,G,R,最後8個位元組保留。注意:在內存中RGB各分量的排列順序為:BGR

RGB32圖像每個像素用32個bit表示,佔4個位元組,R,G,B分量分別用8個bit表示,存儲順序為B,G,R,最後8個為透明像素。注意:在內存中RGB各分量的排列順序為:BGRA

注意:java默認使用大端位元組序,c/c++默認使用小端位元組序,android平台下Bitmap.config.ARGB_8888的Bitmap默認是大端位元組序,當需要把這個圖片內存數據給小端語言使用的時候,就需要把大端位元組序轉換為小端位元組序。例如:java層的ARGB_565傳遞給jni層使用時,需要把java層的ARGB_565的內存數據轉換為BGRA565。
詳細驗證請看: Android Bitmap像素排列與JNI操作

YUV有很多變種,我們常說的YUV指的是YCbCr,YUV三個字母中,其中」Y」表示明亮度(Lumina nce或Luma),也就是灰階值;而」U」和」V」表示的則是色度(Chrominance或Chroma)作用是描述影像色彩及飽和度,用於指定像素的顏色。Cb指藍色色度分量,而Cr指紅色色度分量,是標准 YUV 的一個翻版(還有YPbPr等),此文中,我們就用 YUV 指代 YCbCr 了。

首先,YUV按照數據大小分為三個格式,YUV420,YUV422,YUV444。由於人眼對Y的敏感度遠超於對U和V的敏感,所以可以多個Y分量共用一組UV,這樣既可以極大的節省空間,又可以不太損失質量。

按照多個 Y 分量共用一個 UV 的方式,我們可以把 YUV 分為 420,422,444 三種類型,而在這三種類型之下,我們又可以按照 YUV 的排列儲存順序,將其細分為好多種格式,這些格式數量繁多,又不好記憶,這為我們學習過程中造成了不少困難。下面我就為大家一一介紹。

首先,我們將可以按照 YUV 的排列方式,再次將 YUV 分成三個大類,Planar,Semi-Planar 和 Packed。

Planar YUV 三個分量分開存放
Semi-Planar Y 分量單獨存放,UV 分量交錯存放
Packed YUV 三個分量全部交錯存放
按照這三種方式,我們就可以將 YUV 格式進行比較細致的分類了。
YUV的所有格式列表

一張從上到下分別為原圖、Y、U 和 V:

YUV 4:4:4 采樣,意味著 Y、U、V 三個分量的采樣比例相同,因此在生成的圖像里,每個像素的三個分量信息完整,都是 8 bit,也就是一個位元組。

如下圖所示:

其中,Y 分量用叉表示,UV 分量用圓圈表示。

舉個例子 :
假如圖像像素為:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
那麼采樣的碼流為:Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
最後映射出的像素點依舊為 [Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]

假如圖像像素為:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
那麼采樣的碼流為:Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
最後映射出的像素點依舊為 [Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]

可以看到這種采樣方式的圖像和 RGB 顏色模型的圖像大小是一樣,並沒有達到節省帶寬的目的,當將 RGB 圖像轉換為 YUV 圖像時,也是先轉換為 YUV 4:4:4 采樣的圖像。

YUV 4:2:2 采樣,意味著 UV 分量是 Y 分量采樣的一半,Y 分量和 UV 分量按照 2 : 1 的比例采樣。如果水平方向有 10 個像素點,那麼采樣了 10 個 Y 分量,而只採樣了 5 個 UV 分量。

如下圖所示:

舉個例子 :
假如圖像像素為:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3] 那麼采樣的碼流為:Y0 U0 Y1 V1 Y2 U2 Y3 V3
其中,每采樣過一個像素點,都會采樣其 Y 分量,而 U、V 分量就會間隔一個採集一個。
最後映射出的像素點為 [Y0 U0 V1]、[Y1 U0 V1]、[Y2 U2 V3]、[Y3 U2 V3]

假如圖像像素為:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
那麼采樣的碼流為:Y0 U0 Y1 V1 Y2 U2 Y3 V3 其中,每采樣過一個像素點,都會采樣其 Y 分量,而 U、V 分量就會間隔一個採集一個。
最後映射出的像素點為 [Y0 U0 V1]、[Y1 U0 V1]、[Y2 U2 V3]、[Y3 U2 V3]

采樣的碼流映射為像素點,還是要滿足每個像素點有 Y、U、V 三個分量。但是可以看到,第一和第二像素點公用了 U0、V1 分量,第三和第四個像素點公用了 U2、V3 分量,這樣就節省了圖像空間。

一張 1280 * 720 大小的圖片,在 YUV 4:2:2 采樣時的大小為:

可以看到 YUV 4:2:2 采樣的圖像比 RGB 模型圖像節省了三分之一的存儲空間,在傳輸時佔用的帶寬也會隨之減少。

YUV 4:2:0 采樣,並不是指只採樣 U 分量而不採樣 V 分量。而是指,在每一行掃描時,只掃描一種色度分量(U 或者 V),和 Y 分量按照 2 : 1 的方式采樣。比如,第一行掃描時,YU 按照 2 : 1 的方式采樣,那麼第二行掃描時,YV 分量按照 2:1 的方式采樣。對於每個色度分量來說,它的水平方向和豎直方向的采樣和 Y 分量相比都是 2:1 。

如下圖所示:

假設第一行掃描了 U 分量,第二行掃描了 V 分量,那麼需要掃描兩行才能夠組成完整的 UV 分量。

舉個例子 :
假設圖像像素為:[Y0 U0 V0]、[Y1 U1 V1]、 [Y2 U2 V2]、 [Y3 U3 V3][Y5 U5 V5]、[Y6 U6 V6]、 [Y7 U7 V7] 、[Y8 U8 V8]
那麼采樣的碼流為:Y0 U0 Y1 Y2 U2 Y3 Y5 V5 Y6 Y7 V7 Y8其中,每采樣過一個像素點,都會采樣其 Y 分量,而 U、V 分量就會間隔一行按照 2 : 1 進行采樣。
最後映射出的像素點為:[Y0 U0 V5]、[Y1 U0 V5]、[Y2 U2 V7]、[Y3 U2 V7][Y5 U0 V5]、[Y6 U0 V5]、[Y7 U2 V7]、[Y8 U2 V7]

假設圖像像素為:[Y0 U0 V0]、[Y1 U1 V1]、 [Y2 U2 V2]、 [Y3 U3 V3][Y5 U5 V5]、[Y6 U6 V6]、 [Y7 U7 V7] 、[Y8 U8 V8]
那麼采樣的碼流為:Y0 U0 Y1 Y2 U2 Y3 Y5 V5 Y6 Y7 V7 Y8其中,每采樣過一個像素點,都會采樣其 Y 分量,而 U、V 分量就會間隔一行按照 2 : 1 進行采樣。
最後映射出的像素點為:[Y0 U0 V5]、[Y1 U0 V5]、[Y2 U2 V7]、[Y3 U2 V7][Y5 U0 V5]、[Y6 U0 V5]、[Y7 U2 V7]、[Y8 U2 V7]

從映射出的像素點中可以看到,四個 Y 分量是共用了一套 UV 分量,而且是按照 2*2 的小方格的形式分布的,相比 YUV 4:2:2 采樣中兩個 Y 分量共用一套 UV 分量,這樣更能夠節省空間。

一張 1280 * 720 大小的圖片,在 YUV 4:2:0 采樣時的大小為:

可以看到 YUV 4:2:0 采樣的圖像比 RGB 模型圖像節省了一半的存儲空間,因此它也是比較主流的采樣方式。

YUV 的存儲格式,有兩種:

YUYV 格式是採用打包格式進行存儲的,指每個像素點都採用 Y 分量,但是每隔一個像素采樣它的 UV 分量,排列順序如下:

UYVY 格式也是採用打包格式進行存儲,它的順序和 YUYV 相反,先採用 U 分量再采樣 Y 分量,排列順序如下:

YUV 422P 格式,又叫做 I422,採用的是平面格式進行存儲,先存儲所有的 Y 分量,再存儲所有的 U 分量,再存儲所有的 V 分量。

基於 YUV 4:2:0 采樣的格式主要有 YUV 420P 和 YUV 420SP 兩種類型,每個類型又對應其他具體格式。

I420 的單幀結構示意圖如下(Planar 方式)

這幅圖的上面一幅可以看出 Y1、Y2、Y7、Y8 共用 U1 和 V1。後面的線性數組為其存儲順序,可以看出 Y、U 和 V 都是順序存儲的,往外寫的時候,先按順序將 Y 分量寫出,然後再根據 U、V 分別將它們依次寫出即可。

NV12的單幀結構示意圖如下(Planar 方式)

可以看出與 YV12 不同的時,它的 Y 雖然也是順序存儲,但 U、V 卻是交錯存儲的,這種方式存儲在往外寫出時則先直接順序寫出 Y,然後對 UV 分別依次寫出。

PS:Android的Camera Preview默認圖像格式為NV21。

把RGB和YUV的范圍都縮放到[0,255]
YUV轉RGB

RGB轉YUV

參考資料:
圖片RGB數據格式
一文讀懂 YUV 的采樣與格式
視音頻數據處理入門:RGB、YUV像素數據處理
Android Bitmap像素排列與JNI操作
YUV420_SVG

⑵ 如何將YUV轉換為RGB,最後變為UIImage顯示出來

這是我 從GLSL腳本裡面看到的,提供參考
// BT.601, which is the standard for SDTV is provided as a reference
/*
rgb = mat3( 1, 1, 1,
0, -.39465, 2.03211,
1.13983, -.58060, 0) * yuv;
*/

// Using BT.709 which is the standard for HDTV
rgb = mat3( 1, 1, 1,
0, -.21482, 2.12798,
1.28033, -.38059, 0) * yuv;

⑶ 怎麼將圖像YUV格式轉成RGB格式(C++)

Y=0.30R+0.59G+0.11B , U=0.493(B-Y) , V=0.877(R-Y)
FYI: it is BGR in BMP not RGB

⑷ YUV到RGB怎麼轉換

對於數字視頻,定義了從 RGB 到兩個主要 YUV 的轉換。這兩個轉換都基於稱為 ITU-R Recommendation BT.709 的規范。第一個轉換是 BT.709 中定義用於 50-Hz 的較早的 YUV 格式。它與在 ITU-R Recommendation BT.601 中指定的關系相同, ITU-R Recommendation BT.601 也被稱為它的舊名稱 CCIR 601。這種格式應該被視為用於標準定義 TV 解析度 (720 x 576) 和更低解析度視頻的首選 YUV 格式。它的特徵由下面兩個常量 Kr 和 Kb 的值來定義: Kr = 0.299Kb = 0.114第二個轉換為 BT.709 中定義用於 60-Hz 的較新 YUV 格式,應該被視為用於高於 SDTV 的視頻解析度的首選格式。它的特徵由下面兩個不同的常量值來定義: Kr = 0.2126Kb = 0.0722從 RGB 到 YUV 轉換的定義以下列內容開始: L = Kr * R + Kb * B + (1 – Kr – Kb) * G然後,按照下列方式獲得 YUV 值: Y = floor(2^(M-8) * (219*(L–Z)/S + 16) + 0.5)U = clip3(0, 2^M-1, floor(2^(M-8) * (112*(B-L) / ((1-Kb)*S) + 128) + 0.5))V = clip3(0, 2^M-1, floor(2^(M-8) * (112*(R-L) / ((1-Kr)*S) + 128) + 0.5))其中 M 為每個 YUV 樣例的位數 (M >= 8)。 Z 為黑電平變數。對於計算機 RGB,Z 等於 0。對於 studio 視頻 RGB,Z 等於 16*2,其中 N 為每個 RGB 樣例的位數 (N >= 8)。 S 為縮放變數。對於計算機 RGB,S 等於 255。對於 studio 視頻 RGB,S 等於 219*2。 函數 floor(x) 返回大於或等於 x 的最大整數。函數 clip3(x, y, z) 的定義如下所示: clip3(x, y, z) = ((z < x) ? x : ((z > y) ? y : z))Y 樣例表示亮度,U 和 V 樣例分別表示偏向藍色和紅色的顏色偏差。Y 的標稱范圍為 16*2 到 235*2 。黑色表示為 16*2 ,白色表示為 235*2 。U 和 V 的標稱范圍為 16*2 到 240*2 ,值 128*2 表示中性色度。但是,實際的值可能不在這些范圍之內。 對於 studio 視頻 RGB 形式的輸入數據,要使得 U 和 V 值保持在 0 到 2M-1 范圍之內,必需進行剪輯操作。如果輸入為計算機 RGB,則不需要剪輯操作,這是因為轉換公式不會生成超出此范圍的值。 這些都是精確的公式,沒有近似值。 在DirectShow中,常見的RGB格式有RGB1、RGB4、RGB8、RGB565、RGB555、RGB24、RGB32、ARGB32等;常見的YUV格式有YUY2、YUYV、YVYU、UYVY、AYUV、Y41P、Y411、Y211、IF09、IYUV、YV12、YVU9、YUV411、YUV420等。

⑸ android yuv怎麼轉換成RGB565

參數分別是寬,高,原數據指針,轉化後的目標數據指針。


你找的這個函數是用C寫的,而你的save(byte[]yuv420,Stringpath,intwidth,intheight,intquality)是JAVA,因此你要使用JNI。或者你把cvt_420p_to_rgb565函數轉成JAVA版。

舉個例子使用jni(實際自己測試):

cvt_420p_to_rgb565修改為

#ifdef__cplusplus
extern"C"{
#endif

JNIEXPORTjobjectArrayJNICALL你的包名_類名_cvt420pToRGB565(JNIEnv*env,jobjectobj,jintwidth,jintheight,jcharArraysrcData,jcharArraydstData);
#ifdef__cplusplus
};
#endif

JNIEXPORTjobjectArrayJNICALL你的包名_類名_cvt420pToRGB565(JNIEnv*env,jobjectobj,jintwidth,jintheight,jcharArraysrcData,jcharArraydstData)
{
unsignedchar*src=(unsignedchar*)(env->GetByteArrayElements(srcData,0));
unsignedchar*dst=(unsignedchar*)(env->GetByteArrayElements(dstData,0));

下面照抄!!

⑹ Android攝像頭獲得YUV格式的視頻,網上很多都把它轉換為RGB為什麼呢能不能把它轉換為H264或者MP4格式的

RGB ? YUV ?這是視頻格式?難道我OUT了,經常和視頻打交道,視頻格式平常的和少見的都略知,就是沒見過這兩種,RGB不會是代表紅綠藍三基色通道的視頻吧,YUV的原理或許和RGB一樣,並不代表格式,而是視頻的顏色通道

⑺ 如何將YUV轉換為RGB,最後變為UIImage顯示出來

-(void)decodeAndShow : (char*) buf length:(int)len
{

int ret = h264_decode(buf , len, (char*)pFrameRGB);
m_decodeFinish = NO;

//NSLog(@"decode ret = %d readLen = %d\n", ret, nFrameLen);
if(ret > 0)
{
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
CFDataRef data = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, pFrameRGB, nWidth*nHeight*3,kCFAllocatorNull);
CGDataProviderRef provider = (data);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

CGImageRef cgImage = CGImageCreate(nWidth,
nHeight,
8,
24,
nWidth*3,
colorSpace,
bitmapInfo,
provider,
NULL,
YES,
kCGRenderingIntentDefault);
CGColorSpaceRelease(colorSpace);
//UIImage *image = [UIImage imageWithCGImage:cgImage];
UIImage* image = [[UIImage alloc]initWithCGImage:cgImage]; //crespo modify 20111020
CGImageRelease(cgImage);
CGDataProviderRelease(provider);
CFRelease(data);
[self performSelectorOnMainThread:@selector(updateView:) withObject:image waitUntilDone:YES];
[image release];
}
m_decodeFinish = YES;
return;
}

-(void)updateView:(UIImage*)newImage
{
//NSLog(@"顯示新畫面");
m_videoView.image = newImage;
}

熱點內容
打碼軟體源碼 發布:2025-03-20 07:08:06 瀏覽:109
前端android 發布:2025-03-20 06:50:42 瀏覽:93
進制轉換棧c語言 發布:2025-03-20 06:50:31 瀏覽:339
myeclipse不自動編譯了 發布:2025-03-20 06:41:38 瀏覽:777
led汽車大燈和鹵素燈該選哪個配置 發布:2025-03-20 06:40:55 瀏覽:917
sql網校 發布:2025-03-20 06:16:42 瀏覽:279
安卓手機圖標排列為什麼會混亂 發布:2025-03-20 06:16:05 瀏覽:761
手機pin初始密碼是多少 發布:2025-03-20 06:15:59 瀏覽:900
javaif常量變數 發布:2025-03-20 06:15:57 瀏覽:344
iis安裝sql 發布:2025-03-20 06:05:31 瀏覽:149