BOOL MyColorSpace::RgbtoLuv(BYTE* inDatas, int width, int height, MyLUV* luvbuff) //将位图图像数据转换为LUV数据; { if (NULL == luvbuff) { CString tempstr; tempstr.Format("传入内存未分配,在MyColorSpace::RgbtoLuv"); AfxMessageBox(tempstr,NULL,MB_OK); return FALSE; } int i,j; FLOAT r,g,b; unsigned long pos; for(i=0;i<height;i++) { for (j=0;j<width;j++) { pos = i*width+j; r = (FLOAT)( (FLOAT)inDatas[3*pos+2] / 255. ); g = (FLOAT)( (FLOAT)inDatas[3*pos+1] / 255. ); b = (FLOAT)( (FLOAT)inDatas[3*pos] / 255. ); FLOAT x, y, z; Rgb2Xyz(r, g, b, x, y, z); FLOAT l, u, v; Xyz2Luv(x, y, z, l, u, v); luvbuff[pos].l = l; luvbuff[pos].u = u; luvbuff[pos].v = v; } } return TRUE; }
BOOL MyColorSpace::RgbtoXyz(BYTE* inDatas, int width, int height, FLOAT* xyzbuff) //将位图图像数据转换为HSV数据; { if (NULL == xyzbuff) { CString tempstr; tempstr.Format("传入内存未分配,在MyColorSpace::RGBtoHSV"); AfxMessageBox(tempstr,NULL,MB_OK); return FALSE; } int i, j; FLOAT r, g, b; FLOAT x, y, z; unsigned long pos; for(i=0;i<height;i++) { for (j=0;j<width;j++) { pos = (i*width+j) * 3; r = (FLOAT) ( (FLOAT)inDatas[pos+2] / 255. ); g = (FLOAT) ( (FLOAT)inDatas[pos+1] / 255. ); b = (FLOAT) ( (FLOAT)inDatas[pos] / 255. ); Rgb2Xyz(r, g, b, x, y, z); xyzbuff[pos] = x; xyzbuff[pos+1] = y; xyzbuff[pos+2] = z; } } return TRUE; }
void Rgb2Cat02lms(num *L, num *M, num *S, num R, num G, num B) { num X, Y, Z; Rgb2Xyz(&X, &Y, &Z, R, G, B); Xyz2Cat02lms(L, M, S, X, Y, Z); }
void Rgb2Lch(num *L, num *C, num *H, num R, num G, num B) { num X, Y, Z; Rgb2Xyz(&X, &Y, &Z, R, G, B); Xyz2Lch(L, C, H, X, Y, Z); }
void Rgb2Luv(num *L, num *u, num *v, num R, num G, num B) { num X, Y, Z; Rgb2Xyz(&X, &Y, &Z, R, G, B); Xyz2Luv(L, u, v, X, Y, Z); }
void Rgb2Lab(num *L, num *a, num *b, num R, num G, num B) { num X, Y, Z; Rgb2Xyz(&X, &Y, &Z, R, G, B); Xyz2Lab(L, a, b, X, Y, Z); }