Làm cách nào để tạo hình thu nhỏ hình ảnh tròn bằng PIL? Không gian bên ngoài vòng tròn phải trong suốt.Làm cách nào để tạo hình thu nhỏ hình tròn với PIL?
Đoạn trích sẽ được đánh giá cao, cảm ơn bạn trước.
Làm cách nào để tạo hình thu nhỏ hình ảnh tròn bằng PIL? Không gian bên ngoài vòng tròn phải trong suốt.Làm cách nào để tạo hình thu nhỏ hình tròn với PIL?
Đoạn trích sẽ được đánh giá cao, cảm ơn bạn trước.
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
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:
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.
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.
Dude, ANTIALIAS đã tạo nên sự khác biệt lớn! Cảm ơn! = D – ademarizu
Đ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ạ. –
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
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. –
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