📄 colorspace.cpp
字号:
#include <stdio.h>
#include "ColorSpace.h"
#include "BMP.h"
//确保数值在0-255
inline BYTE BYTE_SCOPE(double val)
{
int ival = (int)val;
if (ival < 0)
return 0;
if (ival > 255)
return 255;
return (BYTE)ival;
}
//转换彩色空间,公式如下
//Y = 0.299*R + 0.587*G + 0.114*B (Lum)
//Cb = - 0.1687*R - 0.3313*G + 0.5*B + 128 (Chr Blue)
//Cr = 0.5*R - 0.4187*G - 0.0813*B + 128 (Chr Red)
int RGB2YCrCb( BYTE Y[][MAX_WIDTH], BYTE Cr[][MAX_WIDTH/2], BYTE Cb[][MAX_WIDTH/2],BYTE R[][MAX_WIDTH], BYTE G[][MAX_WIDTH], BYTE B[][MAX_WIDTH],int width, int height )
{
int i, j;
int res;
if (width%2!=0 || height%2!=0)
return -1;
for (i=0; i<height; i++)
for (j=0; j<width; j++)
Y[i][j] = BYTE_SCOPE(0.299*R[i][j] + 0.587*G[i][j] + 0.114*B[i][j]);
for (i=0; i<height; i+=2)
for (j=0; j<width; j+=2)
{
Cr[i>>1][j>>1] = BYTE_SCOPE(0.5*R[i][j] - 0.4187*G[i][j] - 0.0813*B[i][j] + 128);
Cb[i>>1][j>>1] = BYTE_SCOPE(-0.1687*R[i][j] - 0.3313*G[i][j] + 0.5*B[i][j] + 128);
}
return 0;
}
//部分采样
void AlignBitplane16x16( BYTE R[][MAX_WIDTH], BYTE G[][MAX_WIDTH], BYTE B[][MAX_WIDTH],int *wid, int *hei, int width, int height)
{
int i, j;
if (width%16==0 && height%16==0)
{
*wid = width;
*hei = height;
return;
}
if (width%16 == 0)
*wid = width;
else
*wid = width+(16-width%16);
if (height%16 == 0)
*hei = height;
else
*hei = height+(16-height%16);
for (i=0; i<height; i++)
for (j=width; j<*wid; j++)
{
R[i][j] = R[i][width-1];
G[i][j] = G[i][width-1];
B[i][j] = B[i][width-1];
}
for (j=0; j<*wid; j++)
for (i=height; i<*hei; i++)
{
R[i][j] = R[height-1][j];
G[i][j] = G[height-1][j];
B[i][j] = B[height-1][j];
}
}
//获取RGB值
void Compact2Bitplane( BYTE R[][MAX_WIDTH], BYTE G[][MAX_WIDTH], BYTE B[][MAX_WIDTH],BYTE BGR[], int width, int height, int bpl )
{
int i, j, t1, t2;
for (i=0; i<height; i++)
{
t1 = height-i-1;
for (j=0; j<width; j++)
{
t2 = i*bpl+j*3;
R[t1][j] = BGR[t2+2];
G[t1][j] = BGR[t2+1];
B[t1][j] = BGR[t2];
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -