1. Python / Говнокод #16079

    −101

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    font = ImageFont.FreeTypeFont("%s.ttf" %font_family, font_size)
     
    for i in xrange(256):
        mask = font.getmask(charset[i])
        mask.save_ppm("c:\\tmp\\char.ppm")
    
        img = Image.open("c:\\tmp\\char.ppm")
    
        w, h = img.size
        mask_as_str = img.tostring()
        ...

    Бля, ну есть в PIL способ получить маску шрифта в виде строки, не используя такие костыли как сохранение в файл, и потом чтение из него?!!!

    Запостил: Pythoner, 29 Мая 2014

    Комментарии (12) RSS

    • когда вижу такие костыли, всегда задаюсь вопросом: какой именно конечный результат нужен?

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

      рендеринг TrueType шрифтов штука нетривиальная, и в общем случае:

      - побуквенный вывод будет работать только с monospace фрифтами, потому что все остальные шрифты будут выглядеть криво без кернинга.

      - "маска" слово не подходящее, более правильно "альфа канал" из-зи anti-aliasing. там есть еще фишка с цветами, в которую я доконца не врубаю: AA учитывает цвет бэкграунда и цвет шрифта при вычислении промежуточных цветов.

      - и самое главное, вывод буков ручками побуквенно будет тормозить, по сравнению с нормальных рендерингом.

      а если ты просто извращаешься, то сохранение во временный файл как бы и нет такая большая проблема. только возьми какую либу для работы с времеными файлами. гугление `mktemp python` чего-то находит.
      Ответить
      • Ну конечная цель простая - использовать в gles шрифты, нагенереные из стандартных ttf шрифтов. Дабы не тащить за собой лишних либ, типа ttflib, темболее что требуются всего один шрифт трех размеров. Способа работы с временными файлами не искал - и так справился.Тем не менее решение даже с mktemp менее костыльным не становится.
        Ответить
        • Я всё равно не понял, что ты пытаешься сделать. Какие данные тебе нужны?
          Если только пиксели, то ImageFont.getmask() возвращает объект Image, у которого вроде был метод tostring().
          Если полный файл, то AFAIK рекомендуется использовать StringIO чтобы загнать временный файл в память. Других вариантов нету.
          Ответить
          • getmask возвращает ImagingCore - нативный объект, у которого нет метода tostring. Есть еще возможность считаь попиксельно (метод getpixel), но это тоже какое то извращение.
            Ответить
            • А в Image его можно перегнать только через диск?

              Просто в том же Qt QPixmap и QImage без проблем конвертируются друг в друга. Неужели тут нет никакого способа?
              Ответить
        • "Ну конечная цель простая - использовать в gles шрифты, нагенереные из стандартных ttf шрифтов."

          для таких случаев, все шрифтовые библиотеки, тем более низкоуровневые, предоставляют доступ к векторному представлению шрифта. (glyph outline, glyph path)

          на виндах в далеком прошлом делал с помощью (если не ошибаюсь) GetGlyphOutline() вывод текста в opengl.

          "Дабы не тащить за собой лишних либ, типа ttflib, темболее что требуются всего один шрифт трех размеров."

          написать спец прогу и сгенерить растровые картинки. и картинки и прогу зачекинить, что бы если шрифт будет меняться, можно было потом картинки перегенерить.
          Ответить
          • > написать спец прогу
            Дык вон она, в топике. ОП же так и сделал ;)
            Ответить
            • тогда вопрос на чем у них оригинал писан.

              я представить себе не могу OSи на которой нету штатной TTF библиотеки без интерфейса к глифам.
              Ответить
    • Image.new(..) -> .paste(mask) сработало, выпрямляйте руки.
      Ответить
      • Тоже копал в этом направлении, видно не докопал. Доки не смотрел, тупо из консоли пробовал.
        Ответить
        • Даже pydoc?, ну тогда ссзб (тип 'L', для размеров суммы из mask.getbbox() тоже из консольки, но pydoc открывал)
          Ответить

    Добавить комментарий