如何对 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
实现发挥它的魔力。
我在 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
实现发挥它的魔力。