Вы можете попробовать net-vips .Он не будет определять столько форматов изображений, как imagemagick, но будет выполнять основные операции TIF / JPG / PNG / GIF и т. Д., И это будет немного быстрее.
Я бы протестировал изображения, рассчитав среднее значение пикселя,Таким образом, вы гарантированно читаете каждый пиксель, и операция стоит дешево.
У меня на самом деле здесь не установлена C #, а в pyvips (привязка Python к той же библиотекекак net-vips), это будет:
import sys
import pyvips
for filename in sys.argv[1:]:
try:
# the fail option makes pyvips throw an exception on a file
# format error
# sequential access means libvips will stream the image rather than
# loading it into memory
image = pyvips.Image.new_from_file(filename,
fail=True, access="sequential")
avg = image.avg()
except pyvips.Error as e:
print("{}: {}".format(filename, e))
Я могу запустить его так:
$ for i in {1..1000}; do cp ~/pics/k2.jpg $i.jpg; done
$ cp ~/pics/k2_broken.jpg .
$ vipsheader 1.jpg
1.jpg: 1450x2048 uchar, 3 bands, srgb, jpegload
Это одно сломанное изображение, 1000 изображений OK, все 1450x2048.Тогда:
$ time ../sanity.py *.jpg
k2_broken.jpg: unable to call avg
VipsJpeg: Premature end of JPEG file
VipsJpeg: out of order read at line 48
real 0m23.424s
Итак, на этом скромном ноутбуке он обнаружил испорченное изображение за 23 секунды.
Ваш цикл с идентификацией (хотя тестируется только 100 изображений) будет:
$ time for i in {1..100}; do if ! identify -regard-warnings -verbose $i.jpg > /dev/null; then echo $i: error; fi; done
real 0m21.454s
Примерно столько же времени, поэтому net-vips примерно в 10 раз быстрее в этом тесте.
Поскольку net-vips относительно скромен с памятью, вы также можете запустить довольно много одновременно, в зависимости отсколько ядер у вас есть.Это должно дать почти линейное ускорение.
На этом двухъядерном ноутбуке с четырьмя потоками, которое я вижу:
$ time parallel --jobs 10 -m ../sanity.py ::: *.jpg
k2_broken.jpg: unable to call avg
VipsJpeg: Premature end of JPEG file
VipsJpeg: out of order read at line 48
real 0m10.828s
Теперь до 1 1001 изображений.