From a418ed9506c23323131871c95ff270ed5e1ffce5 Mon Sep 17 00:00:00 2001 From: Danny Greenstein Date: Thu, 14 May 2026 21:42:33 -0700 Subject: [PATCH] oiiotool: Add --nchannels flag for parity with maketx Signed-off-by: Danny Greenstein --- src/doc/oiiotool.rst | 8 ++++ src/oiiotool/oiiotool.cpp | 35 ++++++++++++++++++ testsuite/oiiotool/ref/out.txt | 12 ++++++ .../oiiotool/ref/single_channel_black.tif | Bin 0 -> 753 bytes .../oiiotool/ref/single_channel_good.tif | Bin 0 -> 3198 bytes .../oiiotool/ref/single_channel_good_r.exr | Bin 0 -> 4601 bytes .../oiiotool/ref/single_channel_good_y.exr | Bin 0 -> 9083 bytes testsuite/oiiotool/run.py | 22 +++++++++++ testsuite/oiiotool/src/single_channel_r.exr | Bin 0 -> 3791 bytes testsuite/oiiotool/src/single_channel_tif.tif | Bin 0 -> 3198 bytes testsuite/oiiotool/src/single_channel_y.exr | Bin 0 -> 8624 bytes 11 files changed, 77 insertions(+) create mode 100644 testsuite/oiiotool/ref/single_channel_black.tif create mode 100644 testsuite/oiiotool/ref/single_channel_good.tif create mode 100644 testsuite/oiiotool/ref/single_channel_good_r.exr create mode 100644 testsuite/oiiotool/ref/single_channel_good_y.exr create mode 100644 testsuite/oiiotool/src/single_channel_r.exr create mode 100644 testsuite/oiiotool/src/single_channel_tif.tif create mode 100644 testsuite/oiiotool/src/single_channel_y.exr diff --git a/src/doc/oiiotool.rst b/src/doc/oiiotool.rst index d06a21f6b8..ab1289fc72 100644 --- a/src/doc/oiiotool.rst +++ b/src/doc/oiiotool.rst @@ -2385,6 +2385,14 @@ current top image. name, nor value), then this will just leave the images as-is, without any unnecessary expense or pointless copying of images in memory. +.. option:: --nchannels + + Replaces the top image with a new image whose channels are the the first *n* + channels of the input image. If *n* is less than the number of + channels in the input image, the extra channels will simply be ignored. + If *n* is greater than the number of channels in the input image, the + additional channels will be filled with 0 values. + .. option:: --chappend Replaces the top two (or more) images on the stack with a single new diff --git a/src/oiiotool/oiiotool.cpp b/src/oiiotool/oiiotool.cpp index c86f3449f5..5c756d5fd1 100644 --- a/src/oiiotool/oiiotool.cpp +++ b/src/oiiotool/oiiotool.cpp @@ -2836,6 +2836,38 @@ action_channels(Oiiotool& ot, cspan argv) +// --nchannels +static void +action_nchannels(Oiiotool& ot, cspan argv) +{ + if (ot.postpone_callback(1, action_nchannels, argv)) + return; + + // Get the requested number of channels + int n = Strutil::stoi(ot.express(argv[1])); + if (n < 1) { + ot.errorfmt(argv[0], "nchannels must be at least 1 (got {})", n); + return; + } + + // We build the indices into a vector, then join them into a string. + std::vector indices; + for (int i = 0; i < n; ++i) + indices.push_back(i); + + // Convert to ustring to ensure the underlying char* is interned. + // This guarantees the pointer remains valid even if action_channels + // defers execution (postpones) beyond the scope of this function. + ustring channel_list(Strutil::join(indices, ",")); + + // Hand off to action_channels with our generated index list. + // this ensures we are always doing the same thing as --ch + const char* fake_argv[] = { argv[0], channel_list.c_str() }; + action_channels(ot, fake_argv); +} + + + // --chappend static void action_chappend(Oiiotool& ot, cspan argv) @@ -7277,6 +7309,9 @@ Oiiotool::getargs(int argc, char* argv[]) ap.arg("--ch %s:CHANLIST") .help("Select or shuffle channels (e.g., \"R,G,B\", \"B,G,R\", \"2,3,4\")") .OTACTION(action_channels); + ap.arg("--nchannels %d:N") + .help("Force the current image to have N channels (padding with 0.0 as needed)") + .OTACTION(action_nchannels); ap.arg("--chappend") .help("Append the channels of the last two images") .OTACTION(action_chappend); diff --git a/testsuite/oiiotool/ref/out.txt b/testsuite/oiiotool/ref/out.txt index 679adc453e..9b01433faa 100644 --- a/testsuite/oiiotool/ref/out.txt +++ b/testsuite/oiiotool/ref/out.txt @@ -62,6 +62,10 @@ oiiotool ERROR: -o : Non-existent output directory: folder1/folder2 Full command line was: > oiiotool --create 2x2 1 -o folder1/folder2/out.tif folder1/folder2/out.tif : 2 x 2, 1 channel, float tiff +WARNING: --ch: Unknown channel name "R", filling with 0 (actual channels: "Y") +WARNING: --ch: Unknown channel name "R", filling with 0 (actual channels: "Y") + channel list: Y + channel list: R Comparing "filled.tif" and "ref/filled.tif" PASS Comparing "autotrim.tif" and "ref/autotrim.tif" @@ -204,3 +208,11 @@ Comparing "box_over_missing2.tif" and "ref/box_over_missing2.tif" PASS Comparing "box_over_missing3.tif" and "ref/box_over_missing3.tif" PASS +Comparing "single_channel_black.tif" and "ref/single_channel_black.tif" +PASS +Comparing "single_channel_good.tif" and "ref/single_channel_good.tif" +PASS +Comparing "single_channel_good_y.exr" and "ref/single_channel_good_y.exr" +PASS +Comparing "single_channel_good_r.exr" and "ref/single_channel_good_r.exr" +PASS diff --git a/testsuite/oiiotool/ref/single_channel_black.tif b/testsuite/oiiotool/ref/single_channel_black.tif new file mode 100644 index 0000000000000000000000000000000000000000..27a3dc04d37af7326b92fcadcf2cbfe506ff14aa GIT binary patch literal 753 zcmah{yN=U96dflB(SQK)Xpp!XIz&8=*l|3HcgZ@6ND+cqBxoIH$XdY<*+w>L;6o_( zA1FaW@BtJQl>7mrq~&@sQ3@nRI+}CuJ#%07Y<8DiAcR~d#OM+O*?oku$2%Zw4RLkPe|?YNXgQ$fW~={#{MMdE7#(tizV8T${2JbX1-w?%Mf-S< zf9M$GHO8%`2|Tx3yu)U`A{LoWW^u6Avjy}`X>wB*Sp*8EE+0=_dph+8zUvR1$&ou5 zx&qCiV~zWLU-T_*Sz{u(w3XnB4?zqSca-Il(P5nh;YOFR)axkm=+E~bDMTxeKDFn3 zp85JDda%v)@%G`9aJvcJ6+JwFQLXAYi**@59luBlReLm8rAw`lH*QAZOj2$_1d6bn=nn05=Sf(#ak7A>LCWy0L z+N3bgrZK}bW_6G;Ve)38I8%PEgHlfr9{tBYDLVidv9@FEo$WS-#%|X-!39^i$@=Y& cPsT<3(w|R%E#gbgDbnV=sk(r_?tj9+0gvdTvH$=8 literal 0 HcmV?d00001 diff --git a/testsuite/oiiotool/ref/single_channel_good.tif b/testsuite/oiiotool/ref/single_channel_good.tif new file mode 100644 index 0000000000000000000000000000000000000000..d4755527cdeed6566a9124354c6c10d83905c69f GIT binary patch literal 3198 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 literal 0 HcmV?d00001 diff --git a/testsuite/oiiotool/ref/single_channel_good_r.exr b/testsuite/oiiotool/ref/single_channel_good_r.exr new file mode 100644 index 0000000000000000000000000000000000000000..95a21fbd390b411c5bdd11183d50162edb8178b0 GIT binary patch literal 4601 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 X&=FlFOs|2xCNlsk;~@_u+1CF9A}#uf literal 0 HcmV?d00001 diff --git a/testsuite/oiiotool/ref/single_channel_good_y.exr b/testsuite/oiiotool/ref/single_channel_good_y.exr new file mode 100644 index 0000000000000000000000000000000000000000..7dd8f3e3c531ab13e0f91f25de5ad6f726f996db GIT binary patch literal 9083 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 literal 0 HcmV?d00001 diff --git a/testsuite/oiiotool/src/single_channel_y.exr b/testsuite/oiiotool/src/single_channel_y.exr new file mode 100644 index 0000000000000000000000000000000000000000..c300c1af622e07c59a10cc165e68d51246a11aa4 GIT binary patch literal 8624 zcmbW64{%h~6~-Sa(?O>)QIWy1z$yVOO5EMN?`#qgAxT%F!2oIqEfZam4OtpCA-lyC z&`B#|wEU?w0!9d%5JHHHAUH8?(vYG;N`Tf>F;bNlW-M6z-&#kh?e`LJBgN=D`pG~h^exZG*t^`>~7o)ov~f;S`G^rU#au5?#YT9WsNE-#XtX;Zx!`M%N&U--*+ zUdea5oo=MMoT<)ahbuYN=}9$H@{4@Ipuad|1WMOHU zKNJd-1daap)_)Ez@P&P|1Hpol`;B=e_9=d=z>=mkzOIgXuQ1NQ|!!}&@fzbXH9)YAH& z<8IOL8Z<1EwX}Xn8suRdMg{(gk12zO%Rl$8Fz|?6KubIZjb~SEZ4|M6rvluu@C7p=Io{vBofCd3fuz+N?1e+D#3~jW;mze}`8vWo*Y)5qK~aji!c`5e=_ypH}A_ z9iI?!20XYR634rVaoe~RBQ@6_|>W>x@mRV;@FFESW^({TWuc$%z2 z6|z;-v3{`69Vlbgec5~)hp-9Hv4+@(OcjUt2Ky|+uh{B5yu<828;|1$%z(dC(ZlR% zpGNG(YE+mfsat>+T+jY@sL)l7)_n6MKEP>4KsoOVIEVgLMI385`vkEBf5B12O9ktP zw@5o9Lc=AZ!OyC>8jrH-I!M(&bLRP2RY$JF2+?4&zb)9z8DI_8Gk)6f1%K0^sTtgI zJLB#!K4lwv(8X2^mCdZfH2eq}j+qb9?=Ld;6@!!Na%?X^aC6m8ORGaEY`q`!zG?G~sSEa2-0q)X>cg zYM+l-?QX(ZTECt1prD9rptUOO=U(fHQ(SE{am;O{=YNj``k;w3f(D1R9l(8ngUlrM zi6SV^<1%T$PFDvU^hXV6Vhy`FpW0^^Jn}4K;SjcS9bArpc^Ge~(5(Yr#BpW;Cu46q zcL1hvPJV?u5gMwQ&+XGjpYO!G*y>u3_Zf!|VvPI&8jdid*ry4zFwy)wE5KUL#W}2m z++yF0))Shw>o}=m%^Bv?dpIU`axGlNSk%<>AxsbrMfCj7nSWp6EWCvt=t8RK>fp1? zCiW@79n3tt@E@~?(epWLk_?%_+T1>`L&HL(a{g?h?We(tfJNTc<`w7@pnedAA-hB+Dvv?KWXxmjzl5yj_?yT4dliyx&`9Mz ztasRF67x?c?(5A$4{`mK#X0EP+P_g^>QT|G9m;S!mD3r6<8c>z-)XMs^+_82GBB;w z?ynw|#n6z0nJ@uXAd{GLs!)laa8)`mUGnt*sYhi#G!%2qpUM`DMk2h}K>fS{cQd-g z;=;aL5wL(G$Ua`&%bl;=sD2ZDv6_1s`CnVb^l4vQo&Jw#NNLJ3H?Yr+ZM&V5>f<9F zHN!S-9CI-SR*y={4h_S`6^(H?D(mVSrZnW%W>t^8Hn92l_6zCkwYt>;EAGyZxY)IY zX9>FcYwy^-Tmk%;KFDGvT+V8!zVX8S>_r2rTiO;6L^QM@n)IaWiisoYX4H2$imokp z6eT=3J_fK))|}I~qCVDV>+ZbvT*(&udvMkhJNBNKuH(6s#RSg~0V~n-*6*+0r)~8* z#xT+Fq1?w)k6F^q{eXj5!c(!+T#*DN*|UJXZ)WfNtRGXiv}3)F>CfU@>@&#IEwky# z3MrL5ULTX2<%}d!f4l6LeD>b5{&{sv`>VZ<>8}tC5jjl@w90yUNruQ$$>+ITrNnvm z@V9)POIp@%?TxyN_d2FuFB4=8EqeZKB~uo&wK7xu=e2e{C|- zbAWGidRFsvZlm-tGT%p;d^;w4Gz^#T(YBAvW_lrmHcw*&eoF15a*M3vYP<_G#3Ms# JnQv;v{{Y|CYPtXb literal 0 HcmV?d00001