Laden...

Bild einfliegen lassen

Erstellt von emerel vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.355 Views
E
emerel Themenstarter:in
5 Beiträge seit 2010
vor 13 Jahren
Bild einfliegen lassen

Hi, ich versuche grad ein bild von rechts einfliegen zu lassen.
Ich benutze Double Buffering um meine Bilder anzuzeigen usw., das Problem is das es mit dem einfliegen lassen nich so recht klappt. Es geht zwar aber es is voll uneffizient und ich hab schon fix ne OutOfMemory Exception erhalten, ich realisiere das nämlich mit einer For-Schleife und zeichne dann alle 10 Pixel weiter das Bild nocheinmal rein, und damit es nich 300 mal da aufgemalt is, übermale ich das alte immer wieder mit dem Hintergrund


for (int i = 1000; i >= 790; i=i-10)
                    {
                        myBuffer.Graphics.DrawImage(Image.FromFile(pfad + "Schlafzimmer2.jpg"), 0, 0, 1024, 768);
                        myBuffer.Graphics.DrawImage(Image.FromFile(pfad + "robocop.png"), i, 270, 320, 500);
                        myBuffer.Render();
                        Thread.Sleep(5);
                    }

jedenfalls is das nich grade das gelbe vom Ei und flüssig läufts auch nich ^^

hat da jemand ne Idee wie ich das anders realisieren könnte?
Und vieleicht auch noch wie ich ein Bild auftauchen lassen kann, wie z.B. bei Power Point?

F
155 Beiträge seit 2009
vor 13 Jahren

Hallo,

verwende einen Timer anstatt Thread.Sleep().

Wegen der OutOfMemory Exception, gibst du die Zeichenressourcen wieder frei nach dem Zeichnen?

fz

"We better hurry up and start coding, there are going to be a lot of bugs to fix."

1.552 Beiträge seit 2010
vor 13 Jahren

Hallo emerel,

wieso erstellst du in jedem Schleifendurchlauf das Bild neu?
Erstelle es außerhalb der Schleife und nimm dann immer dieser her.

Und kombiniere Pfade mit Path.Combine(string,string)
Thread.Sleep() ist in der GUI eine schlechte Entscheidung. Nimm dazu besser einer Timer.

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

E
emerel Themenstarter:in
5 Beiträge seit 2010
vor 13 Jahren

ok, aber wie heißt denn dann das Bild?

1.552 Beiträge seit 2010
vor 13 Jahren

ok, aber wie heißt denn dann das Bild? ???

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

L
95 Beiträge seit 2009
vor 13 Jahren

Also, ich würde das mit nem Timer, dem Paint-Event und Invalidate() realisieren...

Z.B. so:


        private Timer timer1;
        private IContainer components;
    
        public Form1()
        {
            InitializeComponent();

            // Set the value of the double-buffering style bits to true.
            this.SetStyle(ControlStyles.DoubleBuffer |
            ControlStyles.UserPaint |
            ControlStyles.AllPaintingInWmPaint,
            true);

            this.UpdateStyles();
        }

        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.timer1 = new System.Windows.Forms.Timer(this.components);
            this.SuspendLayout();
            // 
            // timer1
            // 
            this.timer1.Enabled = true;
            this.timer1.Interval = 5;
            this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
            // 
            // Form1
            // 
            this.ClientSize = new System.Drawing.Size(512, 384);
            this.Name = "Form1";
            this.Text = "Main Form";
            this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
            this.ResumeLayout(false);

        }

        int x = 512;
        int y = 0;

        private void timer1_Tick(object sender, EventArgs e)
        {
            x--;
            if (x == 0)
                timer1.Stop();

            this.Invalidate(false);
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics graphics = e.Graphics;

            graphics.DrawImage(PaintSample.Properties.Resources.Test, new Point(x, y));
        }

Ich habe dir das Sample angehängt. Hoffentlich hilft es dir!
Dein Code war wirklich etwas... unperformant.
Das liegt z.B. auch daran, dass du bei jedem Update das Bild neu lädst.
Beachte auch, dass du mehr als einfaches DoubleBuffer = true brauchst... Siehe Konstruktor 😉

Lg Marc

E
emerel Themenstarter:in
5 Beiträge seit 2010
vor 13 Jahren

alles klar probier das gleich ma aus thx ^^
@xxMUROxx na mit

myBuffer.Graphics.DrawImage(Image.FromFile(pfad + "Schlafzimmer2.jpg"), 0, 0, 1024, 768);

hab ich nich extra ein graphics erzeugt sondern gleich die Funktion benutzt

F
155 Beiträge seit 2009
vor 13 Jahren

Hallo,

xxMUROxx meinte mit Bild neu erstellen:

myBuffer.Graphics.DrawImage(Image.FromFile(pfad + "Schlafzimmer2.jpg"), 0, 0, 1024, 768);

fz

"We better hurry up and start coding, there are going to be a lot of bugs to fix."

1.552 Beiträge seit 2010
vor 13 Jahren

@fz7090, Genau das meinte ich, eine Variable anlegen und die als Parameter der DrawImage Methode übergeben, denn wie du es machst und wie

Das liegt z.B. auch daran, dass du bei jedem Update das Bild neu lädst. auch sagte ist dies dein Problem Unperformant, denn die Disk-Zugriffe sind lokal gesehen (d.h. online Inhalte ausgenommen) die langsamste Zugriffsart.

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp