Yuv422、Nv12转C#Bitmap
创始人
2025-06-01 04:35:34

1.1、Nv12转Bitmap

int w = 1920;

int h = 1080;

int iImageSize = w * h * 3;

byte[] bRgbData = new byte[iImageSize];

int iYuvSize = iImageSize / 2;

byte[] bYuvData = new byte[iYuvSize];

nv12ToRgb(bRgbData, bYuvData, w, h);

Bitmap ShowBitmap = new Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

BitmapData bmpData = ShowBitmap.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);

System.Runtime.InteropServices.Marshal.Copy(bRgbData, 0, bmpData.Scan0, iImageSize);

ShowBitmap.UnlockBits(bmpData); // 解锁内存区域

1.2、Nv12转Bitmap函数

private void nv12ToRgb(byte[] bRgbData, byte[] bYuvData, int w, int h)

{

int iPosUV = 0;

int iStepY = w;

int iStepUV = w;

int iStepRGB = w * 3;

int iOffsetUV = w * h;

int iIndex1 = 0;

int iIndex2 = 0;

for (int i = 0; i < h; i += 2)

{

for (int j = 0; j < w; j += 2)

{

int y11 = Math.Max(0, (int)(bYuvData[i * iStepY + j + 0])) << 20;

int y12 = Math.Max(0, (int)(bYuvData[i * iStepY + j + 1])) << 20;

int y21 = Math.Max(0, (int)(bYuvData[(i + 1) * iStepY + j + 0])) << 20;

int y22 = Math.Max(0, (int)(bYuvData[(i + 1) * iStepY + j + 1])) << 20;

int u = (int)(bYuvData[iPosUV * iStepUV + iOffsetUV + j + 0]) - 128;

int v = (int)(bYuvData[iPosUV * iStepUV + iOffsetUV + j + 1]) - 128;

int ruv = 524288 + 2130771 * v;

int guv = 524288 - 413812 * v - 608826 * u;

int buv = 524288 + 1195254 * u;

//填第1行的RGB的两个像素

bRgbData[i * iStepRGB + iIndex1 + 0] = LimitValue((y11 + buv) >> 20);

bRgbData[i * iStepRGB + iIndex1 + 1] = LimitValue((y11 + guv) >> 20);

bRgbData[i * iStepRGB + iIndex1 + 2] = LimitValue((y11 + ruv) >> 20);

bRgbData[i * iStepRGB + iIndex1 + 3] = LimitValue((y12 + buv) >> 20);

bRgbData[i * iStepRGB + iIndex1 + 4] = LimitValue((y12 + guv) >> 20);

bRgbData[i * iStepRGB + iIndex1 + 5] = LimitValue((y12 + ruv) >> 20);

iIndex1 += 6;

//填第2行的RGB的两个像素

bRgbData[(i + 1) * iStepRGB + iIndex2 + 0] = LimitValue((y21 + buv) >> 20);

bRgbData[(i + 1) * iStepRGB + iIndex2 + 1] = LimitValue((y21 + guv) >> 20);

bRgbData[(i + 1) * iStepRGB + iIndex2 + 2] = LimitValue((y21 + ruv) >> 20);

bRgbData[(i + 1) * iStepRGB + iIndex2 + 3] = LimitValue((y22 + buv) >> 20);

bRgbData[(i + 1) * iStepRGB + iIndex2 + 4] = LimitValue((y22 + guv) >> 20);

bRgbData[(i + 1) * iStepRGB + iIndex2 + 5] = LimitValue((y22 + ruv) >> 20);

iIndex2 += 6;

}

iPosUV++;

iIndex1 = 0;

iIndex2 = 0;

}

}

//转出来的Rgb值范围0 - 255

private byte LimitValue(int iValue)

{

if (iValue < 0) return 0;

if (iValue > 255) return 255;

else return (byte)iValue;

//return (byte)(iValue <= 255 ? iValue : iValue > 0 ? 255 : 0);

}

2.1、Yuv422转Bitmap

int w = 1920;

int h = 1080;

int iImageSize = w * h * 3;

byte[] bRgbData = new byte[iImageSize];

int iYuvSize = iImageSize * 2;

byte[] bYuvData = new byte[iYuvSize];

Yuv2Rgb(bRgbData, bYuvData, w, h);

Bitmap ShowBitmap = new Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

BitmapData bmpData = ShowBitmap.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);

System.Runtime.InteropServices.Marshal.Copy(bRgbData, 0, bmpData.Scan0, iImageSize);

ShowBitmap.UnlockBits(bmpData); // 解锁内存区域

