ImageMagick (hoặc khác) cho văn bản UTF-8 thành hình ảnh


8

Tôi đang cố gắng tạo nhiều hình ảnh một ký tự bằng cách sử dụng convert. Mục đích là để cung cấp cho một chuyên gia về nhựa hình ảnh để in lên bàn phím bàn phím.

Các tài liệu ImageMagick cho thấy một cái gì đó như thế này:

 printf "\u2318" | convert -size 100x100 label:@- -font unifont-Medium command.png

hoặc là

 echo ⌘ | convert -size 100x100 label:@- -font unifont-Medium command.png

hoặc là

 convert -size 100x100 label:'⌘' -font unifont-Medium command.png

được cho là in vị trí của biểu tượng quan tâm , nhưng thay vào đó, nó tạo ra một dấu hỏi.

Tôi đã xác nhận (sử dụng charmap) rằng bộ unifont-Mediumphông chữ thực sự bao gồm glyph này. Tôi biết rằng các phông chữ khác trên hệ thống của tôi cũng có thể cung cấp glyph này, bởi vì tôi có thể nhìn thấy nó trước khi cài đặt unifont, nhưng tôi không thể biết tên của chúng là gì.

Tôi cũng đã thử sử dụng LaTeX (ví dụ TexLive với tất cả các tính năng bổ sung và utf8xgói) nhưng không có ký tự đặc biệt nào được hỗ trợ.

Có rất nhiều câu hỏi trên diễn đàn về việc in các ký tự tiếng Trung Quốc bằng hình ảnh và các ký tự đặc biệt khác ... những điều sau đây có tác dụng với tôi:

convert -background lightblue -fill blue -pointsize 32 \
      label:' é è à ù ç Ö ÿ ‘ ’ “ ” ° ² ³ € x ÷ '    label_i8n.gif

nhưng nó chỉ không hoạt động đối với các ký tự UTF-8 thực sự quan trọng đối với tôi.

Làm thế nào tôi có thể chuyển đổi các ký tự unicode tùy ý thành hình ảnh?

CẬP NHẬT : Tôi đã từ bỏ, trông giống như một lỗi. Thay vào đó, tôi đã tạo ra một loạt các kịch bản để tạo và kết xuất SVG, mở nguồn ở đây: kinesis-dvorak


Tôi đã không sử dụng nó trong một thời gian dài, nhưng tôi khẳng định rằng bạn có thể làm điều này với thói quen "script-fu" đơn giản cho gimp . Điều này có thể không hữu ích cho bạn trừ khi bạn quen thuộc với wimp và biết cả lược đồ hoặc ngôn ngữ khác có chức năng bổ trợ (python, perl, tcl, có thể có nhiều hơn) - nhưng tôi mặc dù tôi đã ném nó ra khỏi đó chỉ trong trường hợp.
goldilocks

Ở trên cũng không làm việc cho tôi. Có vẻ như một lỗi trong hình ảnh, không?
slm

Btw. Tôi đã đặt câu hỏi liên quan: Cách kết hợp nhiều phông chữ thành một
Grzegorz Wierzowiecki

Câu trả lời:


10

Tôi đã thử các lệnh tương tự và nhận được kết quả tương tự.

$ printf "\u2318" | convert -size 100x100 label:@- \
        -font unifont-Medium command.png

                                                                           ss của phông chữ kết xuất

Thay đổi thành unicode cho chữ G hoạt động tốt mặc dù:

$ printf "\u0047" | convert -size 100x100 label:@- \
       -font unifont-Medium command.png

                                                                           G

Tôi sẽ đăng câu hỏi này lên trang Nghị luận ImageMagick để xem tại sao điều này xảy ra. Tôi có thể hỗ trợ nếu bạn không chắc chắn cách thực hiện hoặc tiến hành.

Chuyển đổi gỡ lỗi

Bạn có thể thêm công -debug annotatetắc để xem những gì convertđang xảy ra.

Thí dụ

$ printf "\u2318" | convert -size 100x100 label:@- -font unifont-Medium -pointsize 40 -debug annotate command.png
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 12
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 6.375; height: 14; ascent: 11; descent: -3; max advance: 24; bounds: 0.625,0  6.78125,8; origin: 7,0; pixels per em: 12,12; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 12
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 6.375; height: 14; ascent: 11; descent: -3; max advance: 24; bounds: 0.625,0  6.78125,8; origin: 7,0; pixels per em: 12,12; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 24
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 12.75; height: 28; ascent: 22; descent: -5; max advance: 48; bounds: 1.25,0  13.5781,18; origin: 15,0; pixels per em: 24,24; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 48
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 25.5156; height: 55; ascent: 43; descent: -10; max advance: 96; bounds: 2.48438,0  27.1406,35.5; origin: 29,0; pixels per em: 48,48; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 96
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 53.0312; height: 110; ascent: 87; descent: -20; max advance: 192; bounds: 4.96875,0  54.2812,70; origin: 59,0; pixels per em: 96,96; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 96
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 53.0312; height: 110; ascent: 87; descent: -20; max advance: 192; bounds: 4.96875,0  54.2812,70; origin: 59,0; pixels per em: 96,96; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 95
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 52.0781; height: 109; ascent: 86; descent: -20; max advance: 190; bounds: 4.92188,0  53.7188,70; origin: 58,0; pixels per em: 95,95; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 94
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 51.1406; height: 108; ascent: 85; descent: -20; max advance: 188; bounds: 4.85938,0  53.1562,68; origin: 57,0; pixels per em: 94,94; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 93
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 51.1875; height: 107; ascent: 84; descent: -20; max advance: 186; bounds: 4.8125,0  52.5781,67; origin: 57,0; pixels per em: 93,93; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 92
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 50.2344; height: 106; ascent: 83; descent: -19; max advance: 184; bounds: 4.76562,0  52.0156,67; origin: 56,0; pixels per em: 92,92; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 91
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 50.2969; height: 105; ascent: 82; descent: -19; max advance: 182; bounds: 4.70312,0  51.4531,65.4688; origin: 56,0; pixels per em: 91,91; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 90
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 49.3438; height: 103; ascent: 81; descent: -19; max advance: 180; bounds: 4.65625,0  50.8906,65.4688; origin: 55,0; pixels per em: 90,90; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 89
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 48.3906; height: 102; ascent: 81; descent: -19; max advance: 178; bounds: 4.60938,0  50.3281,64; origin: 54,0; pixels per em: 89,89; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 88
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 48.4375; height: 101; ascent: 80; descent: -19; max advance: 176; bounds: 4.5625,0  49.7656,64; origin: 54,0; pixels per em: 88,88; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 87
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 47.5; height: 100; ascent: 79; descent: -18; max advance: 174; bounds: 4.5,0  49.1875,63; origin: 53,0; pixels per em: 87,87; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 86
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 47.5469; height: 99; ascent: 78; descent: -18; max advance: 172; bounds: 4.45312,0  48.625,63; origin: 53,0; pixels per em: 86,86; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 86
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 47.5469; height: 99; ascent: 78; descent: -18; max advance: 172; bounds: 4.45312,0  48.625,63; origin: 53,0; pixels per em: 86,86; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 86

CẬP NHẬT # 1 - Gỡ lỗi thêm

