Какой-либо способ сделать хорошие сглаженные круглые углы для изображений в Python?

Две вещи выделяются в моей голове:

1) можно включить и выключить Трассировку от кода:

#ifdef DEBUG 
   if (Context.Request.QueryString["DoTrace"] == "true")
                {
                    Trace.IsEnabled = true;
                    Trace.Write("Application:TraceStarted");
                }
#endif

2) можно создать несколько .aspx страниц с помощью только одного общего "кода - позади" файла.

Сборка один класс .cs файл:

public class Class1:System.Web.UI.Page
    {
        public TextBox tbLogin;

        protected void Page_Load(object sender, EventArgs e)
        {

          if (tbLogin!=null)
            tbLogin.Text = "Hello World";
        }
    }

и затем у Вас может быть любое число .aspx страниц (после удаления .designer.cs и кода .cs - позади того, который VS генерировал):

  <%@ Page Language="C#"  AutoEventWireup="true"  Inherits="Namespace.Class1" %>
     <form id="form1" runat="server">
     <div>
     <asp:TextBox  ID="tbLogin" runat="server"></asp: TextBox  >
     </div>
     </form>

у Вас могут быть средства управления в ASPX, которые не появляются в Class1, и наоборот, но Вы должны к remeber проверить свои средства управления на пустые указатели.

14
задан Evgeny 1 December 2009 в 21:10
поделиться

3 ответа

Итак, хорошо, я нашел решение.

Я использовал метод суперсэмплинга bobince , предложенный ранее, но обнаружил, что изображения становятся размытыми. Итак, я не стал бы приводить полный код, но объясню свое решение.

Это может показаться немного идиотским, но я не нашел другого способа сделать это без привлечения каких-либо других библиотек.

С помощью PIL вы рисуете белые (или любого другого цвета, включая прозрачные) углы на изображении. Затем вы его копируете. Теперь у вас должно быть два изображения с хрустящими белыми закругленными углами без сглаживания.

Теперь вы должны использовать метод масштабирования -> суперсэмплинг (см. Ответ bobince выше для подробностей), чтобы сделать одно из изображений гладким (я использовал 8-кратное масштабирование).

Теперь у вас есть два изображения - одно с четкими углами, а другое с гладкими углами, но с размытым изображением.

Теперь вам нужно сделать углы четкого изображения прозрачными и вставить все изображение на гладкое. Для этого я использовал метод Image.composite (crispy_image, smooth_image, crispy_image) в библиотеке PIL.

Voila!

4
ответ дан 1 December 2019 в 12:01
поделиться

] Обычно я использую изображение в качестве маски, например, вот такое:

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)

Размер маски можно изменить в соответствии с желаемыми размерами. Просто убедитесь, что вы используете метод Image.ANTIALIAS.

Вы можете обратиться к учебнику , который я написал некоторое время назад, для получения более подробной информации (бесстыдный плагин)

Если вы хотите больше контролировать размер и радиус, то вам нужно использовать дугу или круговой разрез. Я не http://bazaar.launchpad.net/~stani/phatch/trunk/annotate/head:/phatch/actions/round.py

Мне это тоже кажется достаточно гладким.

16
ответ дан 1 December 2019 в 12:01
поделиться

Вам потребуется суперсэмпл : нарисовать дугу до большего изображения и уменьшить его.

например. белая, плавно полупрозрачная нижняя правая рамка 16x16 с квадратной суперсэмплингом 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')
5
ответ дан 1 December 2019 в 12:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: