2011-10-25 37 views
36

Tôi cần sử dụng ImageMagick vì PIL không có sẵn chức năng hình ảnh mà tôi đang tìm kiếm. Tuy nhiên, tôi muốn sử dụng Python.Tôi có thể truy cập API ImageMagick bằng Python không?

Các ràng buộc python (PythonMagick) chưa được cập nhật từ năm 2009. Điều duy nhất tôi có thể tìm thấy là các cuộc gọi os.system để sử dụng giao diện dòng lệnh nhưng điều này có vẻ khó khăn.

Có cách nào để truy cập API trực tiếp bằng cách sử dụng ctypes và chuyển đổi của một số loại không? Như một phương sách cuối cùng là có bất kỳ thư viện nào khác ngoài kia có số lượng lớn các công cụ chỉnh sửa hình ảnh như ImageMagick mà tôi đã xem xét không?

Trả lời

57

Tôi khuyên bạn nên sử dụng Wand (giải thích sau).

tôi đang tìm kiếm thích hợp ràng buộc vào thư viện ImageMagick, điều đó sẽ:

  • lỗi làm việc/vấn đề tự do
  • được thường xuyên duy trì và cập nhật
  • cho phép thoải mái Python khách quan

Nhưng thực sự python API (ràng buộc) có quá nhiều phiên bản khác nhau (chủ yếu là ngưng). Sau khi đọc một cái nhìn tổng quan lịch sử tốt đẹp của Benjamin Schweizer nó có tất cả trở nên rõ ràng (xem thêm github wiki mình) :

  • GraphicsMagick
  • PythonMagick - thực hiện đầu tiên
  • PythonMagickWand/Achim Domma - Wand đầu tiên - một CDLL thực hiện
  • PythonMagickWand/Ian Stevens
  • MagickFoo - bao gồm trong python-magickwand
  • Wand/Hồng Minhee - Dự án mới nhất

Bây giờ, Wand chỉ là một API C (giảm) cho ImageMagick ".. API là giao diện được đề xuất giữa ngôn ngữ lập trình C và thư viện xử lý hình ảnh ImageMagick. Không giống như API MagickCore C, MagickWand chỉ sử dụng một vài loại mờ. Accessors có sẵn để thiết lập hoặc lấy các thuộc tính đũa quan trọng."(See project homepage)

Vì vậy, nó đã là một giao diện đơn giản đó là easer để duy trì.

+0

Thật không may, liên kết của bạn để Wand được chia –

+0

cố định. tx rất nhiều –

0

tôi không tìm thấy Python tốt bắt buộc đối với ImageMagick, vì vậy để sử dụng ImageMagick trong chương trình Python tôi đã phải sử dụng subprocess module để chuyển hướng đầu vào/đầu ra

Ví dụ, chúng ta hãy giả sử chúng ta cần phải chuyển đổi tập tin PDF vào TIF:.

path = "/path/to/some.pdf" 
cmd = ["convert", "-monochrome", "-compress", "lzw", path, "tif:-"] 
fconvert = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
stdout, stderr = fconvert.communicate() 
assert fconvert.returncode == 0, stderr 

# now stdout is TIF image. let's load it with OpenCV 
filebytes = numpy.asarray(bytearray(stdout), dtype=numpy.uint8) 
image = cv2.imdecode(filebytes, cv2.IMREAD_GRAYSCALE) 

ở đây tôi sử dụng tif:- để thông báo cho tiện ích dòng lệnh của ImageMagick rằng tôi muốn lấy hình ảnh TIF làm luồng xuất chuẩn. Theo cách tương tự, bạn có thể yêu cầu nó sử dụng luồng stdin làm đầu vào bằng cách chỉ định - làm tên tệp đầu vào.

-1

này đã làm việc cho tôi cho lệnh sau đây để tạo ra một hình ảnh từ văn bản cho chữ "P":

import subprocess 

cmd = '/usr/local/bin/convert -size 30x40 xc:white -fill white -fill black -font Arial -pointsize 40 -gravity South -draw "text 0,0 \'P\'" /Users/fred/desktop/draw_text2.gif' 

subprocess.call(cmd, shell=True) 
Các vấn đề liên quan