Cách chuyển đổi tệp văn bản thành hình ảnh


17

Nếu tôi có một tệp văn bản đơn giản, làm thế nào tôi có thể chuyển đổi nó thành một tệp hình ảnh thông qua dòng lệnh? (và bảo tồn bố cục của nghệ thuật ASCII trong đó)


Tôi sẽ bắt đầu tìm kiếm một cách tự động để hiển thị văn bản bằng phông chữ đơn cách (gimp hoặc LaTeX có thể là cách để đi)
RSFalcon7

Đây là một giải pháp xấu, nhưng tại sao không chỉ là catnó và chụp ảnh màn hình?
psimon

Điều đó sẽ quá xấu, và một ảnh chụp màn hình sẽ bao gồm thông tin bổ sung, như lời nhắc.
Quora Feans

Nếu chỉ có dấu nhắc là vấn đề, hãy thử điều này : clear && cat file. Nhưng vâng, nó xấu.
psimon

không, nó vẫn hiển thị tên người dùng của tôi ... Và trừ khi tôi tìm cách tạo ảnh chụp màn hình thông qua dòng lệnh, nó sẽ không được chấp nhận.
Quora Feans

Câu trả lời:


8

Bạn có thể sử dụng openoffice (libreoffice) để làm điều đó.

soffice --convert-to jpg "Textfile.doc"

nó cũng hoạt động với các tập tin văn bản


Điều đó ... thật tuyệt vời! Tôi không biết OpenOffice có thể chuyển đổi sang JPG ... hay PNG mà tôi vừa thử; có lẽ các định dạng khác là tốt. (Không giúp ích gì khi không có đề cập hoặc thậm chí gợi ý về điều này trong --helpđầu ra.) Chỉ nhăn, nếu văn bản dài hơn một trang, có vẻ như bạn chỉ nhận được trang đầu tiên. (Nếu có một cách để bảo nó xuất ra các trang khác hoặc nhiều tệp, thì điều đó không rõ ràng ngay lập tức đối với tôi. Truyền qua --outdirkhông có gì khác biệt.) Nhưng đối với các đoạn văn bản ngắn, nó hoạt động rất tốt và thậm chí tự động kết thúc. Đẹp!
FeRD ngày

Điều này tạo ra một trang có kích thước cố định với văn bản nhỏ có khả năng trên đó nếu văn bản nhỏ.
Ciro Santilli 心 心

1
@CiroSantilli 心 心 六四 page Trang có kích thước cố định, đúng, nhưng đó là nơi tự động cắt xén của ImageMagick trở lại hữu ích:soffice --convert-to jpg ascii.txt && mogrify -trim -bordercolor "#FFF" -border 10 +repage ascii.jpg
FeRD

26

imagemagicklà bạn của bạn ở đây Một cái gì đó tương tự như sau có thể giúp bạn: -

convert -size 360x360 xc:white -font "FreeMono" -pointsize 12 -fill black -draw @ascii.txt image.png

ascii.txttập tin nghệ thuật của bạn ở đâu : -

text 15,15 "                 .88888888:. 
                88888888.88888. 
              .8888888888888888. 
              888888888888888888 
              88' _`88'_  `88888 
              88 88 88 88  88888 
              88_88_::_88_:88888 
              88:::,::,:::::8888 
              88`:::::::::'`8888 
             .88  `::::'    8:88. 
            8888            `8:888. 
          .8888'             `888888. 
          .8888:..  .::.  ...:'8888888:. 
        .8888.'     :'     `'::`88:88888 
       .8888        '         `.888:8888. 
      888:8         .           888:88888 
    .888:88        .:           888:88888: 
    8888888.       ::           88:888888 
    `.::.888.      ::          .88888888 
   .::::::.888.    ::         :::`8888'.:. 
  ::::::::::.888   '         .:::::::::::: 
  ::::::::::::.8    '      .:8::::::::::::. 
 .::::::::::::::.        .:888::::::::::::: 
 :::::::::::::::88:.__..:88888:::::::::::' 
  `'.:::::::::::88888888888.88:::::::::' 
        `':::_:' -- '' -'-' `':_::::'`  
    "

với text 15,15thêm vào như dòng đầu tiên của văn bản (15,15 là một vị trí bù đắp). Ngoài ra, hãy chắc chắn rằng văn bản thực tế sẽ được chuyển đổi được đính kèm trong dấu ngoặc kép. Dấu ngoặc đơn hoặc kép sẽ làm được, nhưng hãy đảm bảo rằng chúng không được sử dụng như một phần của nghệ thuật ascii của bạn vì nó sẽ gây nhầm lẫn.

Phông chữ bạn chọn phải là phông chữ đơn cách, nếu không văn bản sẽ không căn chỉnh.

Điều này tạo ra: -

