如何对 cairo 创建的图像和从文件加载的图像进行逐像素比较

How can one do a pixel by pixel comparison of an image created by cairo and an image loaded from a file

我在 nim 中有一些代码可以使用 Cairo (https://github.com/nim-lang/cairo). I would like to compare that picture to another using diffimg (https://github.com/SolitudeSF/diffimg, https://github.com/SolitudeSF/imageman) 创建图片。

但是内存映像类型似乎没有一个标准。有什么方法可以不先将图像保存到文件中吗?

可能最简单的方法出人意料地是自己实现 diffimg 算法。查看 diffimg 的来源显示比较算法是 about 20 lines of code:

func absDiff[T: ColorComponent](a, b: T): T {.inline.} =
  if a > b:
    a - b
  else:
    b - a

func getDiffRatio*[T: Color](a, b: Image[T]): float =
  for p in 0..a.data.high:
    for c in 0..T.high:
      result += absDiff(a[p][c], b[p][c]).float
  result / (T.maxComponentValue.float * a.data.len.float * T.len.float)

func genDiffImage*[T: Color](a, b: Image[T]): Image[T] =
  result = initImage[T](a.w, a.h)
  for p in 0..result.data.high:
    for c in 0..T.high:
      result[p][c] = absDiff(a[p][c], b[p][c])

加载图像的实际麻烦留给 imageman,但总而言之,它似乎减去两个图像之间的像素分量值并创建某种 average/ratio。由于 cairo 库似乎会为图像生成自己的、可能不兼容的内存布局,因此您很可能想忽略 imageman 并将要与自己进行比较的图像加载到 cairo 内存缓冲区中,然后复制差异算法遍历每个 caro 图像的像素。或者将 cairo 缓冲区转换为 imageman 缓冲区并让 diffimg 实现发挥它的魔力。