Как удалить все "черные пиксели" из двоичного файла (изображения)?
Я ищу наиболее эффективный код, который удаляет все черные пиксели = #{000000} из двоичного файла. Пример кода:
img: make image! [100x75 0.0.255]
loop 1000 [change at img random 99x74 0.0.0]
probe length? foo: copy img/rgb
probe delta-time [remove-each [r g b] foo [ all [zero? r zero? g zero? b] ]]
probe length? foo
foo: copy img/rgb
probe delta-time [trim/with foo #{000000}]
probe length? probe foo
Trim работает довольно быстро, но не работает так, как предполагалось, так как он удаляет все нулевые байты #{00} из двоичного файла.
Какой самый быстрый код для удаления всех "черных пикселей" = три нулевых байта = #{000000} из двоичного файла? Есть еще предложения? Может быть, использование разбора работает лучше?
2 ответа
Решение
В четыре раза быстрее чем Remove-каждый пример:-)
print "=========="
probe length? foo: copy img/rgb
new: make binary! length? foo
probe delta-time [
parse foo [
here:
there:
any [
#{000000} (append/part new here there ) here: there:
| 3 skip there:
]
(append/part new here there )
]
]
probe length? new
Результаты
; remove-each
==========
0:00:00.003395
19683
; parse with concatenated append
==========
0:00:00.000872
19683
Использование PARSE и создание новой двоичной серии должно быть самым быстрым методом:
probe length? foo: copy img/rgb
new: make binary! length? foo
probe delta-time [
parse foo [any [s: #{000000} | 3 skip (append/part new s 3)]]
]
probe length? new
Здесь он работает почти в два раза быстрее, чем при использовании REMOVE-EACH.