2009-05-20 35 views

Trả lời

62

Cách dễ nhất để thực hiện việc này là sử dụng mặt nạ. Tạo một mặt nạ màu đen và trắng với bất kỳ hình dạng nào bạn muốn. Và đưa hình dạng như một lớp alpha

from PIL import Image, ImageOps 

mask = Image.open('mask.png').convert('L') 
im = Image.open('image.png') 
output = ImageOps.fit(im, mask.size, centering=(0.5, 0.5)) 
output.putalpha(mask) 
output.save('output.png') 

Đây là mặt nạ tôi đã sử dụng

alt text


Nếu bạn muốn kích thước thu nhỏ được biến bạn có thể sử dụng ImageDraw và vẽ mặt nạ.

from PIL import Image, ImageOps, ImageDraw 

size = (128, 128) 
mask = Image.new('L', size, 0) 
draw = ImageDraw.Draw(mask) 
draw.ellipse((0, 0) + size, fill=255) 
im = Image.open('image.jpg') 
output = ImageOps.fit(im, mask.size, centering=(0.5, 0.5)) 
output.putalpha(mask) 
output.save('output.png') 

Nếu bạn muốn đầu ra trong GIF thì bạn cần phải sử dụng chức năng dán thay vì putalpha:

from PIL import Image, ImageOps, ImageDraw 

size = (128, 128) 
mask = Image.new('L', size, 255) 
draw = ImageDraw.Draw(mask) 
draw.ellipse((0, 0) + size, fill=0) 
im = Image.open('image.jpg') 
output = ImageOps.fit(im, mask.size, centering=(0.5, 0.5)) 
output.paste(0, mask=mask) 
output.convert('P', palette=Image.ADAPTIVE) 
output.save('output.gif', transparency=0) 

Lưu ý rằng tôi đã làm những thay đổi sau:

  • Mặt nạ được đảo ngược. Màu trắng được thay thế bằng màu đen và ngược lại.
  • Tôi đang chuyển đổi thành 'P' bằng bảng màu 'thích nghi'. Nếu không, PIL sẽ chỉ sử dụng màu an toàn cho web và kết quả sẽ trông xấu.
  • tôi thêm thông tin minh bạch với đến hình ảnh

Xin lưu ý: Có một vấn đề lớn với phương pháp này. Nếu hình ảnh gif chứa các phần màu đen, tất cả chúng sẽ trở nên trong suốt. Bạn có thể giải quyết vấn đề này bằng cách chọn một màu khác cho độ trong suốt. Tôi đặc biệt khuyên bạn nên sử dụng định dạng PNG cho việc này. Nhưng nếu bạn không thể thì đó là điều tốt nhất bạn có thể làm.

+0

Tuyệt vời! Và làm thế nào về outputting gif thay vì png? Tôi đoán gif không xử lý alpha, phải không? – ohnoes

+0

Gif không hỗ trợ tính minh bạch của kênh alpha. Nó chỉ hỗ trợ thiết lập một màu như trong suốt. Tuy nhiên, tôi đã thực hiện điều chỉnh cần thiết để xuất kết quả bằng gif. –

+0

câu trả lời tuyệt vời. trong khi tôi có thể áp dụng kỹ thuật này một cách dễ dàng để lưu hình ảnh tôi chạy vào một vấn đề áp dụng mặt nạ trong python. bất kỳ cơ hội nào bạn có thể xem xét câu hỏi này: http://stackoverflow.com/questions/20150552/modify-the-alpha-channel-of-an-image-as-part-of-an-image-processing-workflow – zach

19

Tôi muốn để thêm vào câu trả lời đã chấp nhận một giải pháp cho Antialias vòng tròn kết quả, thủ đoạn này là tạo ra một mặt nạ lớn hơn và sau đó mở rộng nó xuống bằng một bộ lọc Antialias: ở đây là mã

from PIL import Image, ImageOps, ImageDraw 

im = Image.open('image.jpg') 
bigsize = (im.size[0] * 3, im.size[1] * 3) 
mask = Image.new('L', bigsize, 0) 
draw = ImageDraw.Draw(mask) 
draw.ellipse((0, 0) + bigsize, fill=255) 
mask = mask.resize(im.size, Image.ANTIALIAS) 
im.putalpha(mask) 

điều này tạo ra kết quả tốt hơn nhiều trong quan điểm của tôi.

+1

Dude, ANTIALIAS đã tạo nên sự khác biệt lớn! Cảm ơn! = D – ademarizu

+0

Điều này làm việc cho tôi rất tốt. Không cần phải thiết kế một mặt nạ. –

Các vấn đề liên quan