<2022-03-28 Mon>
关于ImageMagick
中的number_channels
成员(二)
在“关于ImageMagick
中的number_channels
成员(一)”的结尾提到将计算出来的number_channels
值加1
才能显示正确的图形,之前说它是临时方案,看来这次要将它变成永久的了。
number_channels=(cl_uint) calc_image_number_channels(image)+1;
通过详细阅读GraphicsMagick
和ImageMagick
的HorizontalFilter()
函数发现ImageMagick
的最内层循环是通过:
static inline size_t GetPixelChannels(const Image *magick_restrict image)
{
return(image->number_channels);
}
来获得的,而GraphicsMagick
中没有这么做,它比ImageMagick
少了刚刚提到的这一层循环,改为固定设置四个通道的值。代码在前面的笔记中已给出,见:“对ImageMagick
的number_channels
及PixelChannelMap
结构体中的channel
和offset
成员的理解”。
我觉得这样的话反而简单了,我需要修改kernel
函数和GraphicsMagick
的自身处理相匹配,或者去掉number_channels
成员,用固定值4
代替?
kernel
函数我相信现在修改它没什么难度,这两天翻来覆去的看accelerate-kernels-private.h:ResizeVerticalFilter()
函数并和HorizontalFilter()
进行对比理解,现在已经胸有成竹了。
<2022-03-29 Tue>
对number_channels
的处理
今天开始尝试对number_channels
进行处理,我的想法是既然number_channels
在GraphicsMagick
中已经失去了它的意义,那倒不如直接把它删除掉,在它曾经出现过的地方用数字4
代替。当然也不是所有number_channels
的地方都要修改,要看具体情况而定。
首先,我从ImageMagick
中重新拷贝了accelerate-kernels-private.h
文件,因为之前那些的修改是基于错误的number_channels
逻辑的。其次number_channels
的传参部分不能删除,因为原GraphicsMagick
中对于图片是否有透明通道或者是否是CMYK
的格式有做判断,因此将它改为matte_or_cmyk
来表明是否是四通道,1
表示有,0
表示没有,这样的话在accelerate-kernels-private.h
的ResizeHorizontalFilter()
函数中alpha_index
就可以删除了。最后在WriteAllChannels()
处的调用,必须以4
传入,因为即使原图不是四通道,它的第四个通道也要赋值以保证图片计算的正确性。
经过这些修改之后测试图片显示正常。