<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传入,因为即使原图不是四通道,它的第四个通道也要赋值以保证图片计算的正确性。
经过这些修改之后测试图片显示正常。
作者讨论了在ImageMagick中number_channels成员的处理,决定将其固定为4,以匹配GraphicsMagick的逻辑。删除了number_channels的多余使用,仅保留必要的判断,确保图像处理的正确性,代码已提交并测试通过。
457

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



