Переход изображений в Windows Forms Picture box - PullRequest
3 голосов
/ 17 июля 2010

Я новичок в Windows Forms, в моем проекте мне нужно изменить изображение в графическом окне во время выполнения. Я могу сделать это с помощью таймера. Картина просто меняется. Можно ли делать какие-то переходы при изменении изображения, например, постепенное исчезновение, затухание, размытие и т. Д. Если возможно, кто-нибудь, пожалуйста, дайте мне знать, как это сделать. Я искал в сети, но тщетно. Заранее спасибо.

Варуна

Ответы [ 4 ]

4 голосов
/ 16 июля 2011

Просто возьмите новый файл кода и вставьте в него код ниже

оригинальный ответ на аналогичный вопрос, ответ взят из другой вопрос

Ответ

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;

public class BlendPanel : Panel
{
private Image mImg1;
private Image mImg2;
private float mBlend;
public BlendPanel()
{
    SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, true);
}
public Image Image1
{
    get { return mImg1; }
    set { mImg1 = value; Invalidate(); }
}
public Image Image2
{
    get { return mImg2; }
    set { mImg2 = value; Invalidate(); }
}
public float Blend
{
    get { return mBlend; }
    set { mBlend = value; Invalidate(); }
}
protected override void OnPaint(PaintEventArgs e)
{
    if (mImg1 == null || mImg2 == null)
        e.Graphics.FillRectangle(new SolidBrush(this.BackColor), new Rectangle(0, 0, this.Width, this.Height));
    else
    {
        Rectangle rc = new Rectangle(0, 0, this.Width, this.Height);
        ColorMatrix cm = new ColorMatrix();
        ImageAttributes ia = new ImageAttributes();
        cm.Matrix33 = mBlend;
        ia.SetColorMatrix(cm);
        e.Graphics.DrawImage(mImg2, rc, 0, 0, mImg2.Width, mImg2.Height, GraphicsUnit.Pixel, ia);
        cm.Matrix33 = 1F - mBlend;
        ia.SetColorMatrix(cm);
        e.Graphics.DrawImage(mImg1, rc, 0, 0, mImg1.Width, mImg1.Height, GraphicsUnit.Pixel, ia);
    }
    base.OnPaint(e);
}
}

Создайте свой проект.Теперь вы можете перетащить BlendPanel из верхней части панели инструментов на форму.Вот пример программы, которая использует его:

    private float mBlend;
    private int mDir = 1;
    public int count = 0;
    public Bitmap[] pictures;

    public void myPhoto()
    {
        pictures = new Bitmap[9];
        pictures[0] = new Bitmap(@"Library Images\cf3.jpg");
        pictures[1] = new Bitmap(@"Library Images\cf4.jpg");
        pictures[2] = new Bitmap(@"Library Images\l1.JPG");
        pictures[3] = new Bitmap(@"Library Images\l2.JPG");
        pictures[4] = new Bitmap(@"Library Images\l3.JPG");
        pictures[5] = new Bitmap(@"Library Images\l4.JPG");
        pictures[6] = new Bitmap(@"Library Images\l5.JPG");
        pictures[7] = new Bitmap(@"Library Images\l6.JPG");
        pictures[8] = new Bitmap(@"Library Images\l7.JPG");

        timer1.Interval = 50; //time of transition
        timer1.Tick += BlendTick;
        try
        {
            blendPanel1.Image1 = pictures[count];
            blendPanel1.Image2 = pictures[++count];
        }
        catch
        {

        }
        timer1.Enabled = true;
    }
    private void BlendTick(object sender, EventArgs e)
    {
        mBlend += mDir * 0.02F;
        if (mBlend > 1)
        {
            mBlend = 0.0F;
            if ((count + 1) < pictures.Length)
            {
                blendPanel1.Image1 = pictures[count];
                blendPanel1.Image2 = pictures[++count];
            }
            else
            {
                blendPanel1.Image1 = pictures[count];
                blendPanel1.Image2 = pictures[0];
                count = 0;
            }
        }
        blendPanel1.Blend = mBlend;
    }

Вам нужно будет изменить вызовы new Bitmap(@"yourimagePath");.Сборка и запуск.Вы должны видеть, как отображаемое изображение плавно переходит от вашего первого изображения ко второму изображению без каких-либо мерцаний.

Надеюсь, это поможет другим ...

1 голос
/ 17 июля 2010

Эффекты смешивания легко получить с помощью класса ColorMatrix. В моем ответе есть хороший пример в этой теме .

Простой способ получить размытие - изменить размер изображения, сделать его меньше, а затем перерисовать его, увеличив его. Свойство Graphics.InterpolationMode влияет на тип получаемого размытия.

Это быстрые самостоятельные решения. Любая приличная графическая библиотека имеет такие встроенные операции. Вы, вероятно, хотите что-то бесплатно, проверьте ImageMagick.NET

1 голос
/ 17 июля 2010

Нет встроенной поддержки для таких эффектов, но вы можете реализовать их.Я бы предложил написать пользовательский элемент управления, который отображает изображение и имеет метод для fade-swap, само затухание может быть достигнуто с помощью alpha-blending отрисовки с классом .NET Graphics.Тем не менее, класс Graphics не очень быстрый, я не рекомендую использовать эту технику для больших изображений.Если вам нужен какой-то необычный пользовательский интерфейс с ускоренными эффектами, посмотрите на WPF.

0 голосов
/ 17 июля 2010

Проще говоря, не без внешних (сторонних) библиотек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...