所以我不是编码方面的专家:我只是对一点点和一点点的模糊理解。
我理解像素尺寸X * Y的图像存储在大小为3 * X * Y的数组中,其中从给定(x,y)值拉出的每个矢量具有3个RGB元素值的元素。
我也明白,人们还可以将图像存储在4 * X * Y阵列中,其中每个拉出的矢量现在有4个值,RGBA,A为Alpha,用于表示特定像素的不透明度。
现在我进入动画,并在黑色背景上绘制了白云的铅笔画,我想将其导入Flash。我希望图纸的黑色部分更透明,更轻的部分更不透明。我扫描了以.png格式保存的图纸。
如果我知道如何在阵列级别操作图像,我可以自己捅一下,但我不知所措。
我需要一个程序,在给定.png图像和参考RGB值{abc}的情况下,获取图像的RGB数组并将其转换为RBGA数组 ,以便:
RGB值{p q r}
的像素......变得......
RGBA值的像素{p q r 1-M [(| p-a | ^ 2 + | q-b | ^ 2 + | r-c | ^ 2)^ 1/2]}。
其中M是使最大alpha值= 1的归一化因子。
即。 M = 1 / [(255 ^ 2 + 255 ^ 2 + 255 ^ 2)^ 1/2])= 0.0026411 ...
即。替换像素的alpha值是'距离'在像素的颜色和可以输入的一些参考颜色之间。
然后需要将新的RGBA数组导出为png图像。
任何想法或任何动画师都知道这是否可以直接用动作来完成?
示例:参考= {250 251 245}
RGB array =
| {250 251 245} {250 250 250} |
| {30 255 22} {234 250 0} |
......变得......
RGBA数组=
| {250 251 245 1} {250 251 245 0.987} |
| {30 255 22 0.173} {234 250 0 0.352} |
答案 0 :(得分:0)
您只需在命令行中使用 ImageMagick 即可完成此操作,该驱动程序安装在大多数Linux发行版上,可在OSX和Windows上免费使用。
"秘密酱#34; 是-fx
运算符 - 描述为here。
因此,让我们生成一个300x200的黑色图像,然后使用-fx
来计算红色通道,以便红色根据宽度的一小部分(w
)在整个图像中变化我们来自左侧(i
):
convert -size 300x200 xc:black -channel R -fx 'i/w' result.png
请注意,我正在使用-size 300x200 xc:black
生成图像"动态" ,而如果您的动画帧中包含PNG文件,你可以把它放在它的位置。
现在让我们说我们想要改变不透明度/ alpha - 根据图像从顶部的距离:
convert -size 300x200 xc:black -alpha on \
-channel R -fx 'i/w' \
-channel A -fx 'j/h' result.png
好的,我们到了那里......你的功能有点复杂,所以,不是每次都在命令行输入它,我们可以将它放在一个名为RGB2Opacity.fx
的脚本文件中,就像这样:
convert -size 300x200 xc:black -alpha on -channel A -fx @RGB2Opacity.fx result.png
其中RGB2Opacity.fx
很简单,暂时看起来像这样:
0.2
现在我们需要在动画帧的命令行上放置"引用" 像素,以便 ImageMagick 可以解决差异。这意味着您的实际命令行看起来或多或少与以下内容完全相同:
convert -size 300x200 xc:"rgb(250,251,245)" YourImage.png -alpha on -channel A -fx @RGB2Opacity.fx result.png
然后我们需要在-fx
脚本文件中实现您的公式。您的变量名称必须至少为2个字母且没有数字,并且您应该为不透明度返回单个值。变量都在[0,1.0]之间缩放,所以你的255缩放有点不同。我没有样本图像,我不确定答案应该如何看,但它将非常接近这个:
MM=1/pow(3,0.5);
pmasq=pow((u.r-v.r),2.0);
qmbsq=pow((u.g-v.g),2.0);
rmcsq=pow((u.b-v.b),2.0);
1-MM*pow((pmasq+qmbsq+rmcsq),0.5)
我不知道是否/如何在-fx
脚本中添加评论,因此我将在下面解释变量名称:
pmasq
是p
减去a
的平方。
qmbsq
是q
减去b
的平方。
rmcsq
是r
减去c
的平方。
u.r
是指 ImageMagick 列表中第一个图片的红色频道,即您参考的红色频道像素。
v.g
是指 ImageMagick 列表中第二图像的绿色通道,即动画的绿色通道帧。
现在让我们创建你的动画帧:
convert xc:"rgb(250,251,245)" xc:"rgb(250,250,250)" xc:"rgb(30,255,22)" xc:"rgb(234,250,0)" +append frame.png
并检查它看起来是否正确:
convert frame.png txt:
<强>输出强>
# ImageMagick pixel enumeration: 4,1,65535,srgb
0,0: (64250,64507,62965) #FAFBF5 srgb(250,251,245)
1,0: (64250,64250,64250) #FAFAFA grey98
2,0: (7710,65535,5654) #1EFF16 srgb(30,255,22)
3,0: (60138,64250,0) #EAFA00 srgb(234,250,0)
如果我们将这个应用到您的图片并检查结果,您可以看到我在某个地方稍微有点错误,但我会留下您(或其他一些明亮的火花)来解决这个问题...
convert -size 4x1 xc:"rgb(250,251,245)" frame.png -alpha on -channel A -fx @RGB2Opacity.fx result.png
convert result.png txt:
# ImageMagick pixel enumeration: 4,1,65535,srgba
0,0: (64250,64507,62965,65535) #FAFBF5FF srgba(250,251,245,1)
1,0: (64250,64507,62965,64764) #FAFBF5FC srgba(250,251,245,0.988235)
2,0: (64250,64507,62965,19018) #FAFBF54A srgba(250,251,245,0.290196)
3,0: (64250,64507,62965,29041) #FAFBF571 srgba(250,251,245,0.443137)