Работа с буфером обмена

Эта ветка форума посвящена вопросу, как самому сделать свой плагин (эффект) для Paint.NET. Для публикации своих эффектов используйте основной форум "Эффекты и плагины к Paint.NET"
Ответить
Аватара пользователя
xmario
Администратор
Сообщения: 3384
Зарегистрирован: 03 апр 2010, 20:12
Репутация: 32
Пол: Мужской
Откуда: Москва

Работа с буфером обмена

Сообщение xmario » 10 сен 2010, 12:49

Как обратиться к буферу обмена в paint.net

Эффект (плагин) paint.net может обращаться к изображению, находящемуся в буфере обмена Windows. Правда, доступ к изображению, находящемуся в буфере обмена из кода эффекта paint.net несколько небанален. Обращение к буферу обмена осуществляется в paint.net через STA-поток.

Для примера работы с буфером обмена из paint.net, ниже приведен код плагина, который вставляет изображение из буфера обмена в текущую выделенную область рисунка paint.net. Если изображение в буфере обмена меньше, чем выделенная область, плагин будет повторять его.

Код: Выделить всё

// Author: Illnab1024
#region UICode
#endregion

protected Surface img
{
    get { if (_img != null)
            return _img; 
          else
          {
            System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(GetImageFromClipboard));
            t.SetApartmentState(System.Threading.ApartmentState.STA); 
            t.Start();
            t.Join();
            return _img;
          }
        }
}
private Surface _img = null;
private void GetImageFromClipboard()
{
    Bitmap aimg = null;
    IDataObject clippy;
    try
    {
        clippy = Clipboard.GetDataObject();
        if (clippy != null)
        {
            aimg = (Bitmap)clippy.GetData(typeof(System.Drawing.Bitmap));
        }
    }
    catch (Exception )
    {
    }
    if (aimg != null)
    {
        _img = Surface.CopyFromBitmap(aimg);
    }
    else
    {
        _img = null;
    }
}

void Render(Surface dst, Surface src, Rectangle rect)
{
    for (int y = rect.Top; y < rect.Bottom; y++)
    {
        for (int x = rect.Left; x < rect.Right; x++)
        {
            if (img == null)
                dst[x,y] = src[x,y];
            else
                dst[x,y] = img.GetBilinearSampleWrapped(x,y);
        }
    }
}
Оригинальную инструкцию на английском языке по этому поводу можно найти здесь.

Ответить

Вернуться в «Как сделать свой эффект (плагин) для Paint.NET»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость