Avatar billede jonasbc Nybegynder
01. september 2005 - 12:11 Der er 3 kommentarer og
1 løsning

Tung grafik med .NET

Jeg har et problem med gentegning af et billede i VB.NET, der bruger utroligt meget CPU-kraft.

For at illustrere, har jeg lavet et lille eksempel, hvor man kan åbne et billede i en Picturebox og derefter bevæge det rundt med musen - Hvorefter CPU'en straks kører på 100% i Windows jobliste.

Kan det ikke lade sig gøre at tegne et billede på en "lettere" måde?

Eksempel-kode:

Dim g, g2 As Graphics
    Dim bit As Bitmap 'bruges til "offscreen" tegning
    Public BgImageOffset As New PointF(0, 0)
    Dim BgImage As Image
    Dim LastMousePos As Point = New Point(0, 0)

    Private Sub Form1_Load(ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles MyBase.Load
        bit = New Bitmap(PictureBox1.Width, PictureBox1.Height)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button1.Click
        'åbn billede
        Dim Dialog As New OpenFileDialog
        Dialog.Filter = "Billedfiler (*.bmp, *.gif, *.jpg)" & _
            "|*.bmp;*.gif;*.jpg|Alle filer|*.*"
        If Dialog.ShowDialog() = DialogResult.OK Then
            BgImage = Image.FromFile(Dialog.FileName)
        End If
    End Sub

    Private Sub UpdateDoubleBuffer()
        'tegn til "offscreen" billede
        g = Graphics.FromImage(bit)
        g.Clear(Color.White)

        If Not Me.BgImage Is Nothing Then
            Dim x As Int64 = BgImageOffset.X - Me.BgImage.Width / 2
            Dim y As Int64 = BgImageOffset.Y - Me.BgImage.Height / 2
            Dim w As Int64 = BgImage.Width
            Dim h As Int64 = BgImage.Height
            g.DrawImage(BgImage, x, y, w, h)
        End If

        g.Dispose()

        'tegn til picturebox
        g2 = PictureBox1.CreateGraphics
        g2.DrawImageUnscaled(bit, 0, 0)
        g2.Dispose()
    End Sub

    Private Sub PictureBox1_MouseMove(ByVal sender As Object, _
    ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
        'centrer billede der hvor musen er
        If e.Button = MouseButtons.Left Then
            Me.BgImageOffset.X += (e.X - Me.LastMousePos.X)
            Me.BgImageOffset.Y += (e.Y - Me.LastMousePos.Y)

            Me.LastMousePos = New Point(e.X, e.Y)
        End If
        UpdateDoubleBuffer()
    End Sub
Avatar billede bigg Nybegynder
03. oktober 2005 - 17:38 #1
Hvor store er billedene?..
Avatar billede jonasbc Nybegynder
03. oktober 2005 - 19:34 #2
Op til et par MB eller der omkring... Men selv mindre billeder gi'r "hakker" i opdateringen.
Avatar billede jens_klinting Nybegynder
14. januar 2006 - 14:15 #3
En mulighed er at benytte DirectX istedet for ovenstående. Der findes et managed DirectX SDK, som gør det muligt at kode DirectX med .NET.

SDK'et (med eksempler) kan hentes her:

http://www.microsoft.com/downloads/details.aspx?FamilyId=7D29004E-7A8D-4F0A-B199-6A740D8F27BB&displaylang=en

Det kræver dog at du benytter .NET 2.0. Så vidt jeg ved, er de eksempler, der følger med skrevet i C# og C++.
Avatar billede jonasbc Nybegynder
27. april 2007 - 14:43 #4
Lukker...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester