2014-04-03 19 views
6

Tôi đang sử dụng pgmagick để tạo hình thu nhỏ hình tròn. Tôi đang sử dụng một quy trình tương tự như quy trình được thảo luận here, điều này thực sự tạo ra hình thu nhỏ hình tròn đẹp mắt cho tôi. Tuy nhiên, tôi cần một đường viền màu trắng xung quanh bán kính của vòng tròn.Tạo Đường viền Trắng mịn Xung quanh Hình ảnh Thông tư

Cách tiếp cận ban đầu của tôi là tạo hình ảnh mới của vòng tròn trắng lớn hơn một chút với nền trong suốt và kết hợp hình thu nhỏ, cho phép vòng tròn màu trắng "xuất hiện" từ dưới hình thu nhỏ và tạo hiệu ứng đường viền. Dưới đây là mã pgmagick tôi đã sử dụng để đạt được điều đó:

border_background = Image(Geometry(220, 220), Color('transparent')) 
drawer = Draw() 
drawer.circle(110, 110, 33.75, 33.75) 
drawer.fill_color(Color('white')) 
drawer.stroke_antialias(False) 
border_background.draw(drawer.drawer) 
border_background.composite(original_thumbnail, 0, 0, CompositeOperator.OverCompositeOp) 

Biên giới màu trắng xung quanh khá méo mó với các cạnh nhòe - không sẵn sàng sản xuất. Nếu tôi lấy drawer.stroke_antialias (False), nó còn tệ hơn nữa.

Bất kỳ ý tưởng nào về việc làm cho đường viền này mượt mà hơn bằng cách sử dụng pgmagick?

Trả lời

7

tôi để lại nó như là một bài tập đơn giản cho người đọc để chuyển đổi giải pháp này từ commandline để pgmagick (xem chi tiết bên dưới) . Mã cơ bản pgmagick giống như mã được sử dụng bởi dòng lệnh.

Bạn có thể vẽ hình tròn lớn hơn và sau đó "đổi kích thước" vòng tròn đó xuống. Điều này cải thiện cái nhìn lởm chởm của vòng tròn bằng cách lấy trung bình cạnh với nền xung quanh trong quá trình thay đổi kích thước.

Thay vì

gm convert -size 220x220 xc:none -fill white \ 
     -draw "circle 110,110, 33.75,33.75" \ 
     original.png 

Làm điều này:

gm convert -size 880x880 xc:none -fill white \ 
     -draw "circle 440,440, 135,135" \ 
     -resize 25% resized.png 

Bạn có thể thử các kích thước khác và quyết định là nhỏ nhất thỏa mãn bạn, ví dụ:

gm convert -size 440x440 xc:none -fill white \ 
     -draw "circle 220,220, 67.5,65.5" \ 
     -resize 50% resized.png 

commandline này hoạt động trên cả GraphicsMagick ("gm convert") và ImageMagick ("convert")

Xem tài liệu pgmagick tại http://pgmagick.readthedocs.org/en/latest/cookbook.html#scaling-a-image không rõ ràng rằng pgmagick cung cấp "thay đổi kích thước". Tài liệu hướng dẫn hiển thị "img.scale" có thể dẫn đến một vòng tròn xù xì. Sử dụng "-scale" trên các ví dụ trên dòng lệnh thay vì "-resize" thực sự tạo ra cùng một hình ảnh lởm chởm. Tuy nhiên

pgmagick không cho phép bạn chỉ định các loại bộ lọc, như trong

img.scale((150, 100), 'lanczos') 

mà nên tương đương với "-resize" và là những gì bạn muốn.

5

Bạn sẽ nhận được một kết quả tốt hơn nếu bạn chọn một cách tiếp cận khác nhau:

# First draw the thumbnail inside the circle. 
background = Image(Geometry(220, 220), Color('transparent')) 
drawer = Draw() 
drawer.circle(110, 110, 33.75, 33.75) 
drawer.fill_color(Color('white')) 
background.draw(drawer.drawer) 
background.composite(original_thumbnail, 0, 0, CompositeOperator.InCompositeOp) 

# Draw only the border of the circle on top of the thumbnail inside the circle 
border = Image(Geometry(220, 220), Color('transparent')) 
drawer.fill_color(Color('transparent')) 
drawer.stroke_color(Color('white')) 
drawer.stroke_width(3) 
border.draw(drawer.drawer) 
background.composite(border, 0, 0, CompositeOperator.OverCompositeOp) 
Các vấn đề liên quan