2.2、Yuv422转Bitmap函数

private void nv12ToRgb(byte[] bRgbData, byte[] bYuvData, int w, int h)

{

int iPosUV = 0;

int iStepY = w;

int iStepUV = w;

int iStepRGB = w * 3;

int iOffsetUV = w * h;

int iIndex1 = 0;

int iIndex2 = 0;

for (int i = 0; i < h; i += 2)

{

for (int j = 0; j < w; j += 2)

{

int y11 = Math.Max(0, (int)(bYuvData[i * iStepY + j + 0])) << 20;

int y12 = Math.Max(0, (int)(bYuvData[i * iStepY + j + 1])) << 20;

int y21 = Math.Max(0, (int)(bYuvData[(i + 1) * iStepY + j + 0])) << 20;

int y22 = Math.Max(0, (int)(bYuvData[(i + 1) * iStepY + j + 1])) << 20;

int u = (int)(bYuvData[iPosUV * iStepUV + iOffsetUV + j + 0]) - 128;

int v = (int)(bYuvData[iPosUV * iStepUV + iOffsetUV + j + 1]) - 128;

int ruv = 524288 + 2130771 * v;

int guv = 524288 - 413812 * v - 608826 * u;

int buv = 524288 + 1195254 * u;

//填第1行的RGB的两个像素

bRgbData[i * iStepRGB + iIndex1 + 0] = LimitValue((y11 + buv) >> 20);

bRgbData[i * iStepRGB + iIndex1 + 1] = LimitValue((y11 + guv) >> 20);

bRgbData[i * iStepRGB + iIndex1 + 2] = LimitValue((y11 + ruv) >> 20);

bRgbData[i * iStepRGB + iIndex1 + 3] = LimitValue((y12 + buv) >> 20);

bRgbData[i * iStepRGB + iIndex1 + 4] = LimitValue((y12 + guv) >> 20);

bRgbData[i * iStepRGB + iIndex1 + 5] = LimitValue((y12 + ruv) >> 20);

iIndex1 += 6;

//填第2行的RGB的两个像素

bRgbData[(i + 1) * iStepRGB + iIndex2 + 0] = LimitValue((y21 + buv) >> 20);

bRgbData[(i + 1) * iStepRGB + iIndex2 + 1] = LimitValue((y21 + guv) >> 20);

bRgbData[(i + 1) * iStepRGB + iIndex2 + 2] = LimitValue((y21 + ruv) >> 20);

bRgbData[(i + 1) * iStepRGB + iIndex2 + 3] = LimitValue((y22 + buv) >> 20);

bRgbData[(i + 1) * iStepRGB + iIndex2 + 4] = LimitValue((y22 + guv) >> 20);

bRgbData[(i + 1) * iStepRGB + iIndex2 + 5] = LimitValue((y22 + ruv) >> 20);

iIndex2 += 6;

}

iPosUV++;

iIndex1 = 0;

iIndex2 = 0;

}

}

//转出来的Rgb值范围0 - 255

private byte LimitValue(int iValue)

{

if (iValue < 0) return 0;

if (iValue > 255) return 255;

else return (byte)iValue;

//return (byte)(iValue <= 255 ? iValue : iValue > 0 ? 255 : 0);

}

相关内容

热门资讯

元凌卿是什么小说,前世辜负了痴... 元凌卿是什么小说目录《醉玲珑》大结局是什么?前世辜负了痴情的七王爷,重生后她不再任性叫什么名字女主叫...
忘年之交指怎样的朋友,忘年之交... 忘年之交指怎样的朋友目录忘年之交指怎样的朋友忘年之交指的是什么样的朋友?
披头士为什么叫甲壳虫(披头士和... 今天给各位分享披头士为什么叫甲壳虫的知识,其中也会对披头士和甲壳虫的区别进行解释,如果能碰巧解决你现...
白灵结局是什么,活佛济公里的白... 白灵结局是什么目录白灵结局是什么活佛济公里的白灵是个什么结局?活佛济公4白灵的结局白灵结局是什么呢?...
择天记电视剧结局,择天记结局 ... 择天记电视剧结局目录择天记电视剧结局择天记结局 大结局请查收电视剧《择天记》大结局是什么?落落结局为...
三星手机怎么录制屏幕视频,三星... 2. 在通知面板中,找到并点击
保险的基本知识有哪些,关于买保... 保险的基本知识有哪些目录保险的基本知识有哪些关于买保险的基本知识买保险,需要知道的基本知识保险的基础...
每次消防出警需要收费的吗,消防... 每次消防出警需要收费的吗目录每次消防出警需要收费的吗消防队出警灭火,需要交钱么?消防员出警要收费吗消...
14K金项链会掉色吗,k14项... 14K金项链会掉色吗目录14K金项链会掉色吗k14项链掉色正常吗?14K金子掉色吗?14k金会掉色吗...
如何正确的使用加湿器,加湿器怎... 如何正确的使用加湿器目录如何正确的使用加湿器加湿器怎么使用正确加湿器使用注意事项加湿器的正确使用方法...
正规的网贷平台有哪些,不查征信... 正规的网贷平台有哪些目录正规的网贷平台有哪些不查征信的靠谱网贷平台有哪些正规的借贷平台有哪些?有哪些...
广东省普宁市属于哪个市,普宁是... 广东省普宁市属于哪个市目录广东省普宁市属于哪个市普宁是哪个是市的普宁属于哪个省哪个城市的?普宁市是哪...
雷洛科雷傲精彩改装案例(雷诺科... 今天给各位分享雷洛科雷傲精彩改装案例的知识,其中也会对雷诺科雷傲爆改进行解释,如果能碰巧解决你现在面...
国人难以忘却的经典解读丰田8A... 今天给各位分享国人难以忘却的经典解读丰田8A发动机的知识,其中也会对丰田8a发动机图片进行解释,如果...
2023张家口到北京的火车时刻... 今天给各位分享2023张家口到北京的火车时刻表查询,从张家口到北京...的知识,其中也会对张家口到北...
小狼狗是什么意思(小狼狗是啥)... 今天给各位分享小狼狗是什么意思的知识,其中也会对小狼狗是啥进行解释,如果能碰巧解决你现在面临的问题,...
苹果手机换购新款需要什么条件吗... 苹果最近的政策以旧换新需要办理什么手续,要身份证什么的吗?办过的才回答苹果旧机换新机的条件是什么? ...
ps怎么抠图详细步骤,ps最简... ps怎么抠图详细步骤目录ps怎么抠图详细步骤ps最简单的抠图方法的具体操作步骤怎么做?在线ps教程 ...
赴汤蹈火在所不辞的意思,赴汤蹈... 赴汤蹈火在所不辞的意思目录赴汤蹈火在所不辞的意思赴汤蹈火,再所不辞.赴汤蹈火的意思赴汤蹈火,在所不辞...
邮政报刊厅怎么申请 极速百科网... 邮政报刊厅怎么申请目录邮政报刊厅怎么申请邮政报刊厅怎么申请想开邮政报亭怎样办理!需要什么手续?邮政报...
新宝来和新朗逸选谁更好?网友:... 今天给各位分享新宝来和新朗逸选谁更好?网友:毫无悬念,朗逸全方位...的知识,其中也会对大众新宝来和...
pms系统是什么意思 极速百科... pms系统是什么意思目录pms系统是什么意思pms系统是什么意思mis系统是什么pms什么意思pms...
无影灯原理(无影灯原理图讲解)... 今天给各位分享无影灯原理的知识,其中也会对无影灯原理图讲解进行解释,如果能碰巧解决你现在面临的问题,...
蜂蜜的用途(蜂蜜的用途是什么)... 本篇文章极速百科给大家谈谈蜂蜜的用途,以及蜂蜜的用途是什么对应的知识点,希望对各位有所帮助,不要忘了...
16K纸有多大比A4的大还是小... 今天给各位分享16K纸有多大比A4的大还是小的知识,其中也会对16k的纸是a4纸的一半吗进行解释,如...
许昌新车上牌地址(许昌新车上牌... 今天给各位分享许昌新车上牌地址的知识,其中也会对许昌新车上牌地址查询进行解释,如果能碰巧解决你现在面...
八大艺术有哪些,艺术的八大类分... 八大艺术有哪些目录八大艺术有哪些艺术的八大类分别是什么世界公认的七大艺术是什么?什么被称八大艺术八大...
离我最近的北京现代4s店(离我... 本篇文章极速百科给大家谈谈离我最近的北京现代4s店,以及离我最近的北京现代4s店保养车对应的知识点,...
导轨油和机油的区别?(导轨油和... 今天给各位分享导轨油和机油的区别?的知识,其中也会对导轨油和机油的区别是什么进行解释,如果能碰巧解决...
免检卡板有什么好的,与熏蒸卡板... 本篇文章极速百科给大家谈谈免检卡板有什么好的,与熏蒸卡板有什么区别呢?,以及免检卡板图片对应的知识点...