GraphicsMagick 的 OpenCL 开发记录(十二)

文章目录

  • 关于`ImageMagick`中的`number_channels`成员(二)
  • 对`number_channels`的处理

<2022-03-28 Mon>

关于ImageMagick中的number_channels成员(二)

在“关于ImageMagick中的number_channels成员(一)”的结尾提到将计算出来的number_channels值加1才能显示正确的图形,之前说它是临时方案,看来这次要将它变成永久的了。

number_channels=(cl_uint) calc_image_number_channels(image)+1;

通过详细阅读GraphicsMagickImageMagickHorizontalFilter()函数发现ImageMagick的最内层循环是通过:

static inline size_t GetPixelChannels(const Image *magick_restrict image)
{
  return(image->number_channels);
}

来获得的,而GraphicsMagick中没有这么做,它比ImageMagick少了刚刚提到的这一层循环,改为固定设置四个通道的值。代码在前面的笔记中已给出,见:“对ImageMagicknumber_channelsPixelChannelMap结构体中的channeloffset成员的理解”。

我觉得这样的话反而简单了,我需要修改kernel函数和GraphicsMagick的自身处理相匹配,或者去掉number_channels成员,用固定值4代替?

kernel函数我相信现在修改它没什么难度,这两天翻来覆去的看accelerate-kernels-private.h:ResizeVerticalFilter()函数并和HorizontalFilter()进行对比理解,现在已经胸有成竹了。

<2022-03-29 Tue>

number_channels的处理

今天开始尝试对number_channels进行处理,我的想法是既然number_channelsGraphicsMagick中已经失去了它的意义,那倒不如直接把它删除掉,在它曾经出现过的地方用数字4代替。当然也不是所有number_channels的地方都要修改,要看具体情况而定。

首先,我从ImageMagick中重新拷贝了accelerate-kernels-private.h文件,因为之前那些的修改是基于错误的number_channels逻辑的。其次number_channels的传参部分不能删除,因为原GraphicsMagick中对于图片是否有透明通道或者是否是CMYK的格式有做判断,因此将它改为matte_or_cmyk来表明是否是四通道,1表示有,0表示没有,这样的话在accelerate-kernels-private.hResizeHorizontalFilter()函数中alpha_index就可以删除了。最后在WriteAllChannels()处的调用,必须以4传入,因为即使原图不是四通道,它的第四个通道也要赋值以保证图片计算的正确性。

经过这些修改之后测试图片显示正常。

commit:remove number_channels in GM, everything looks ok。

你可能感兴趣的:(GraphicsMagick,的,OpenCL,开发,GraphicsMagick,ImageMagick,OpenCL,c++)