メインコンテンツへスキップ

⚠️ Please note that this topic or post has been archived. The information contained here may no longer be accurate or up-to-date. ⚠️

Fuji & odd behaviour of C1v12

コメント

16件のコメント

  • Paul Steunebrink
    2) Auto Curve? Do you mean Auto Levels?
    0
  • Dave R
    [quote="Paul_Steunebrink" wrote:
    2) Auto Curve? Do you mean Auto Levels?

    No I think he does mean auto curves, Auto is one of the choices in the drop down where you select Fuji film simulation. I played with this quite a bit on the V12 Beta and got the feeling that auto would select the in camera setting recorded in the metadata. The problem is that there is no obvious way of finding which curve auto has selected and there a lot of them.
    0
  • Dave R
    [quote="deejjjaaaa" wrote:
    1) selecting "curve" = AUTO or Fuji film emulations removes Lab or RGB readouts in viewer toolbar

    2) apparently (at least for X-H1 model) the AUTO curve is "Luma" based and not "RGB" (unlike how it is for most of other camera makes) - is it so ?

    The readout problem was reported as a bug in the beta programme but the reading does appear on local readouts if you apply a few of those to picture (they are in the colour sampler tool drop down right at the bottom)
    0
  • dee jjjaaaa
    [quote="David532" wrote:
    but the reading does appear on local readouts


    I know - hence I wrote "in viewer toolbar" ... it is not convenient to put it mildly to operate with sticky color readouts placed in frame ... it is the bug clearly
    0
  • dee jjjaaaa
    [quote="David532" wrote:
    got the feeling that auto would select the in camera setting recorded in the metadata.


    the way C1 works (or used to work) is:

    1) camera profile (.icc) has a (non standard, private) tag P1FC (it remember the name correctly) - there u can put a name of default "curve"

    2) .fcrv file will be selected by default (unless overwritten in UI with different defaults by user) by C1 using that name from P1FC tag

    3) "auto" is a genuine curve file (.fcrv)

    4) for Fuji (my X-H1) that .fcrv file for "AUTO" curve behaves like there is a flag inside instructing to apply curve in HSL/HSV/HSB coordinates to luminosity coordinate and not like it used to be applying the same curve to all 3 RGB coordinates ... no noticeable saturation increase with increased contrast when selecting "AUTO" curve... I need to dig into binary code of .fcrv file , but it seems that one specific byte there is notably different from what was in AUTO or FILM .fcrv files from other camera makes
    0
  • dee jjjaaaa
    [quote="Paul_Steunebrink" wrote:
    2) Auto Curve? Do you mean Auto Levels?


    as noted I mean "Curve" = "Auto", in base characteristics

    I long time ago abandoned using "auto" or "film", till I recently selected one for X-H1 raw and was surprised with unexpected behaviour... so why for Fuji ?
    0
  • SFA
    https://help.phaseone.com/en/CO12/Editi ... stics.aspx

    Just for information to help this discussion along.

    For Fuji cameras the "Auto" setting for the ICC Profile will try to pick any Film curve profile that was set for the camera when the image was shot.

    Whether that can or should have any influence over the way that colour readouts are presented (or not presented) in the viewer tool bar I don't know. I have yet to dive into that part of the User Guide to find out if it tells us anything!


    Grant
    0
  • Paul Steunebrink
    [quote="deejjjaaaa" wrote:
    [quote="Paul_Steunebrink" wrote:
    2) Auto Curve? Do you mean Auto Levels?


    as noted I mean "Curve" = "Auto", in base characteristics

    I long time ago abandoned using "auto" or "film", till I recently selected one for X-H1 raw and was surprised with unexpected behaviour... so why for Fuji ?

    Thanks, got it.

    For some reason this issue affects both macOS and Windows version of CO 12.0.
    0
  • SFA
    [quote="SFA" wrote:
    https://help.phaseone.com/en/CO12/Editing-photos/Working-with-colors/Base-characteristics.aspx

    Just for information to help this discussion along.

    For Fuji cameras the "Auto" setting for the ICC Profile will try to pick any Film curve profile that was set for the camera when the image was shot.

    Whether that can or should have any influence over the way that colour readouts are presented (or not presented) in the viewer tool bar I don't know. I have yet to dive into that part of the User Guide to find out if it tells us anything!


    Grant


    No special mention of different operation for Fuji files in that section of the User Guide so I would assume it is meant t work the same way.

    From what appears on screen it seems to be going through the process of calculating the values but does not show them. Odd.


    Grant
    0
  • dee jjjaaaa
    [quote="SFA" wrote:
    https://help.phaseone.com/en/CO12/Editing-photos/Working-with-colors/Base-characteristics.aspx

    Just for information to help this discussion along.

    For Fuji cameras the "Auto" setting for the ICC Profile will try to pick any Film curve profile that was set for the camera when the image was shot.

    Whether that can or should have any influence over the way that colour readouts are presented (or not presented) in the viewer tool bar I don't know. I have yet to dive into that part of the User Guide to find out if it tells us anything!


    Grant


    yes, RTFM 😊... I did not bother to check and turns my issues with "AUTO" behaving differently were easy to explain... I was using "eterna" hence the effect... so duly noted that for Fuji cameras "auto" curve is not actually using the curves data in it file itself, but really hints to select the other .fcrv file (was Eterna in my case)

    Thx
    0
  • dee jjjaaaa
    started to write some matlab code to dig into .fcrv files - hence v0.01 (pardon the clumsy code - will polish eventually)... some binary fields values are not known

    v2018.12.04.0003


    %%
    function s_FCRV = f_getFCRV ( c_FolderName, c_FileName ); try

    %%
    % get all the bytes from .fcrv file
    h_File = fopen( strcat(c_FolderName, '\' , c_FileName), 'r' );
    an_FileBytes(:,1) = fread(h_File,'ubit8=>ubit8'); % nnn x 1 uint8, in one column
    fclose(h_File);

    %%
    % "ac_Debug" field will be used for a 'visual' debugging, to see the progress with parsing bytes from .fcrv file
    s_FCRV.ac_Debug(:,1) = num2cell(an_FileBytes); % each row = one byte
    s_FCRV.ac_Debug(:,2) = {' '}; % here goes a comment where the byte belongs
    s_FCRV.ac_Debug(:,3) = {' '}; % here goes a numberical interpretation of 4 x byte (DWord) fields in DEC, HEX, BIN, etc formats

    %%
    %
    s_FCRV.c_MakeModelCurve = c_FileName;
    s_FCRV.Header = an_FileBytes(1:6);

    %%
    s_FCRV.an_Format = ( an_FileBytes(1:2) )'; % first 2 bytes
    s_FCRV.ac_Debug(1:2,2) = {'First 2 bytes indicate how bytes in 4 x byte fields stored: little endian [73 73] or flipped order [77 77]'};

    %%
    % how many data fields
    % 2 = [77 77 0 0 0 2] = PhaseOneLightPhase-Film Natural Black.fcrv - the only such .fcrv file with 2 fields (it has 1st curve, followed by DWORD, followed by curve description & name
    % 4 = Canon 1Ds and some old Phase backs... the same as "2" + 16 bytes, so apparently those 16 bytes are 2 extra data fields ???...
    % 5 = some really old dSLRs & P&S cameras and non raw files... the same as "4" + extra 4 bytes (coded as field 6 in my code for now)
    % 6 = all modern cameras, the same as "5" + 2 more curves
    s_FCRV.n_DataFields = f_4Bytes2Number( an_FileBytes(3:6), s_FCRV.an_Format, 'uint32');
    s_FCRV.ac_Debug(3:6,2) = {'4 bytes showing how many data fields'};
    s_FCRV.ac_Debug(3:3,3) = {s_FCRV.n_DataFields};

    an_FPos = uint32([7:10]);% first 6 bytes is the header, 2 bytes for type, 4 bytes to show how many data fields

    %%
    % FCRV :: first curve size, how many X/Y pairs, UInt32 each
    s_FCRV.an_CurveSize(1) = f_4Bytes2Number( an_FileBytes(an_FPos), s_FCRV.an_Format, 'uint32');
    s_FCRV.ac_Debug(an_FPos,2) = {'UInt32 = how many X/Y points in the first curve'};
    s_FCRV.ac_Debug(an_FPos(1),3) = {s_FCRV.an_CurveSize(1)};
    an_FPos = an_FPos + 4;


    %%
    % FCRV :: extract the first curve
    an_FPos2 = an_FPos;
    for nI = 1:s_FCRV.an_CurveSize(1)
    s_FCRV.an_Curve(1,nI,:) = [f_4Bytes2Number(an_FileBytes(an_FPos), s_FCRV.an_Format,'uint32'); f_4Bytes2Number(an_FileBytes(an_FPos + 4), s_FCRV.an_Format,'uint32')];
    s_FCRV.ac_Debug(an_FPos+0,2) = {'X point, UInt32'};
    s_FCRV.ac_Debug(an_FPos+4,2) = {' Y point, UInt32'};
    an_FPos = an_FPos + (2 * 4);
    end;
    for nI = 1:s_FCRV.an_CurveSize(1)
    s_FCRV.ac_Debug(an_FPos2,3) = { single(s_FCRV.an_Curve(1,nI,1)) / max( single( s_FCRV.an_Curve(1,:,1) ) ) };
    s_FCRV.ac_Debug(an_FPos2(4),3) = { single(s_FCRV.an_Curve(1,nI,2)) / max( single( s_FCRV.an_Curve(1,:,2) ) )};
    an_FPos2 = an_FPos2 + (2 * 4);
    end;

    % set(0, 'DefaultFigureVisible', 'off'); % invisible plotting
    % set(0, 'DefaultFigureVisible', 'on'); % visible plotting
    % h_C1 = plot( double( s_FCRV.an_Curve(1,:,1) ) / max( double( s_FCRV.an_Curve(1,:,1) ) ), double( s_FCRV.an_Curve(1,:,2) ) / max( double( s_FCRV.an_Curve(1,:,2) ) ) );
    % saveas(h_C1, strcat( 'z:\' , c_FileName, '-1.jpg') );

    %%
    % FCRV :: First unknown data field = 4 bytes, probably UInt32 for bit flags : 00000000.00000000.00000000.00000001 or 00000000.00000000.00000000.00000010
    s_FCRV.an_DWORD(1,:) = (an_FileBytes(an_FPos))';
    s_FCRV.ac_Debug(an_FPos,2) = {'4 bytes - first unknown data field, typically values = 1 or 2, zero in the old FCRVs'};
    s_FCRV.ac_Debug(an_FPos(1),3) = {f_4Bytes2Number(s_FCRV.an_DWORD(1,:), s_FCRV.an_Format, 'uint32')};
    an_FPos = an_FPos + 4;


    %%
    % FCRV :: Length of the curve Description field as UInt32
    s_FCRV.n_CurveDescriptionLength = f_4Bytes2Number(an_FileBytes(an_FPos), s_FCRV.an_Format, 'uint32');
    s_FCRV.ac_Debug(an_FPos,2) = {'Length of the curve Description field as UInt32'};
    s_FCRV.ac_Debug(an_FPos(1),3) = {s_FCRV.n_CurveDescriptionLength};
    an_FPos = an_FPos + 4;


    %%
    % FCRV :: Curve Description - longer text
    s_FCRV.c_CurveDescription = strcat((an_FileBytes(an_FPos(1):an_FPos(1)+s_FCRV.n_CurveDescriptionLength-1))');
    s_FCRV.ac_Debug(an_FPos(1):an_FPos(1)+s_FCRV.n_CurveDescriptionLength-1,2) = num2cell(char([ (an_FileBytes(an_FPos(1):an_FPos(1)+s_FCRV.n_CurveDescriptionLength-1))' ] ));
    an_FPos = an_FPos + s_FCRV.n_CurveDescriptionLength;


    %%
    % FCRV :: Length of the curve Name field as UInt32
    s_FCRV.n_CurveNameLength = f_4Bytes2Number(an_FileBytes(an_FPos), s_FCRV.an_Format,'uint32');
    s_FCRV.ac_Debug(an_FPos,2) = {'Length of the curve name field as UInt32'};
    s_FCRV.ac_Debug(an_FPos(1),3) = {s_FCRV.n_CurveNameLength};
    an_FPos = an_FPos + 4;


    %%
    % FCRV :: Curve Description - shorter text
    s_FCRV.c_CurveName = strcat((an_FileBytes(an_FPos(1):an_FPos(1)+s_FCRV.n_CurveNameLength-1))');
    s_FCRV.ac_Debug(an_FPos(1):an_FPos(1)+s_FCRV.n_CurveNameLength-1,2) = num2cell( char([ (an_FileBytes(an_FPos(1):an_FPos(1)+s_FCRV.n_CurveNameLength-1)) ]) );
    an_FPos = an_FPos + s_FCRV.n_CurveNameLength;

    if ( s_FCRV.n_DataFields == 2 )
    s_FCRV.an_Curve2 = NaN;
    s_FCRV.an_Curve3 = NaN;
    return;
    end

    %%
    % remaining unknown binary fileds
    s_FCRV.an_DWORD(2,:) = (an_FileBytes(an_FPos))';
    s_FCRV.ac_Debug(an_FPos,2) = {'FCRV binary field #2'};
    n_UInt32 = f_4Bytes2Number(s_FCRV.an_DWORD(2,:), s_FCRV.an_Format,'uint32');
    s_FCRV.ac_Debug(an_FPos(1),3) = { sprintf('%u 0x%X %s',n_UInt32, n_UInt32, dec2bin(n_UInt32,32)) };
    an_FPos = an_FPos + 4; % advance by 4 bytes

    s_FCRV.an_DWORD(3,:) = (an_FileBytes(an_FPos))';
    s_FCRV.ac_Debug(an_FPos,2) = {' FCRV binary field #3'};
    n_UInt32 = f_4Bytes2Number(s_FCRV.an_DWORD(3,:), s_FCRV.an_Format, 'uint32');
    n_Single = f_4Bytes2Number(s_FCRV.an_DWORD(3,:), s_FCRV.an_Format, 'single');
    s_FCRV.ac_Debug(an_FPos(1),3) = { sprintf('INT32=%u HEX=0x%X FLOAT32=%f BIT=%s',n_UInt32, n_UInt32, n_Single, dec2bin(n_UInt32,32)) };
    an_FPos = an_FPos + 4;

    s_FCRV.an_DWORD(4,:) = (an_FileBytes(an_FPos))';
    s_FCRV.ac_Debug(an_FPos,2) = {' FCRV binary field #4'};
    n_UInt32 = f_4Bytes2Number(s_FCRV.an_DWORD(4,:), s_FCRV.an_Format, 'uint32');
    s_FCRV.ac_Debug(an_FPos(1),3) = { sprintf('INT32=%u HEX=0x%X BIT=%s',n_UInt32, n_UInt32, dec2bin(n_UInt32,32)) };
    an_FPos = an_FPos + 4;

    s_FCRV.an_DWORD(5,:) = (an_FileBytes(an_FPos))';
    s_FCRV.ac_Debug(an_FPos,2) = {' FCRV binary field #5'};
    n_UInt32 = f_4Bytes2Number(s_FCRV.an_DWORD(5,:), s_FCRV.an_Format, 'uint32');
    s_FCRV.ac_Debug(an_FPos(1),3) = { sprintf('INT32=%u HEX=0x%X BIT=%s',n_UInt32, n_UInt32, dec2bin(n_UInt32,32)) };
    an_FPos = an_FPos + 4;

    if ( s_FCRV.n_DataFields == 4 )
    s_FCRV.an_Curve2 = NaN;
    s_FCRV.an_Curve3 = NaN;
    return;
    end

    s_FCRV.an_DWORD(6,:) = (an_FileBytes(an_FPos))';
    s_FCRV.ac_Debug(an_FPos,2) = {' FCRV binary field #6'};
    n_UInt32 = f_4Bytes2Number(s_FCRV.an_DWORD(6,:), s_FCRV.an_Format, 'uint32');
    s_FCRV.ac_Debug(an_FPos(1),3) = { sprintf('INT32=%u HEX=0x%X BIT=%s',n_UInt32, n_UInt32, dec2bin(n_UInt32,32)) };
    an_FPos = an_FPos + 4;

    if ( s_FCRV.n_DataFields == 5 )
    s_FCRV.an_Curve2 = NaN;
    s_FCRV.an_Curve3 = NaN;
    return;
    end

    %%
    % FCRV :: second curve size, how many X/Y pairs, UInt32 each
    s_FCRV.an_CurveSize(2) = f_4Bytes2Number( an_FileBytes(an_FPos), s_FCRV.an_Format,'uint32');
    s_FCRV.ac_Debug(an_FPos,2) = {'UInt32 = how many X/Y points in the 2nd curve'};
    s_FCRV.ac_Debug(an_FPos(1),3) = {s_FCRV.an_CurveSize(2)};
    an_FPos = an_FPos + 4;


    %%
    % FCRV :: extract the second curve

    an_FPos2 = an_FPos;
    for nI = 1:s_FCRV.an_CurveSize(2)
    s_FCRV.an_Curve2(nI,:) = [f_4Bytes2Number(an_FileBytes(an_FPos), s_FCRV.an_Format,'uint32'); f_4Bytes2Number(an_FileBytes(an_FPos+4), s_FCRV.an_Format,'uint32')];
    s_FCRV.ac_Debug(an_FPos+0,2) = {'X point, UInt32'};
    s_FCRV.ac_Debug(an_FPos+4,2) = {' Y point, UInt32'};
    an_FPos = an_FPos + (2 * 4);
    end;
    for nI = 1:s_FCRV.an_CurveSize(2)
    s_FCRV.ac_Debug(an_FPos2(1)+0,3) = { single(s_FCRV.an_Curve2(nI,1)) / max( single( s_FCRV.an_Curve2(:,1) ) ) };
    s_FCRV.ac_Debug(an_FPos2(1)+1,3) = { single(s_FCRV.an_Curve2(nI,2)) / max( single( s_FCRV.an_Curve2(:,2) ) )};
    an_FPos2 = an_FPos2 + (2 * 4);
    end;

    % set(0, 'DefaultFigureVisible', 'off'); % invisible plotting
    % set(0, 'DefaultFigureVisible', 'on'); % visible plotting
    % h_C1 = plot( double( s_FCRV.an_Curve2(:,1) ) / max( double( s_FCRV.an_Curve2(:,1) ) ), double( s_FCRV.an_Curve2(:,2) ) / max( double( s_FCRV.an_Curve2(:,2) ) ) );
    % saveas(h_C1, strcat( 'z:\' , c_FileName, '-2.jpg') );


    %%
    % FCRV :: third curve size, how many X/Y pairs, UInt32 each
    s_FCRV.an_CurveSize(3) = f_4Bytes2Number( an_FileBytes(an_FPos), s_FCRV.an_Format,'uint32');
    s_FCRV.ac_Debug(an_FPos,2) = {'UInt32 = how many X/Y points in the 3rd curve'};
    s_FCRV.ac_Debug(an_FPos(1),3) = {s_FCRV.an_CurveSize(3)};
    an_FPos = an_FPos + 4;


    %%
    % FCRV :: extract the third curve
    an_FPos2 = an_FPos;
    for nI = 1:s_FCRV.an_CurveSize(3)
    s_FCRV.an_Curve3(nI,:) = [f_4Bytes2Number(an_FileBytes(an_FPos), s_FCRV.an_Format,'uint32'); f_4Bytes2Number(an_FileBytes(an_FPos+4), s_FCRV.an_Format,'uint32')];
    s_FCRV.ac_Debug(an_FPos+0,2) = {'X point, UInt32'};
    s_FCRV.ac_Debug(an_FPos+4,2) = {' Y point, UInt32'};
    an_FPos = an_FPos + (2 * 4);
    end;
    for nI = 1:s_FCRV.an_CurveSize(3)
    s_FCRV.ac_Debug(an_FPos2(1)+0,3) = { single(s_FCRV.an_Curve3(nI,1)) / max( single( s_FCRV.an_Curve3(:,1) ) ) };
    s_FCRV.ac_Debug(an_FPos2(1)+4,3) = { single(s_FCRV.an_Curve3(nI,2)) / max( single( s_FCRV.an_Curve3(:,2) ) ) };
    an_FPos2 = an_FPos2 + (2 * 4);
    end;

    % set(0, 'DefaultFigureVisible', 'off'); % invisible plotting
    % set(0, 'DefaultFigureVisible', 'on'); % visible plotting
    % h_C1 = plot( double( s_FCRV.an_Curve3(:,1) ) / max( double( s_FCRV.an_Curve3(:,1) ) ), double( s_FCRV.an_Curve3(:,2) ) / max( double( s_FCRV.an_Curve3(:,2) ) ) );
    % saveas(h_C1, strcat( 'z:\' , c_FileName, '-3.jpg') );


    catch h_Error; end
    end
    0
  • Paul Steunebrink
    Impressive 😉
    0
  • dee jjjaaaa
    [quote="Paul_Steunebrink" wrote:
    Impressive 😉

    the difficult part will to actually decipher what several fields do by comparing content between different files for different cameras & curves and trying to see what happens when you change certain values... so far I am just ironing out parsing the files, which is somewhat easy thing to do
    0
  • Rob Wiejak
    That's a lot of code you have presented here, but I do not believe the problem from your original post is in ‘fcrv’ files. If it was, then every camera would have the same issue, but it’s only with Fuji cameras. What I find interesting is that in the Film Curves folder in addition to ‘fcrv’ files there also are ‘p1x’ files that are only for Fuji cameras, no other camera has files ending with ‘p1x’ extension. That tells me that for Fuji cameras C1 has extra path/processing where the information from those ‘p1x’ files is used and the ‘readout’ information has not been implemented. I think I have evidence which in my opinion proves it: under normal usage for example ‘Linear Respond’ which is stock C1 curve all readouts work as expected: RGB readout above the main editor window, the Color Readout sticky, Curves, Histogram and Levels. The moment you engage the Fuji film profile the RGB readout above the main editor window and Histogram stops working. The way I see it: the Level and Curve display the values before processing therefore are not effected, Histogram and RGB readout (top of editor) display information after processing (not implemented) hence no display. The RGB Sticky is an odd one: it is after processing but is not effected by engaging of curve emulation, maybe because it is sampling the RGBA data directly from where the final image is stored in the computer’s memory (the final processing buffer).
    0
  • dee jjjaaaa
    [quote="NNN636735230673236717" wrote:
    but I do not believe the problem from your original post is in ‘fcrv’ files.

    the recent postings are not about the problem... I simply want to have better understanding how to manipulate .fcrv files, as it seem P1 does not want tell us know to create our own (as if it somehow will do any harm)
    0

投稿コメントは受け付けていません。