дисплей imagemagick: другой текст в просмотре шрифта

Контрольная сумма должна иметь детерминированное и однозначное представление файлов как строка. Детерминированный означает, что при помещении тех же файлов в те же местоположения Вы получите тот же результат. Однозначный означает, что два различных набора файлов имеют различные представления.

Данные и метаданные

Создание архива, содержащего файлы, является хорошим началом. Это - однозначное представление (очевидно, так как можно восстановить файлы путем извлечения архива). Это может включать метаданные файла, такие как даты и владение. Однако это еще не совершенно правильно: архив неоднозначен, потому что его представление зависит от порядка, в котором файлы хранятся, и если применимо на сжатии.

Решение состоит в том, чтобы отсортировать имена файлов прежде, чем заархивировать их. Если Ваши имена файлов не содержат новые строки, можно работать find | sort перечислить их и добавить их к архиву в этом порядке. Всего хорошего, чтобы сказать archiver не рекурсивно вызывать в каталоги. Вот примеры с POSIX pax, Tar GNU и cpio:

find | LC_ALL=C sort | pax -w -d | md5sum
find | LC_ALL=C sort | tar -cf - -T - --no-recursion | md5sum
find | LC_ALL=C sort | cpio -o | md5sum

Имена и содержание только, не использующий высокие технологии путь

Если Вы только хотите принять во внимание данные файла и не метаданные, можно сделать архив, который включает только содержание файла, но нет никаких стандартных инструментов для этого. Вместо включения содержания файла можно включать хеш файлов. Если имена файлов не содержат новых строк, и существуют только регулярные файлы и каталоги (никакие символьные ссылки или специальные файлы), это довольно легко, но действительно необходимо заботиться о нескольких вещах:

{ export LC_ALL=C;
  find -type f -exec wc -c {} \; | sort; echo;
  find -type f -exec md5sum {} + | sort; echo;
  find . -type d | sort; find . -type d | sort | md5sum;
} | md5sum

Мы включаем список каталогов в дополнение к списку контрольных сумм, поскольку в других отношениях пустые каталоги были бы невидимы. Список файлов отсортирован (в определенной, восстанавливаемой локали — благодаря Peter. O для напоминания мне этого). echo разделяет эти две части (без этого, Вы могли сделать некоторые пустые каталоги, на имя которых похожи md5sum вывод, который мог также передать для обычных файлов). Мы также включаем список размеров файла, для предотвращения дополнительных длиной нападений.

Между прочим, MD5 удерживается от использования. Если это доступно, рассмотрите использование SHA-2 или по крайней мере SHA-1.

Имена и данные, поддерживая новые строки на имена

Вот вариант кода выше этого, полагается на инструменты GNU для разделения имен файлов с пустыми байтами. Это позволяет именам файлов содержать новые строки. Утилиты обзора GNU заключают специальные символы в кавычки в своем выводе, таким образом, не будет неоднозначных новых строк.

{ export LC_ALL=C;
  du -0ab | sort -z; # file lengths, including directories (with length 0)
  echo | tr '\n' '\000'; # separator
  find -type f -exec sha256sum {} + | sort -z; # file hashes
  echo | tr '\n' '\000'; # separator
  echo "End of hashed data."; # End of input marker
} | sha256sum

Более устойчивый подход

Вот минимально протестированный сценарий Python, который создает хеш, описывающий иерархию файлов. Это берет каталоги и содержание файла в учетные записи и игнорирует символьные ссылки и другие файлы, и возвращает фатальную ошибку, если какой-либо файл не может быть считан.

#! /usr/bin/env python
import hashlib, hmac, os, stat, sys
## Return the hash of the contents of the specified file, as a hex string
def file_hash(name):
    f = open(name)
    h = hashlib.sha256()
    while True:
        buf = f.read(16384)
        if len(buf) == 0: break
        h.update(buf)
    f.close()
    return h.hexdigest()
## Traverse the specified path and update the hash with a description of its
## name and contents
def traverse(h, path):
    rs = os.lstat(path)
    quoted_name = repr(path)
    if stat.S_ISDIR(rs.st_mode):
        h.update('dir ' + quoted_name + '\n')
        for entry in sorted(os.listdir(path)):
            traverse(h, os.path.join(path, entry))
    elif stat.S_ISREG(rs.st_mode):
        h.update('reg ' + quoted_name + ' ')
        h.update(str(rs.st_size) + ' ')
        h.update(file_hash(path) + '\n')
    else: pass # silently symlinks and other special files
h = hashlib.sha256()
for root in sys.argv[1:]: traverse(h, root)
h.update('end\n')
print h.hexdigest()

1
01.04.2013, 08:46
3 ответа

Необходимо было бы изменить исходный код (более конкретно кодер TTF, строка 276) и перекомпилировать IM, если Вы хотите иметь другой текстовый образец в просмотре шрифта.

0
27.01.2020, 23:54

Существует скрипт для инструментов ImageMagick для отображения шрифтов с несколькими "колокольчиками и свистками". http://www.imagemagick.org/Usage/scripts/show_fonts.

1
27.01.2020, 23:54

(резюме из скрипта, указанного в другом ответе)

Используйте команду:

convert -font /path/to/file.ttf -pointsize 200 label:"text" out.png && display out.png

text— отображаемый текст. 200— размер шрифта, использованный в примере.

По какой-то причинеdisplay(илиmagick display)не распознают параметр -pointsize(, в то время какconvertраспознает ), поэтому я должен сохранить его во временном файле, а затем отобразить.(out.pngв этом примере, но может быть любым)

К сожалению, этот метод не позволяет легко отображать шрифт разных размеров, как в предварительном просмотре.

0
14.01.2021, 04:28

Теги

Похожие вопросы