nhập mô tả hình ảnh ở đây


Bạn có gợi ý về cách lấy danh sách tên phông chữ hợp lệ không? Mặc dù Free Mono dường như được cài đặt trên hệ thống của tôi, nhưng hình ảnh không nhận ra nó.
Raphael

1
@Raphael: Bạn có thể nhận danh sách các phông chữ hiện có từ bất kỳ lệnh ImageMagick nào (bao gồm chuyển đổi) bằng -listtùy chọn. Vì vậy, ví dụ convert -list fontsẽ cho bạn thấy tất cả các đối số có thể -font.
FeRD

Bạn cũng có thể cài đặt chương trình này bằng cách sử dụng sudo yum install ImageMagick.
rangsiman

@ R.Ketkaew Lệnh đó có hiệu lực đối với người đang chạy Fedora 21 trở xuống hoặc một số phiên bản của RHEL (thậm chí không chắc chắn liệu phiên bản mới nhất có còn sử dụng yum hay không). Trên Fedora 22+, lệnh cài đặt là sudo dnf install ImageMagickvà trên hầu hết các bản phân phối Linux phổ biến khác, nó sẽ là một số sudo apt-get install ...lệnh. Bất kể, thông tin trên thực sự cho rằng ImageMagick đã được cài đặt trên hệ thống được đề cập.
FeRD

18

Tôi thấy -annotatetoán tử của ImageMagick tiện lợi hơn một chút so với -drawphương thức garethTheRed đề xuất, vì lý do đơn giản là nó không yêu cầu sửa đổi tệp đầu vào. Nó không mạnh bằng -draw, nhưng để bán buôn nội dung của tệp văn bản thành hình ảnh thì nó phục vụ rất tốt.

convert -size 360x360 xc:white -font "FreeMono" -pointsize 12 -fill black \
-annotate +15+15 "@ascii.txt" image.png

sẽ xuất ra một phiên bản kết xuất của nội dung tệp đã cho, nhưng không phải sửa đổi tệp "ascii.txt" của bạn để chứa text 15x15phần -drawnguyên thủy.

Chỉ định đối số

Đối số -fontcó thể là bất kỳ tên phông chữ được hỗ trợ nào, nếu FreeMono không có sẵn (hoặc đơn giản là không mong muốn). Có thể lấy danh sách các phông chữ có sẵn cho bất kỳ lệnh ImageMagick nào bằng cách sử dụng -listtoán tử, do đó convert -list fontsẽ hiển thị tất cả các đối số có thể có -font.

Các đối số đến -annotate(khoảng cách để dịch chuyển văn bản được hiển thị từ cạnh của khung vẽ) bao gồm các độ lệch pixel ngang và dọc (tương ứng). Giá trị bù đầu tiên (x-shift ngang) có thể là bất kỳ số nguyên dương nào, nhưng không cần lớn hơn một vài pixel. Thứ hai bù đắp (dọc y-shift) phảiít nhất là tương đương với kích thước điểm của phông chữ được lựa chọn (các đối số cho -pointsize), vì ImageMagick sẽ đặt cơ sở của phông chữ ở khoảng bù. Vì vậy, nếu bạn không dịch chuyển phông chữ xuống ít nhất pointsizepixel, phần trên cùng của dòng đầu tiên sẽ bị cắt.

Tôi khuyên bạn nên đi qua ít nhất vài pixel, vì vậy nếu bạn đang sử dụng -pointsize 64thì bạn nên ghép nối nó với một cái gì đó như -annotate +15+80. (Không có lý do gì để tăng bù ngang với kích thước phông chữ lớn hơn, nó không có mối quan hệ với kích thước văn bản.)

Cần phải đoán kích thước cần thiết của hình ảnh đầu ra cũng có thể tẻ nhạt. Tôi thường chỉ chọn các giá trị quá mức, sau đó tận dụng lợi thế của ImageMagick -trim-borderđể tự động kết quả. Lệnh sau:

convert -size 1000x2000 xc:white -font "FreeMono" -pointsize 12 -fill black \
-annotate +15+15 "@ascii.txt" -trim -bordercolor "#FFF" -border 10 +repage image.png

sẽ kết xuất thành một hộp 1000x2000, sau đó cắt bớt khoảng trắng thừa ngoại trừ đường viền 10 pixel trên toàn bộ văn bản. Các +repageđồng ngăn chặn cuối rất PNG đầu ra được tạo ra với một hình ảnh bù đắp, mà nếu không sẽ gây ra GIMP để bật lên một hộp thoại trên tải hỏi liệu có nên áp dụng bù đắp.

(Rõ ràng, 1000x2000 là quá mức cho các tập tin văn bản nhỏ, và cho những người thân còn ít nhất theo chiều dọc có thể cần phải được tăng lên. Đó là đơn giản để đánh giá quá cao, tuy nhiên, như chi phí duy nhất được converttiêu thụ hơi nhiều CPU và bộ nhớ trong khi chế biến.)

