<2022-03-17 Thu>
关于ImageMagick中的number_channels成员(一)
在ImageMagick中number_channels成员出现频率有点高,经调试发现ImageMagick中图片对象初始化时通过调用OpenPixelCache()然后在InitializePixelChannelMap()中设置number_channels的值。这个函数的内部大量使用了GraphicsMagick中没有类型PixelChannel和PixelTrait,不太好把它给搬到GraphicsMagick中。
查看PixelChannel的定义发现了它的一个特点是:虽然它是enum类型,但每个成员都被指派了具体的值,且发现有多个成员共用一个值的情况。以此参照仍然没有在GraphicsMagick中找到类似定义,PixelChannel的定义:
typedef enum
{
UndefinedPixelChannel = 0,
RedPixelChannel = 0,
CyanPixelChannel = 0,
GrayPixelChannel = 0,
LPixelChannel = 0,
LabelPixelChannel = 0,
YPixelChannel = 0,
aPixelChannel = 1,
GreenPixelChannel = 1,
MagentaPixelChannel = 1,
CbPixelChannel = 1,
bPixelChannel = 2,
BluePixelChannel = 2,
YellowPixelChannel = 2,
CrPixelChannel = 2,
BlackPixelChannel = 3,
AlphaPixelChannel = 4,
IndexPixelChannel = 5,
ReadMaskPixelChannel = 6,
WriteMaskPixelChannel = 7,
MetaPixelChannel = 8,
CompositeMaskPixelChannel = 9,
IntensityPixelChannel = MaxPixelChannels, /* ???? */
CompositePixelChannel = MaxPixelChannels, /* ???? */
SyncPixelChannel = MaxPixelChannels+1 /* not a real channel */
} PixelChannel; /* must correspond to ChannelType */
我模仿ImageMagick的InitializePixelChannelMap()函数写了calc_image_number_channels(),虽然number_channels的值对于同一张测试图片bg1a.jpg来说均为3,但是在IM中值3显示正确,而在GM中3 + 1才能正确,所以我在ComputeResizeImage()中将calc_image_number_channels()的返回值加上了1:
number_channels=(cl_uint) calc_image_number_channels(image)+1;
这只是临时方案,估计下面要更改抄过来的kernel函数。
见commit:calc number_channels, but need to plus 1 to get correct result。
本文分析了ImageMagick中number_channels成员的工作原理,指出GraphicsMagick与之存在的差异,并提到在GraphicsMagick中处理该问题的临时解决方案——在计算后加1。作者提到这只是一个临时措施,未来可能需要调整相关内核函数。
458

被折叠的 条评论
为什么被折叠?



