Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 计算亮度和对比度类似于新的Adobe Photoshop或Lightroom函数_Image_Colors_Photoshop_Contrast - Fatal编程技术网

Image 计算亮度和对比度类似于新的Adobe Photoshop或Lightroom函数

Image 计算亮度和对比度类似于新的Adobe Photoshop或Lightroom函数,image,colors,photoshop,contrast,Image,Colors,Photoshop,Contrast,我正在尝试创建类似于新的Adobe Photoshop或Lightroom亮度和对比度过滤器的亮度和对比度过滤器。我正在做RGB->XYZ-xyY转换,随着像素亮度(Y)的增加(不是线性增加,亮度增加是根据像素亮度计算的),然后转换回XYZ和RGB,尝试获得尽可能相似的值来测试我在Adobe中用来增加亮度的图像。我没有得到类似的结果,因为我认为我遗漏了一些东西,可能是gamma计算,或者图像在sRGB空间中进行了一些颜色空间转换,或者我只是在颜色转换代码中有bug?下面是我在Objective-

我正在尝试创建类似于新的Adobe Photoshop或Lightroom亮度和对比度过滤器的亮度和对比度过滤器。我正在做RGB->XYZ-xyY转换,随着像素亮度(Y)的增加(不是线性增加,亮度增加是根据像素亮度计算的),然后转换回XYZ和RGB,尝试获得尽可能相似的值来测试我在Adobe中用来增加亮度的图像。我没有得到类似的结果,因为我认为我遗漏了一些东西,可能是gamma计算,或者图像在sRGB空间中进行了一些颜色空间转换,或者我只是在颜色转换代码中有bug?下面是我在Objective-C中使用的颜色转换函数:

-(void) convertRGBcolor:(cColorRGB*) pRGB toXYZcolor:(zColorXYZ*) pXYZ
{
    if(pRGB == nil || pXYZ == nil) {
        return;
    }

    double var_R = ( pRGB->r / 255.0 );
    double var_G = ( pRGB->g / 255.0 );
    double var_B = ( pRGB->b / 255.0 );

    if ( var_R > 0.04045 ) var_R = pow((( var_R + 0.055 ) / 1.055 ) , 2.4);
    else                   var_R = var_R / 12.92;
    if ( var_G > 0.04045 ) var_G = pow((( var_G + 0.055 ) / 1.055 ) , 2.4);
    else                   var_G = var_G / 12.92;
    if ( var_B > 0.04045 ) var_B = pow((( var_B + 0.055 ) / 1.055 ) , 2.4);
    else                   var_B = var_B / 12.92;

    var_R = var_R * 100;
    var_G = var_G * 100;
    var_B = var_B * 100;

    //Observer. = 2°, Illuminant = D65
    pXYZ->X = var_R * 0.4124 + var_G * 0.3576 + var_B * 0.1805;
    pXYZ->Y = var_R * 0.2126 + var_G * 0.7152 + var_B * 0.0722;
    pXYZ->Z = var_R * 0.0193 + var_G * 0.1192 + var_B * 0.9505;
}

-(void) convertXYZcolor:(zColorXYZ*) pXYZ toRGBcolor:(cColorRGB*) pRGB
{
    if(pRGB == nil || pXYZ == nil) {
        return;
    }

    double var_X = pXYZ->X / 100;        //X from 0 to  95.047
    double var_Y = pXYZ->Y / 100;        //Y from 0 to 100.000
    double var_Z = pXYZ->Z / 100;        //Z from 0 to 108.883

    double var_R = var_X *  3.2406 + var_Y * -1.5372 + var_Z * -0.4986;
    double var_G = var_X * -0.9689 + var_Y *  1.8758 + var_Z *  0.0415;
    double var_B = var_X *  0.0557 + var_Y * -0.2040 + var_Z *  1.0570;

    if ( var_R > 0.0031308 ) var_R = 1.055 * ( pow( var_R,(1/2.4))) - 0.055;
    else                     var_R = 12.92 * var_R;
    if ( var_G > 0.0031308 ) var_G = 1.055 * ( pow( var_G,(1/2.4))) - 0.055;
    else                     var_G = 12.92 * var_G;
    if ( var_B > 0.0031308 ) var_B = 1.055 * ( pow( var_B,(1/2.4))) - 0.055;
    else                     var_B = 12.92 * var_B;

    pRGB->r = var_R * 255;
    pRGB->g = var_G * 255;
    pRGB->b = var_B * 255;
}

-(void) convertYxycolor:(zColorYxy*) pYxy toXYZcolor:(zColorXYZ*) pXYZ
{
    if(pYxy == nil || pXYZ == nil) {
        return;
    }

    pXYZ->X = pYxy->x * ( pYxy->Y / pYxy->y );
    pXYZ->Y = pYxy->Y;
    pXYZ->Z = ( 1 - pYxy->x - pYxy->y ) * ( pYxy->Y / pYxy->y );
}

-(void) convertXYZcolor:(zColorXYZ*) pXYZ toYxycolor:(zColorYxy*) pYxy
{
    if(pYxy == nil || pXYZ == nil) {
        return;
    }

    pYxy->Y = pXYZ->Y;
    pYxy->x = pXYZ->X / ( pXYZ->X + pXYZ->Y + pXYZ->Z );
    pYxy->y = pXYZ->Y / ( pXYZ->X + pXYZ->Y + pXYZ->Z );
}