Đầu vào tiền xử lý

Nếu tệp văn bản của bạn chưa được định dạng theo cách bạn cần để hiển thị nó (giả sử, nếu nó sử dụng các dòng rất dài) thì bạn có thể phải định dạng lại nó trước khi đưa nó vào convert. ImageMagick sẽ không bao bọc văn bản, vì vậy mỗi dòng văn bản sẽ mở rộng toàn bộ chiều dài của nó theo chiều ngang. May mắn thay, có thể chạy tệp thông qua bất kỳ trình định dạng dòng lệnh nào bạn muốn, sau đó chuyển văn bản đã xử lý vào convertthay vì đọc trực tiếp từ tệp:

fmt < ascii.txt | convert -size 1000x2000 xc:white -font "DejaVu-Sans-Condensed" \
-pointsize 24 -fill black -annotate +15+30 "@-" -trim -bordercolor "#FFF" \
-border 10 +repage image.png

Điều đó sẽ hiển thị nội dung của ascii.txtDejaVu Sans Condensed 24 điểm, sau khi được xử lý bằng fmtlệnh, trong chế độ hoạt động mặc định của nó sẽ định dạng lại đầu vào của nó bằng cách gói từ thành độ rộng 75 cột. (Trừ khi có các chuỗi dài liên tục dài hơn 75 ký tự, như URL, trong trường hợp đó, chúng sẽ mở rộng hơn.)

Khi fmtđã định dạng lại văn bản, nó sẽ được chuyển đến convertđó sẽ hiển thị fmtđầu ra theo đường ống , giống như khi nó đang đọc tệp trực tiếp. (Chỉ định tên tệp -là một tốc ký shell UNIX khá phổ biến cho "đọc từ đầu vào tiêu chuẩn, thay vì bất kỳ tệp đĩa được đặt tên nào" và các công cụ của ImageMagick tuân theo quy ước đó.)


1
Các thành phần y của annotatelập luận nên lớn hơn pointsize chắc chắn sẽ xuất hiện tất cả mọi thứ: convert -size 1000x2000 xc:white -font "FreeMono" -pointsize 123 -fill black \ -annotate +0+123 "@ascii.txt" -trim -bordercolor "#FFF" -border 10 +repage image.pngở đâu 123là kích thước mong muốn. Ngoài ra, bạn có thể sử dụng convert -list fontđể tìm hiểu những phông chữ nào được hỗ trợ ( "FreeMono"không được hỗ trợ phổ biến).
Alec Jacobson

1
Sửa: convert -list fontlà cú pháp đúng, không phải convert -list fonts.
Sopalajo de Arrierez

1
@CiroSantilli 心 心 mm Hmm, câu hỏi hay. Cài đặt IM7 của tôi không có bất kỳ chính sách nào được đặt trong /etc/ImageMagick-7/policy.txtđó can thiệp vào bất kỳ biểu mẫu chuyển đổi nào. Bạn có biết chính sách nào đang chặn chuyển đổi không và tại sao nó lại được đặt? (Ngoài ra, nắm tại ống hút: Liệu các đường ống fmt ...dưới hình thức công việc chỉ huy, bởi bất kỳ cơ hội Nếu vậy, bạn chỉ có thể thay thế? fmtcat, và nhận được kết quả tương tự như các @ascii.txtphiên bản.)
Vụ KTĐN

1
@CiroSantilli 改造 心 心, thêm một câu hỏi nữa: Bạn đã chỉ định "thất bại ... với tux mà không có siêu dữ liệu xấu xí". Điều đó có nghĩa là convert thành công khi bạn sử dụng -drawbiểu mẫu của @ garethTheRed và chèn các lệnh định vị vào ascii.txttệp? Nó sẽ khá kỳ quái nếu đó là trường hợp đối với tôi, vì tôi gặp khó khăn khi tưởng tượng những vấn đề bảo mật sẽ xảy ra với -annotateđiều đó cũng sẽ không áp dụng -draw, khi xử lý nội dung của tệp văn bản đã nhập.
FeRD

1
Tôi thậm chí đã không thử câu trả lời của Gareth vì siêu dữ liệu xấu xí, nhưng giờ nó đã hoạt động. Của tôi /etc/ImageMagick-6/policy.xmlchứa <policy domain="path" rights="none" pattern="@*"/>nên tôi đoán đó là một. stdin cũng không hoạt động, có lẽ bởi vì nó cũng có @-mô hình trong đó. Đối với người tuyệt vọng, "$(cat ascii.txt)"hoạt động nếu nó không làm nổ tung chiều dài CLI.
Ciro Santilli 心 心
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.