2012-07-14 19 views
5

Tôi có một tập hợp các biểu tượng màu trắng trên nền trong suốt và tôi muốn đảo ngược tất cả chúng thành màu đen trên nền trong suốt.Python: nghịch đảo hình ảnh với nền trong suốt (PIL, Gimp, ...)

enter image description here

đã thử với PIL (ImageChops) nhưng nó dường như không làm việc với nền trong suốt. Tôi cũng đã thử giao diện Python của GIMP, nhưng cũng không có may mắn.

Bất kỳ ý tưởng nào về cách đảo ngược tốt nhất trong Python?

+0

Định dạng hình ảnh là gì? – Acorn

+0

định dạng tệp của chúng là png – Hoff

Trả lời

5

ImageChops.invert dường như cũng đảo kênh alpha của mỗi pixel.

này nên thực hiện công việc:

import Image 

img = Image.open('image.png').convert('RGBA') 

r, g, b, a = img.split() 

def invert(image): 
    return image.point(lambda p: 255 - p) 

r, g, b = map(invert, (r, g, b)) 

img2 = Image.merge(img.mode, (r, g, b, a)) 

img2.save('image2.png') 
+0

Thay vì xác định 'invert()' của riêng bạn, bạn chỉ có thể sử dụng 'ImageOps.invert()' trên mỗi kênh vì mỗi kênh có loại '" L "'. (hoặc tôi giả sử 'ImageChops.invert()' nhưng tôi chưa bao giờ thử nghiệm bản thân mình). – Ray

1

Tôi đã cố gắng tiếp cận Acorn, nhưng kết quả là hơi lạ (phần trên của hình dưới đây).

enter image description here

Biểu tượng phía dưới là những gì tôi thực sự muốn, tôi đã đạt được nó bằng cách sử dụng Image Magick 's chuyển đổi phương pháp:

convert tools.png -negate tools_black.png

(không python cho mỗi gia nhập, nhưng giấy gói python tồn tại, như PythonMagickWand.

Hạn chế duy nhất là bạn phải cài đặt một loạt các phụ thuộc để ImageMagick hoạt động, nhưng nó có vẻ là một hình ảnh mạnh mẽ mani khuôn khổ.

+0

Phải, mã tôi đã đăng chỉ chuyển đổi các pixel trắng thành đen. Tôi đã cập nhật câu trả lời của tôi với một đảo ngược chung chung. – Acorn

0

Bạn có thể làm được điều này khá dễ dàng với PIL, như thế này:

  1. Đảm bảo hình ảnh được thể hiện dưới dạng RGBA, bằng cách sử dụng convert('RGBA').
  2. Chia hình ảnh thành các dải riêng biệt RGBA.
  3. Làm những gì bạn muốn với các dải RGB (trong trường hợp của bạn, chúng tôi đặt tất cả thành màu đen bằng cách sử dụng chức năng point) nhưng không chạm vào băng tần alpha.
  4. Hợp nhất các dải lại.

heres mã:

import Image 
im = Image.open('image.png') 
im = im.convert('RGBA') 
r, g, b, a = im.split() 
r = g = b = r.point(lambda i: 0) 
im = Image.merge('RGBA', (r, g, b, a)) 
im.save('saved.png') 

cho nó một shot.

0
import Image, numpy 
pixels = numpy.array(Image.open('myimage.png')) 
pixels[:,:,0:3] = 255 - pixels[:,:,0:3] # invert 
Image.fromarray(pixels).save('out.png') 

Có lẽ giải pháp nhanh nhất từ ​​trước đến nay, vì nó không giải thích bất kỳ mã Python nào bên trong vòng lặp "cho mỗi pixel".