Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Bild einfliegen lassen
emerel
myCSharp.de - Member



Dabei seit:
Beiträge: 5
Herkunft: Deutschland :D

Themenstarter:

Bild einfliegen lassen

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
F.Z.
myCSharp.de - Member



Dabei seit:
Beiträge: 160

beantworten | zitieren | melden

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."
private Nachricht | Beiträge des Benutzers
xxMUROxx
myCSharp.de - Member

Avatar #avatar-3236.jpg


Dabei seit:
Beiträge: 1626
Herkunft: Südtirol/Italien

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
emerel
myCSharp.de - Member



Dabei seit:
Beiträge: 5
Herkunft: Deutschland :D

Themenstarter:

beantworten | zitieren | melden

ok, aber wie heißt denn dann das Bild?
private Nachricht | Beiträge des Benutzers
xxMUROxx
myCSharp.de - Member

Avatar #avatar-3236.jpg


Dabei seit:
Beiträge: 1626
Herkunft: Südtirol/Italien

beantworten | zitieren | melden

Zitat von emerel
ok, aber wie heißt denn dann das Bild?
???
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von xxMUROxx am .
Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp
private Nachricht | Beiträge des Benutzers
Levitas
myCSharp.de - Member



Dabei seit:
Beiträge: 96

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Levitas am .
Attachments
private Nachricht | Beiträge des Benutzers
emerel
myCSharp.de - Member



Dabei seit:
Beiträge: 5
Herkunft: Deutschland :D

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
F.Z.
myCSharp.de - Member



Dabei seit:
Beiträge: 160

beantworten | zitieren | melden

Hallo,

xxMUROxx meinte mit Bild neu erstellen:
Zitat von emerel
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."
private Nachricht | Beiträge des Benutzers
xxMUROxx
myCSharp.de - Member

Avatar #avatar-3236.jpg


Dabei seit:
Beiträge: 1626
Herkunft: Südtirol/Italien

beantworten | zitieren | melden

@fz7090, Genau das meinte ich, eine Variable anlegen und die als Parameter der DrawImage Methode übergeben, denn wie du es machst und wie
Zitat von Levitas
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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von xxMUROxx am .
Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp
private Nachricht | Beiträge des Benutzers