14

Có cách nào để tạo góc tròn đẹp với python không? Hiện tại PIL và GD2 được sử dụng trong dự án của tôi. Cả hai đều có phương thức arc(), cho phép bạn vẽ vòng tròn quater, nhưng vòng tròn quater không bị chống răng cưa, vì vậy hình ảnh trông giòn.Bất kỳ cách nào để tạo các góc tròn chống răng cưa đẹp cho hình ảnh trong python?

Có cách nào gọn gàng để thực hiện các góc tròn chống răng cưa/trơn tru không?

+0

Bạn có đưa ra ví dụ về các góc bạn đang nhận được không? Tôi đã thêm nhiều chi tiết vào câu trả lời của tôi bằng cách này. –

+0

Giống như trên hình chữ nhật màu vàng trong bạn trả lời :) Họ trông xấu xí trên ảnh, thật không may. Kiểm tra câu trả lời của tôi ở phía dưới. Và cảm ơn sự giúp đỡ của bạn. – DataGreed

Trả lời

4

Vì vậy, được rồi, tôi đã tìm ra giải pháp.

Tôi đã sử dụng phương pháp siêu mẫu bobince được đề xuất trước đó, nhưng tôi thấy rằng hình ảnh bị mờ. Vì vậy, tôi sẽ không cung cấp mã đầy đủ, nhưng tôi sẽ giải thích giải pháp của mình.

Dường như nó có vẻ ngốc nghếch, nhưng tôi không tìm thấy cách nào khác để làm điều đó mà không liên quan đến bất kỳ thư viện nào khác.

Với PIL bạn vẽ màu trắng (hoặc bất kỳ màu nào bạn cần, liên quan đến những cái trong suốt) trên các hình ảnh. Sau đó, bạn sao chép nó. Bây giờ bạn sẽ có hai hình ảnh với các góc tròn màu trắng không chống răng cưa giòn.

Bây giờ, bạn nên sử dụng phương pháp thay thế tỷ lệ thu nhỏ (xem bobince's để biết chi tiết) để làm cho một trong những hình ảnh mượt mà (tôi đã sử dụng tỷ lệ 8x).

Bây giờ bạn có hai hình ảnh - một hình có góc giòn và một hình khác có góc nhẵn, nhưng có hình mờ.

Bây giờ bạn có thể làm cho các góc trên hình ảnh giòn trong suốt và dán toàn bộ hình ảnh trên hình mịn. Tôi đã sử dụng phương pháp Image.composite (crispy_image, smooth_image, crispy_image) trong thư viện PIL để thực hiện việc này.

Thì đấy!

+0

Có thể chứng minh: Sử dụng mặt nạ thang độ xám thay thế. Ở đó bạn vẽ một hình ảnh màu trắng và sau đó bạn có thể hạ thấp nó, tức là với nội suy BICUBIC. Điều này sẽ cung cấp cho bạn các góc tròn với các điểm ảnh màu xám. Dán mặt nạ này sẽ cung cấp cho bạn góc trơn tru trong hình ảnh cuối cùng là tốt. – allo

16

Những gì tôi thường làm là sử dụng hình ảnh như một chiếc mặt nạ, như thế này ví dụ:

border.png

alt text http://nadiana.com/sites/default/files/pil_tutorial/border.png

border = Image.open('border.png') 
source = border.convert('RGB') 
img.paste(source, mask=border) 

Mặt nạ có thể được thay đổi kích cỡ để phù hợp với kích thước bạn muốn. Chỉ cần đảm bảo sử dụng phương pháp Image.ANTIALIAS.

Bạn có thể tham khảo các tutorial Tôi đã viết một trong khi trước đây để biết thêm chi tiết (không biết xấu hổ cắm)

Nếu bạn muốn kiểm soát nhiều hơn kích thước và bán kính thì bạn cần phải sử dụng hồ quang hoặc pieslice. Tôi không biết về bạn, nhưng hình chữ nhật tròn này, tôi tạo ra với PIL trông mịn đủ với tôi:

alt text http://nadiana.com/sites/default/files/round_rectangle.png

Đây là the code tôi đã sử dụng để vẽ nó

Có lẽ bạn nên kiểm tra phatch: http://photobatch.wikidot.com/tutorials Nó được viết bằng Python và PIL và có thể áp dụng các góc tròn cho ảnh.

alt text

Đây là một liên kết đến mã sử dụng để áp dụng các góc tròn: http://bazaar.launchpad.net/~stani/phatch/trunk/annotate/head:/phatch/actions/round.py

Đó cũng có vẻ trơn tru đủ đối với tôi.

+1

Hình chữ nhật màu vàng trên nền trắng — không phải là màu đơn giản nhất để xem mức độ mượt mà của nó. –

+0

@Craig, đủ công bằng :) –

+0

Cảm ơn ý tưởng đã sao chép qua các góc tròn. Có, tôi cần phải kiểm soát kích thước và bán kính và các góc này không trơn tru với tôi, bởi vì tôi áp dụng chúng vào ảnh. – DataGreed

5

Bạn sẽ phải supersample: vẽ hình cung đến hình ảnh lớn hơn và thu nhỏ nó xuống.

ví dụ: một đường viền 16x16 phía dưới bên phải màu trắng, trơn tru trong suốt, có kích thước hình vuông 4x4x:

>>> import Image, ImageDraw 
>>> im= Image.new('RGBA', (16*4, 16*4), (255, 255, 255, 0)) 
>>> dr= ImageDraw.ImageDraw(im) 
>>> dr.pieslice((-64, -64, 64, 64), 0, 340, fill=(255,255,255,255)) 
>>> im= im.resize((16, 16), Image.ANTIALIAS) 
>>> im.save('border-se.png') 
+0

Đó là những gì tôi sử dụng bây giờ, nhưng phương pháp này làm cho hình ảnh biến đổi trông mờ: ( – DataGreed

+0

Tôi áp dụng các góc cho ảnh và ảnh trông giống như chúng được sử dụng để + với các góc tròn trơn tru – DataGreed

+0

OK, sau đó hoán đổi vòng trong suốt ở trên (vì vậy bạn vẽ màu trắng trong suốt (255,255,255,0) lên màu trắng đục (255,255,255,255) .Bây giờ bạn đã có một hình nền góc. Bạn có thể lấy ảnh và sử dụng 'photoim.paste (góc, vị trí, góc cạnh)' để đặt các stencil góc trắng trên đầu trang của phần dưới cùng bên phải của bức ảnh.Thay đổi stencil với 'transpose()' và làm một lần nữa cho mỗi góc. (Nếu bạn cần để làm cho đầu ra trong suốt đó là nhiều hơn một chút làm việc, bạn phải tạo một ảnh mặt nạ hoàn chỉnh riêng biệt có cùng kích thước với ảnh rồi dán ảnh và mặt nạ lại với nhau.) – bobince

0

Sử dụng thuật toán vòng tròn của Xiaolin Wu như được mô tả trong Graphics Gems II. Một bản tóm tắt ngắn gọn và ví dụ (bằng php) han được tìm thấy ở đây: http://create.stephan-brumme.com/antialiased-circle/

Để vẽ một vòng cung (vòng tròn một phần), bạn phải xác định xem điểm đã cho nằm trong phạm vi góc của cung trước khi vẽ nó.

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