Screen Recording   otázka

VB.NET, WinForms, Grafika

Zdravím dělám tento program na snímání obrazovky ale vypisuje mi to chybu u img0 a img1 toto A generic error occurred in GDI+. Nevím co s tím?

Form2.PictureBox1.Load(DirectoryA + Frame0 + img0)

BMP.Save(DirectoryA + Frame1 + img1)

Public Class Form1

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RECScreen.Tick
        If CheckBox1.Checked = True Then
            Dim DirectoryA As String = FileDIR.Text
            Dim Frame0 As String = FileNUM.Text
            Dim img0 As String = FileType.Text
            FileNUM.Text = FileNUM.Text + 1
            Form2.PictureBox1.Load(DirectoryA + Frame0 + img0)

        Else
            Dim ScreenSize As Size = New Size(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Width)
            Dim BMP As New Bitmap(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
            Dim g As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(BMP)
            g.CopyFromScreen(New Point(0, 0), New Point(0, 0), ScreenSize)
            Dim DirectoryA As String = FileDIR.Text
            Dim Frame1 As String = FileNUM.Text
            Dim img1 As String = FileType.Text
            FileNUM.Text = FileNUM.Text + 1
            BMP.Save(DirectoryA + Frame1 + img1)


        End If
    End Sub

    Private Sub Button9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button9.Click
        Form2.Show()
    End Sub

    Private Sub Button10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button10.Click
        Form2.Hide()
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles INT10.Click
        Label2.Text = "100 FPS"
        RECScreen.Interval = "10"
    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles INT50.Click
        Label2.Text = "20 FPS"
        RECScreen.Interval = "50"
    End Sub

    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles INT100.Click
        Label2.Text = "10 FPS"
        RECScreen.Interval = "100"
    End Sub

    Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles INT250.Click

    End Sub

    Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles INT500.Click

    End Sub

    Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles INT1000.Click

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles REC.Click
        RECScreen.Enabled = True
        FileNUM.Text = "0"
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles STP.Click
        RECScreen.Enabled = False
    End Sub
End Class

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak rozhodně GDI+ není určeno na snímání obrazovky v tak krátkých intervalech.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ale proč mi to teda podtrhuje že je to špatně?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

nevím přesně kde jaká chyba vzniká, ale vsadil bych si na to že problém vzniká při "sčítání stringů". VB obecně to zvládne, ale občas to dělá potíže.

je lepší místo

Form2.PictureBox1.Load(DirectoryA + Frame0 + img0)
BMP.Save(DirectoryA + Frame1 + img1)

dát tohle:

Form2.PictureBox1.Load(DirectoryA & Frame0 & img0)
BMP.Save(DirectoryA & Frame1 & img1)

To by mohlo problém vyřešit. Dál je lepší, třeba pro FileNUM použít globální proměnnou a od ní to sčítat a při timeru tu hodnotu navyšit a do textboxu zapisovat jen vysledek. Je to lepší i bezpečnější než převádět to na číslo. Při vysoké hodnotě by v tomhle případě došlo k tomu, že se hodnota zobrazí exponenciálně a při dalším přičtení se to nepodaří převést na číslo a aplikace spadne.

takže celý kód by měl vypadat asi takto:

Public Class Form1
    Public lng_FileNum As Long = 0
    Public lng_Interval As Integer = 100
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RECScreen.Tick
        If CheckBox1.Checked = True Then
            Dim DirectoryA As String = FileDIR.Text
            Dim Frame0 As String = lng_FileNum
            Dim img0 As String = FileType.Text
            lng_FileNum += 1
            FileNUM.Text = lng_FileNum 
            Form2.PictureBox1.Load(DirectoryA & Frame0 & img0)

        Else
            Dim ScreenSize As Size = New Size(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Width)
            Dim BMP As New Bitmap(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
            Dim g As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(BMP)
            g.CopyFromScreen(New Point(0, 0), New Point(0, 0), ScreenSize)
            Dim DirectoryA As String = FileDIR.Text
            Dim Frame1 As String = lng_FileNum
            Dim img1 As String = FileType.Text
            lng_FileNum += 1
            FileNUM.Text = lng_FileNum
            BMP.Save(DirectoryA & Frame1 & img1)


        End If
    End Sub

    Private Sub Button9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button9.Click
        Form2.Show()
    End Sub

    Private Sub Button10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button10.Click
        Form2.Hide()
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles INT10.Click
        Label2.Text = "100 FPS"
        lng_Interval = 10
        RECScreen.Interval = lng_Interval
    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles INT50.Click
        Label2.Text = "20 FPS"
        lng_Interval = 50
        RECScreen.Interval = lng_Interval
    End Sub

    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles INT100.Click
        Label2.Text = "10 FPS"
        lng_Interval = 100
        RECScreen.Interval = lng_Interval
    End Sub

    Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles INT250.Click

    End Sub

    Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles INT500.Click

    End Sub

    Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles INT1000.Click

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles REC.Click
        RECScreen.Enabled = True
        lng_FileNum = 0
        FileNUM.Text = lng_FileNum
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles STP.Click
        RECScreen.Enabled = False
    End Sub
End Class

Takto by to mělo být bezpečnější, neznatelně rychlejší a pravděpodobně to odstraní tu vznikající chybu s tím plusem, kdy se pravděpodobně příponu souboru nedaří převést na číslo.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

tento zdrojak zachytava screenshoty alebo ich aj spoji do videa ? lebo zdrojak na spojenie do videa tam newidim , ale je tam pouzite 100FPS , 50FPS.... a tim sa rata tusim video :\

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Problem stále přetrvává,tady kolega popisuje stejnou chybu co je u mě při ukládání http://www.vbnet.cz/forum-tema--3616-sav...

má stejnou chybu GDI

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Letmým pohledem na RECScreen.Interval = "100" je vidět, že tohle by mohla být příčina chyby, protože Interval je nejspíš typu Integer (RECScreen je Timer?).

Jinak nechápu proč vůbec pokládáte takovou otázku, snad vidíte co je ve Visual Studiu podtrženo a označeno jako chybné ne?

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Problem stále přetrvává,tady kolega popisuje stejnou chybu co je u mě při ukládání http://www.vbnet.cz/forum-tema--3616-sav...

RECScreen je timer

má stejnou chybu GDI

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Problém bude skutečně v tom, že na takto rychlé snímání není GDI+ stavěno a proto může skutečně docházet k různým vyjímkám.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Na youtube jsem našel video kde je napsaný zdrojový kod udělal jsem to stejně podle toho.U dotyčného to chybu neudělá jede mu to.

http://www.youtube.com/watch?v=XdmIf6lqI...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tento zdroják funguje ukládá normálně. Ale tento nedokáže pracovat z videem ten před tím uměl ale zase se nechtěl uložit.

Public Class Form1
    Dim graph As Graphics
    Dim screenshot As System.Drawing.Bitmap
    Dim bound As Rectangle
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


    End Sub

    Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.Hide()
        System.Threading.Thread.Sleep(500)
        dopicture()
        Me.Show()
    End Sub

    Private Sub dopicture()
        Dim picture As New Bitmap(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
        Dim graphic As Graphics = Graphics.FromImage(picture)
        graphic.CopyFromScreen(0, 0, 0, 0, picture.Size)
        PictureBox1.Image = picture
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Me.SaveFileDialog1.ShowDialog()
        Me.PictureBox1.Image.Save(Me.SaveFileDialog1.FileName)
    End Sub
End Class

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Doporučoval bych vám, abyste se neinspiroval takovými amatérskými hovadinami. Udělat něco skutečně funkčního jako například FRAPS, nebo Camtasia Studio je uplně jiná liga programování...

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Prpsím neznáte nějakou internetovou stránku kde bych mohl získat nějaké informace jako návody ukázkové zdrojové kody atd.Pokoušel jsem to hledat ale nic zatím nenašel.Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

V tom případě neumíte hledat, takových stránek jsou stovky, jeden z nejlepších je The CodeProject.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Zkontrolujte, jestli ta poskládaná cesta je správná a jestli tam program může zapisovat. Dělá to doufám na tom řádku se Save, nebo snad jinde?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano dělá to přesně tam.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback