linux yuv转换工具,linux 平台camera得到YUV数据转RGB888及加BMP头文件

需要在Android

平台上通过UVC得到纯YUV数据,需要验证数据的正确性。因此需要将每一帧的YUV数据转为RGB888,但纯的RGB888数据也无法在windows或者ubuntu上打开,需要加BMP头。此文章介绍其实现方法。

第一步:YUY2转为RGB888.

参考文章:

http://blog.csdn.net/jtujtujtu/article/details/3874621

[cpp] view plain

copy

//

// YUV2RGB

// pYUV         point to the YUV data

// pRGB         point to the RGB data

// width        width of the picture

// height       height of the picture

// alphaYUV     is there an alpha channel in YUV

// alphaRGB     is there an alpha channel in RGB

//

int

YUV2RGB(

void

* pYUV,

void

* pRGB,

int

width,

int

height,

bool

alphaYUV,

bool

alphaRGB)

{

if

(NULL == pYUV)

{

return

-1;

}

unsigned char

* pYUVData = (unsigned

char

*)pYUV;

unsigned char

* pRGBData = (unsigned

char

*)pRGB;

if

(NULL == pRGBData)

{

if

(alphaRGB)

{

pRGBData = new

unsigned

char

[width*height*4];

}

else

pRGBData = new

unsigned

char

[width*height*3];

}

int

Y1, U1, V1, Y2, alpha1, alpha2, R1, G1, B1, R2, G2, B2;

int

C1, D1, E1, C2;

if

(alphaRGB)

{

if

(alphaYUV)

{

for

(

int

i=0; i

{

for

(

int

j=0; j

{

Y1 = *(pYUVData+i*width*3+j*6);

U1 = *(pYUVData+i*width*3+j*6+1);

Y2 = *(pYUVData+i*width*3+j*6+2);

V1 = *(pYUVData+i*width*3+j*6+3);

alpha1 = *(pYUVData+i*width*3+j*6+4);

alpha2 = *(pYUVData+i*width*3+j*6+5);

C1 = Y1-16;

C2 = Y2-16;

D1 = U1-128;

E1 = V1-128;

R1 = ((298*C1 + 409*E1 + 128)>>8>255 ? 255 : (298*C1 + 409*E1 + 128)>>8);

G1 = ((298*C1 - 100*D1 - 208*E1 + 128)>>8>255 ? 255 : (298*C1 - 100*D1 - 208*E1 + 128)>>8);

B1 = ((298*C1+516*D1 +128)>>8>255 ? 255 : (298*C1+516*D1 +128)>>8);

R2 = ((298*C2 + 409*E1 + 128)>>8>255 ? 255 : (298*C2 + 409*E1 + 128)>>8);

G2 = ((298*C2 - 100*D1 - 208*E1 + 128)>>8>255 ? 255 : (298*C2 - 100*D1 - 208*E1 + 128)>>8);

B2 = ((298*C2 + 516*D1 +128)>>8>255 ? 255 : (298*C2 + 516*D1 +128)>>8);

*(pRGBData+(height-i-1)*width*4+j*8+2) = R1<0 ? 0 : R1;

*(pRGBData+(height-i-1)*width*4+j*8+1) = G1<0 ? 0 : G1;

*(pRGBData+(height-i-1)*width*4+j*8) = B1<0 ? 0 : B1;

*(pRGBData+(height-i-1)*width*4+j*8+3) = alpha1;

*(pRGBData+(height-i-1)*width*4+j*8+6) = R2<0 ? 0 : R2;

*(pRGBData+(height-i-1)*width*4+j*8+5) = G2<0 ? 0 : G2;

*(pRGBData+(height-i-1)*width*4+j*8+4) = B2<0 ? 0 : B2;

*(pRGBData+(height-i-1)*width*4+j*8+7) = alpha2;

}

}

}

else

{

int

alpha = 255;

for

(

int

i=0; i

{

for

(

int

j=0; j

{

Y1 = *(pYUVData+i*width*2+j*4);

U1 = *(pYUVData+i*width*2+j*4+1);

Y2 = *(pYUVData+i*width*2+j*4+2);

V1 = *(pYUVData+i*width*2+j*4+3);

C1 = Y1-16;

C2 = Y2-16;

D1 = U1-128;

E1 = V1-128;

R1 = ((298*C1 + 409*E1 + 128)>>8>255 ? 255 : (298*C1 + 409*E1 + 128)>>8);

G1 = ((298*C1 - 100*D1 - 208*E1 + 128)>>8>255 ? 255 : (298*C1 - 100*D1 - 208*E1 + 128)>>8);

B1 = ((298*C1+516*D1 +128)>>8>255 ? 255 : (298*C1+516*D1 +128)>>8);

R2 = ((298*C2 + 409*E1 + 128)>>8>255 ? 255 : (298*C2 + 409*E1 + 128)>>8);

G2 = ((298*C2 - 100*D1 - 208*E1 + 128)>>8>255 ? 255 : (298*C2 - 100*D1 - 208*E1 + 128)>>8);

B2 = ((298*C2 + 516*D1 +128)>>8>255 ? 255 : (298*C2 + 516*D1 +128)>>8);

*(pRGBData+(height-i-1)*width*4+j*8+2) = R1<0 ? 0 : R1;

*(pRGBData+(height-i-1)*width*4+j*8+1) = G1<0 ? 0 : G1;

*(pRGBData+(height-i-1)*width*4+j*8) = B1<0 ? 0 : B1;

*(pRGBData+(height-i-1)*width*4+j*8+3) = alpha;

*(pRGBData+(height-i-1)*width*4+j*8+6) = R2<0 ? 0 : R2;

*(pRGBData+(height-i-1)*width*4+j*8+5) = G2<0 ? 0 : G2;

*(pRGBData+(height-i-1)*width*4+j*8+4) = B2<0 ? 0 : B2;

*(pRGBData+(height-i-1)*width*4+j*8+7) = alpha;

}

}

}

}

else

{

if

(alphaYUV)

{

for

(

int

i=0; i

{

for

(

int

j=0; j

{

Y1 = *(pYUVData+i*width*3+j*4);

U1 = *(pYUVData+i*width*3+j*4+1);

Y2 = *(pYUVData+i*width*3+j*4+2);

V1 = *(pYUVData+i*width*3+j*4+3);

C1 = Y1-16;

C2 = Y2-16;

D1 = U1-128;

E1 = V1-128;

R1 = ((298*C1 + 409*E1 + 128)>>8>255 ? 255 : (298*C1 + 409*E1 + 128)>>8);

G1 = ((298*C1 - 100*D1 - 208*E1 + 128)>>8>255 ? 255 : (298*C1 - 100*D1 - 208*E1 + 128)>>8);

B1 = ((298*C1+516*D1 +128)>>8>255 ? 255 : (298*C1+516*D1 +128)>>8);

R2 = ((298*C2 + 409*E1 + 128)>>8>255 ? 255 : (298*C2 + 409*E1 + 128)>>8);

G2 = ((298*C2 - 100*D1 - 208*E1 + 128)>>8>255 ? 255 : (298*C2 - 100*D1 - 208*E1 + 128)>>8);

B2 = ((298*C2 + 516*D1 +128)>>8>255 ? 255 : (298*C2 + 516*D1 +128)>>8);

*(pRGBData+(height-i-1)*width*3+j*6+2) = R1<0 ? 0 : R1;

*(pRGBData+(height-i-1)*width*3+j*6+1) = G1<0 ? 0 : G1;

*(pRGBData+(height-i-1)*width*3+j*6) = B1<0 ? 0 : B1;

*(pRGBData+(height-i-1)*width*3+j*6+5) = R2<0 ? 0 : R2;

*(pRGBData+(height-i-1)*width*3+j*6+4) = G2<0 ? 0 : G2;

*(pRGBData+(height-i-1)*width*3+j*6+3) = B2<0 ? 0 : B2;

}

}

}

else

{

for

(

int

i=0; i

{

for

(

int

j=0; j

{

Y1 = *(pYUVData+i*width*2+j*4);

U1 = *(pYUVData+i*width*2+j*4+1);

Y2 = *(pYUVData+i*width*2+j*4+2);

V1 = *(pYUVData+i*width*2+j*4+3);

C1 = Y1-16;

C2 = Y2-16;

D1 = U1-128;

E1 = V1-128;

R1 = ((298*C1 + 409*E1 + 128)>>8>255 ? 255 : (298*C1 + 409*E1 + 128)>>8);

G1 = ((298*C1 - 100*D1 - 208*E1 + 128)>>8>255 ? 255 : (298*C1 - 100*D1 - 208*E1 + 128)>>8);

B1 = ((298*C1+516*D1 +128)>>8>255 ? 255 : (298*C1+516*D1 +128)>>8);

R2 = ((298*C2 + 409*E1 + 128)>>8>255 ? 255 : (298*C2 + 409*E1 + 128)>>8);

G2 = ((298*C2 - 100*D1 - 208*E1 + 128)>>8>255 ? 255 : (298*C2 - 100*D1 - 208*E1 + 128)>>8);

B2 = ((298*C2 + 516*D1 +128)>>8>255 ? 255 : (298*C2 + 516*D1 +128)>>8);

*(pRGBData+(height-i-1)*width*3+j*6+2) = R1<0 ? 0 : R1;

*(pRGBData+(height-i-1)*width*3+j*6+1) = G1<0 ? 0 : G1;

*(pRGBData+(height-i-1)*width*3+j*6) = B1<0 ? 0 : B1;

*(pRGBData+(height-i-1)*width*3+j*6+5) = R2<0 ? 0 : R2;

*(pRGBData+(height-i-1)*width*3+j*6+4) = G2<0 ? 0 : G2;

*(pRGBData+(height-i-1)*width*3+j*6+3) = B2<0 ? 0 : B2;

}

}

}

}

return

0;

}

//

// RGB2YUV

// pRGB         point to the RGB data

// pYUV         point to the YUV data

// width        width of the picture

// height       height of the picture

// alphaYUV     is there an alpha channel in YUV

// alphaRGB     is there an alpha channel in RGB

//

int

RGB2YUV(

void

* pRGB,

void

* pYUV,

int

width,

int

height,

bool

alphaYUV,

bool

alphaRGB)

{

if

(NULL == pRGB)

{

return

-1;

}

unsigned char

* pRGBData = (unsigned

char

*)pRGB;

unsigned char

* pYUVData = (unsigned

char

*)pYUV;

if

(NULL == pYUVData)

{

if

(alphaYUV)

{

pYUVData = new

unsigned

char

[width*height*3];

}

else

pYUVData = new

unsigned

char

[width*height*2];

}

int

R1, G1, B1, R2, G2, B2, Y1, U1, Y2, V1;

int

alpha1, alpha2;

if

(alphaYUV)

{

if

(alphaRGB)

{

for

(

int

i=0; i

{

for

(

int

j=0; j

{

B1 = *(pRGBData+(height-i-1)*width*4+j*8);

G1 = *(pRGBData+(height-i-1)*width*4+j*8+1);

R1 = *(pRGBData+(height-i-1)*width*4+j*8+2);

alpha1 = *(pRGBData+(height-i-1)*width*4+j*8+3);

B2 = *(pRGBData+(height-i-1)*width*4+j*8+4);

G2 = *(pRGBData+(height-i-1)*width*4+j*8+5);

R2 = *(pRGBData+(height-i-1)*width*4+j*8+6);

alpha2 = *(pRGBData+(height-i-1)*width*4+j*8+7);

Y1 = (((66*R1+129*G1+25*B1+128)>>8) + 16) > 255 ? 255 : (((66*R1+129*G1+25*B1+128)>>8) + 16);

U1 = ((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2 + 128)>255 ? 255 : ((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2 + 128);

Y2 = (((66*R2+129*G2+25*B2+128)>>8) + 16)>255 ? 255 : ((66*R2+129*G2+25*B2+128)>>8) + 16;

V1 = ((((112*R1-94*G1-18*B1+128)>>8) + ((112*R2-94*G2-18*B2+128)>>8))/2 + 128)>255 ? 255 : ((((112*R1-94*G1-18*B1+128)>>8) + ((112*R2-94*G2-18*B2+128)>>8))/2 + 128);

*(pYUVData+i*width*3+j*6) = Y1;

*(pYUVData+i*width*3+j*6+1) = U1;

*(pYUVData+i*width*3+j*6+2) = Y2;

*(pYUVData+i*width*3+j*6+3) = V1;

*(pYUVData+i*width*3+j*6+4) = alpha1;

*(pYUVData+i*width*3+j*6+5) = alpha2;

}

}

}

else

{

unsigned char

alpha = 255;

for

(

int

i=0; i

{

for

(

int

j=0; j

{

B1 = *(pRGBData+(height-i-1)*width*3+j*6);

G1 = *(pRGBData+(height-i-1)*width*3+j*6+1);

R1 = *(pRGBData+(height-i-1)*width*3+j*6+2);

B2 = *(pRGBData+(height-i-1)*width*3+j*6+3);

G2 = *(pRGBData+(height-i-1)*width*3+j*6+4);

R2 = *(pRGBData+(height-i-1)*width*3+j*6+5);

Y1 = ((66*R1+129*G1+25*B1+128)>>8) + 16;

U1 = ((-38*R1-74*G1+112*B1+128)>>8+(-38*R2-74*G2+112*B2+128)>>8)/2 + 128;

Y2 = ((66*R2+129*G2+25*B2+128)>>8) + 16;

V1 = ((112*R1-94*G1-18*B1+128)>>8 + (112*R2-94*G2-18*B2+128)>>8)/2 + 128;

Y1 = (((66*R1+129*G1+25*B1+128)>>8) + 16) > 255 ? 255 : (((66*R1+129*G1+25*B1+128)>>8) + 16);

U1 = ((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2 + 128)>255 ? 255 : ((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2 + 128);

Y2 = (((66*R2+129*G2+25*B2+128)>>8) + 16)>255 ? 255 : ((66*R2+129*G2+25*B2+128)>>8) + 16;

V1 = ((((112*R1-94*G1-18*B1+128)>>8) + ((112*R2-94*G2-18*B2+128)>>8))/2 + 128)>255 ? 255 : ((((112*R1-94*G1-18*B1+128)>>8) + ((112*R2-94*G2-18*B2+128)>>8))/2 + 128);

*(pYUVData+i*width*3+j*6) = Y1;

*(pYUVData+i*width*3+j*6+1) = U1;

*(pYUVData+i*width*3+j*6+2) = Y2;

*(pYUVData+i*width*3+j*6+3) = V1;

*(pYUVData+i*width*3+j*6+4) = alpha;

*(pYUVData+i*width*3+j*6+5) = alpha;

}

}

}

}

else

{

if

(alphaRGB)

{

for

(

int

i=0; i

{

for

(

int

j=0; j

{

B1 = *(pRGBData+(height-i-1)*width*4+j*8);

G1 = *(pRGBData+(height-i-1)*width*4+j*8+1);

R1 = *(pRGBData+(height-i-1)*width*4+j*8+2);

B2 = *(pRGBData+(height-i-1)*width*4+j*8+4);

G2 = *(pRGBData+(height-i-1)*width*4+j*8+5);

R2 = *(pRGBData+(height-i-1)*width*4+j*8+6);

Y1 = (((66*R1+129*G1+25*B1+128)>>8) + 16) > 255 ? 255 : (((66*R1+129*G1+25*B1+128)>>8) + 16);

U1 = ((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2 + 128)>255 ? 255 : ((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2 + 128);

Y2 = (((66*R2+129*G2+25*B2+128)>>8) + 16)>255 ? 255 : ((66*R2+129*G2+25*B2+128)>>8) + 16;

V1 = ((((112*R1-94*G1-18*B1+128)>>8) + ((112*R2-94*G2-18*B2+128)>>8))/2 + 128)>255 ? 255 : ((((112*R1-94*G1-18*B1+128)>>8) + ((112*R2-94*G2-18*B2+128)>>8))/2 + 128);

*(pYUVData+i*width*2+j*4) = Y1;

*(pYUVData+i*width*2+j*4+1) = U1;

*(pYUVData+i*width*2+j*4+2) = Y2;

*(pYUVData+i*width*2+j*4+3) = V1;

}

}

}

else

{

for

(

int

i=0; i

{

for

(

int

j=0; j

{

B1 = *(pRGBData+(height-i-1)*width*3+j*6);

G1 = *(pRGBData+(height-i-1)*width*3+j*6+1);

R1 = *(pRGBData+(height-i-1)*width*3+j*6+2);

B2 = *(pRGBData+(height-i-1)*width*3+j*6+3);

G2 = *(pRGBData+(height-i-1)*width*3+j*6+4);

R2 = *(pRGBData+(height-i-1)*width*3+j*6+5);

Y1 = (((66*R1+129*G1+25*B1+128)>>8) + 16) > 255 ? 255 : (((66*R1+129*G1+25*B1+128)>>8) + 16);

U1 = ((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2 + 128)>255 ? 255 : ((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2 + 128);

Y2 = (((66*R2+129*G2+25*B2+128)>>8) + 16)>255 ? 255 : ((66*R2+129*G2+25*B2+128)>>8) + 16;

V1 = ((((112*R1-94*G1-18*B1+128)>>8) + ((112*R2-94*G2-18*B2+128)>>8))/2 + 128)>255 ? 255 : ((((112*R1-94*G1-18*B1+128)>>8) + ((112*R2-94*G2-18*B2+128)>>8))/2 + 128);

*(pYUVData+i*width*2+j*4) = Y1;

*(pYUVData+i*width*2+j*4+1) = U1;

*(pYUVData+i*width*2+j*4+2) = Y2;

*(pYUVData+i*width*2+j*4+3) = V1;

}

}

}

}

return

0;

}

//

// pGBYUV           point to the background YUV data

// pFGYUV           point to the foreground YUV data

// width            width of the picture

// height           height of the picture

// alphaBG          is there an alpha channel in background YUV data

// alphaFG          is there an alpha channel in fourground YUV data

//

int

YUVBlending(

void

* pBGYUV,

void

* pFGYUV,

int

width,

int

height,

bool

alphaBG,

bool

alphaFG)

{

if

(NULL == pBGYUV || NULL == pFGYUV)

{

return

-1;

}

unsigned char

* pBGData = (unsigned

char

*)pBGYUV;

unsigned char

* pFGData = (unsigned

char

*)pFGYUV;

if

(!alphaFG)

{

if

(!alphaBG)

{

memcpy(pBGData, pFGData, width*height*2);

}

else

{

for

(

int

i=0; i

{

for

(

int

j=0; j

{

*(pBGData+i*width*2+j*4) = *(pFGData+i*width*2+j*4);

*(pBGData+i*width*2+j*4+1) = *(pFGData+i*width*2+j*4+1);

*(pBGData+i*width*2+j*4+2) = *(pFGData+i*width*2+j*4+2);

*(pBGData+i*width*2+j*4+3) = *(pFGData+i*width*2+j*4+3);

}

}

}

}

int

Y11, U11, V11, Y12, Y21, U21, V21, Y22;

int

alpha1, alpha2;

if

(!alphaBG)

{

for

(

int

i=0; i

{

for

(

int

j=0; j

{

Y11 = *(pBGData+i*width*2+j*4);

U11 = *(pBGData+i*width*2+j*4+1);

Y12 = *(pBGData+i*width*2+j*4+2);

V11 = *(pBGData+i*width*2+j*4+3);

Y21 = *(pFGData+i*width*3+j*6);

U21 = *(pFGData+i*width*3+j*6+1);

Y22 = *(pFGData+i*width*3+j*6+2);

V21 = *(pFGData+i*width*3+j*6+3);

alpha1 = *(pFGData+i*width*3+j*6+4);

alpha2 = *(pFGData+i*width*3+j*6+5);

*(pBGData+i*width*2+j*4) = (Y21-16)*alpha1/255+(Y11-16)*(255-alpha1)/255+16;

*(pBGData+i*width*2+j*4+1) = ((U21-128)*alpha1/255+(U11-128)*(255-alpha1)/255 + (U21-128)*alpha2/255+(U11-128)*(255-alpha2)/255)/2+128;

*(pBGData+i*width*2+j*4+3) = ((V21-128)*alpha1/255+(V11-128)*(255-alpha1)/255 + (V21-128)*alpha2/255+(V11-128)*(255-alpha2)/255)/2+128;

*(pBGData+i*width*2+j*4+2) = (Y22-16)*alpha2/255+(Y12-16)*(255-alpha2)/255+16;

}

}

}

else

{

for

(

int

i=0; i

{

for

(

int

j=0; j

{

Y11 = *(pBGData+i*width*3+j*6);

U11 = *(pBGData+i*width*3+j*6+1);

Y12 = *(pBGData+i*width*3+j*6+2);

V11 = *(pBGData+i*width*3+j*6+3);

Y21 = *(pFGData+i*width*3+j*6);

U21 = *(pFGData+i*width*3+j*6+1);

Y22 = *(pFGData+i*width*3+j*6+2);

V21 = *(pFGData+i*width*3+j*6+3);

alpha1 = *(pFGData+i*width*3+j*6+4);

alpha2 = *(pFGData+i*width*3+j*6+5);

*(pBGData+i*width*3+j*6) = (Y21-16)*alpha1/255+(Y11-16)*(255-alpha1)/255+16;

*(pBGData+i*width*3+j*6+1) = ((U21-128)*alpha1/255+(U11-128)*(255-alpha1)/255 + (U21-128)*alpha2/255+(U11-128)*(255-alpha2)/255)/2+128;

*(pBGData+i*width*3+j*6+3) = ((V21-128)*alpha1/255+(V11-128)*(255-alpha1)/255 + (V21-128)*alpha2/255+(V11-128)*(255-alpha2)/255)/2+128;

*(pBGData+i*width*3+j*6+2) = (Y22-16)*alpha2/255+(Y12-16)*(255-alpha2)/255+16;

}

}

}

return

0;

}

将转化后数据保存。

第二步,将纯RGB888转化为BMP文件,

参考http://my.csdn.net/meng_tianshi/code/detail/2092

保存为.c文件

[cpp]

view

plaincopy

int

RGB2BMP(

char

*rgb_buffer,

int

nWidth,

int

nHeight,

FILE

*fp1)

{

BmpHead m_BMPHeader;

char

bfType[2]={

'B'

,

'M'

};

m_BMPHeader.imageSize=3*nWidth*nHeight+54;

m_BMPHeader.blank=0;

m_BMPHeader.startPosition=54;

fwrite(bfType,1,sizeof

(bfType),fp1);

fwrite(&m_BMPHeader.imageSize,1,sizeof

(m_BMPHeader.imageSize),fp1);

fwrite(&m_BMPHeader.blank,1,sizeof

(m_BMPHeader.blank),fp1);

fwrite(&m_BMPHeader.startPosition,1,sizeof

(m_BMPHeader.startPosition),fp1);

InfoHead  m_BMPInfoHeader;

m_BMPInfoHeader.Length=40;

m_BMPInfoHeader.width=nWidth;

m_BMPInfoHeader.height=nHeight;

m_BMPInfoHeader.colorPlane=1;

m_BMPInfoHeader.bitColor=24;

m_BMPInfoHeader.zipFormat=0;

m_BMPInfoHeader.realSize=3*nWidth*nHeight;

m_BMPInfoHeader.xPels=0;

m_BMPInfoHeader.yPels=0;

m_BMPInfoHeader.colorUse=0;

m_BMPInfoHeader.colorImportant=0;

fwrite(&m_BMPInfoHeader.Length,1,sizeof

(m_BMPInfoHeader.Length),fp1);

fwrite(&m_BMPInfoHeader.width,1,sizeof

(m_BMPInfoHeader.width),fp1);

fwrite(&m_BMPInfoHeader.height,1,sizeof

(m_BMPInfoHeader.height),fp1);

fwrite(&m_BMPInfoHeader.colorPlane,1,sizeof

(m_BMPInfoHeader.colorPlane),fp1);

fwrite(&m_BMPInfoHeader.bitColor,1,sizeof

(m_BMPInfoHeader.bitColor),fp1);

fwrite(&m_BMPInfoHeader.zipFormat,1,sizeof

(m_BMPInfoHeader.zipFormat),fp1);

fwrite(&m_BMPInfoHeader.realSize,1,sizeof

(m_BMPInfoHeader.realSize),fp1);

fwrite(&m_BMPInfoHeader.xPels,1,sizeof

(m_BMPInfoHeader.xPels),fp1);

fwrite(&m_BMPInfoHeader.yPels,1,sizeof

(m_BMPInfoHeader.yPels),fp1);

fwrite(&m_BMPInfoHeader.colorUse,1,sizeof

(m_BMPInfoHeader.colorUse),fp1);

fwrite(&m_BMPInfoHeader.colorImportant,1,sizeof

(m_BMPInfoHeader.colorImportant),fp1);

fwrite(rgb_buffer,3*nWidth*nHeight,1,fp1);

return

0;

}

//主函数

#include

#include

#include

#include "rgb2bmp.h"

int

main()

{

FILE

* p;

char

* filename =

"rgb888_800_480_woman"

;

int

nWidth = 800;

int

nHeight = 480;

char

* newFile =

"bmp2s (copy).bmp"

;

p = fopen(filename,"rb"

);

if

(p == NULL)

{

printf("!!!file %s open failed.n"

, filename);

return

0;

}

printf("file %s open success.n"

,filename);

long

nData = nWidth*nHeight*3;

char

* rgb_buffer = malloc(nData*

sizeof

(

char

));

char

* pVisit = rgb_buffer;

fread(rgb_buffer,1,nData,p);

printf("read file over.nData%ldn"

,nData);

FILE

*result = fopen(newFile,

"wb"

);

if

(result == NULL)

{

printf("open new file failed.n"

);

return

-1;

}

RGB2BMP(rgb_buffer,nWidth,nHeight,result);

fclose(result);

return

0;

}

头文件

[cpp]

view

plaincopy

//rgb2bmp.h头文件

#include

typedef

unsigned

char

BYTE

;

typedef

unsigned

short

WORD

;

// BMP图像各部分说明如下

typedef

struct

{    long

imageSize;

long

blank;

long

startPosition;

}BmpHead;

typedef

struct

{

long

Length;

long

width;

long

height;

WORD

colorPlane;

WORD

bitColor;

long

zipFormat;

long

realSize;

long

xPels;

long

yPels;

long

colorUse;

long

colorImportant;

}InfoHead;

typedef

struct

{

BYTE

rgbBlue;

BYTE

rgbGreen;

BYTE

rgbRed;

BYTE

rgbReserved;

}RGBMixPlate;

gcc编译后生成可执行文件,关于分辨率及文件名,可自行修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值