我已经在Matlab中移植了SVG合成标准(2009,https://www.w3.org/TR/2009/WD-SVGCompositing-20090430/)的24种方法中的大多数,但是四种方法(如减淡色)在比较if语句(例如:if Sca)中的图像时进行了中继== Sa && Dca == 0 ...),但是Matlab将此视为非标量运算符。
Sc,Dc是RGB图像 Sa,Da是代表Alpha通道的灰色蒙版 Dca,Sca是预乘的图像: Dca = Dc。* Da; Sca = Sc。* Sa;
if strcmp(compo_meth, 'color-dodge') == 1;
if Sca == Sa && Dca == 0
Dca = (1 - Da) .* Sca;
elseif Sca == Sa
Dca = Sa .* Da + (1 - Da) .* Sca + (1 - Sa) .* Dca;
elseif Sca < Sa
Dca = Sa .* Da .* min(1, Dca/Da .* Sa/(Sa - Sca));
end
Da = Sa + Da - Sa .* Da;
end
错误 如果Sca == Sa && Dca == 0
||的运算符和&&运算符必须可转换为逻辑标量值
答案 0 :(得分:0)
一个freelancer.com项目提供了以下建议,该建议比arrayfun版本快大约10倍以上,但如果Matlab像其他大多数其他方式一样可以直接使用SVG标准中的语法,则比预期慢5倍以上情况:
if strcmp(compo_meth, 'color-dodge') == 1
rc = (Sca == Sa) & (Dca == 0);
Dca(rc) = (1 - Da(rc)) .* Sca(rc);
rc1 = (Sca == Sa) & (Dca ~= 0);
Dca(rc1) = Sa(rc1) .* Da(rc1) + (1 - Da(rc1)) .* Sca(rc1) + (1 - Sa(rc1)) .* Dca(rc1);
rc2 = (Sca < Sa);
Dca(rc2) = Sa(rc2) .* Da(rc2) .* min(1, Dca(rc2)./Da(rc2) .* Sa(rc2)./(Sa(rc2) - Sca(rc2)));
Da = Sa + Da - Sa .* Da;
end