Vấn đề này đã làm tôi khó chịu vì vậy tôi nghĩ rằng cuối cùng tôi đã tìm ra nó. Vấn đề là việc lựa chọn phông chữ và nó không thể hiển thị glyph cụ thể đó.

  1. Trước hết, bạn có thể sử dụng lệnh này để xem những phông chữ nào bạn có sẵn trong đó convert. Vì vậy, hãy bắt đầu từ đó.

    $ convert -list font | head -8
    
    Path: /etc/ImageMagick/type-ghostscript.xml
      Font: AvantGarde-Book
        family: AvantGarde
        style: Normal
        stretch: Normal
        weight: 400
        glyphs: /usr/share/fonts/default/Type1/a010013l.pfb
        ...
    

    Trên đây cho thấy một mẫu, mỗi phông chữ có dòng tương tự như trên. Ngẫu nhiên, chạy lệnh này cho thấy chúng ta có hàng trăm phông chữ:

    $ convert -list font | grep Font | wc -l
    262
    
  2. Tiếp theo chúng ta sẽ thực hiện nhiệm vụ mã hóa ký tự của mình, \u2318sử dụng mọi phông chữ chúng ta có. Điều này nghe có vẻ phức tạp nhưng khá tầm thường với một số người đã suy nghĩ kỹ về một lớp lót thông qua Bash.

    $ for i in $(convert -list font | grep Font | awk '{print $2}'); \
        do convert -font $i -pointsize 36 label:⌘  ${i}.gif;done
    

    Đoạn mã này sẽ sử dụng vòng lặp for để chạy qua từng phông chữ, chạy phiên bản sửa đổi của convertlệnh của bạn .

  3. Bây giờ chúng tôi xem qua kết quả. Nhiều phông chữ không thể hiển thị glyph cụ thể này, nhưng một số phông chữ có thể cho thấy rằng nó không nhất thiết là một lỗi trong ImageMagick, mà là một hạn chế của chính các phông chữ. Đây là danh sách các phông chữ mà tôi có có thể hiển thị glyph này.

    • DejaVu-Sans-Bold
    • DejaVu-Sans-Bold-xiên
    • DejaVu-Sans-Sách
    • DejaVu-Sans-Ngưng-đậm
    • DejaVu-Sans-Ngưng-đậm-xiên
    • DejaVu-Sans-Ngưng
    • DejaVu-Sans-Ngưng tụ-xiên
    • DejaVu-Sans-Mono-Bold
    • DejaVu-Sans-Mono-Bold-xiên
    • DejaVu-Sans-Mono-Sách
    • DejaVu-Sans-Mono-xiên
    • DejaVu-Sans-xiên
    • DejaVu-Serif-Bold
    • DejaVu-Serif-Bold-Italic
    • DejaVu-Serif-Sách
    • DejaVu-Serif-Ngưng-đậm
    • DejaVu-Serif-Ngưng-đậm-in nghiêng
    • DejaVu-Serif-Ngưng
    • DejaVu-Serif-Ngưng-Ý
    • DejaVu-Serif-Ý
    • FreeMono-Thường xuyên
    • FreeSerif-Thường xuyên
    • STIX-Toán-Chính quy
    • STIX-Thường xuyên
    • VL-Gothic-thường xuyên

    Tôi trực quan đã đi qua toàn bộ ~ 260 .giftệp kết quả để xác định cái nào hoạt động và cái nào không. Đây là một mẫu của một vài trong số những cái đã hoạt động để bạn có thể nhìn thấy chúng.

                                                ss1    ss2    ss3    ss4    ss5

Người giới thiệu


1
cảm ơn rất nhiều vì đã phân tích Tôi đã từ bỏ ... Tôi đã cập nhật câu hỏi với giải pháp cuối cùng, liên quan đến việc sử dụng SVG và inkscape để hiển thị phông chữ theo đường dẫn.
fommil

@fommil - dường như là một vấn đề về phông chữ. Xem cập nhật.
slm

sẽ rất tuyệt khi có lệnh cuối cùng trong câu trả lời (chọn phông chữ)
Boris Däppen

Đối với tôi, việc thêm tùy chọn -font DejaVu-Sans-Boldđã giúp gắn thẻ hình ảnh với hộp sọ cướp biển: perl -e 'binmode(STDOUT, ":utf8");print "Skull: \x{2620}";' |convert picture_orig.jpg -background none -fill red -pointsize 90 -font DejaVu-Sans-Bold label:@- -flatten picture_tagged.jpgcảm ơn vì sự giúp đỡ tuyệt vời của bạn!
Boris Däppen

Cảm ơn @slm! Câu trả lời của bạn đã đóng góp cho giải pháp của tôi: unix.stackexchange.com/a/389474/9689
Grzegorz Wierzowiecki
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.