FastGraphicsLib 1.0.0.5

    • Beta

    Es gibt 39 Antworten in diesem Thema. Der letzte Beitrag () ist von 00yoshi.

      Weil du uns weder die Fehlermeldungen definierst noch einen vernünftigen Code ausführst. Definiere bitte in Zukunft deine Variablen mit Typenbezeichnung.
      Wenn ich den Code ausführe wird ne neue Registrierkarte geöffnet in der steht:
      "Der Bitmapbereich ist bereits gesperrt."

      Spoiler anzeigen

      VB.NET-Quellcode

      1. Public Shared Sub Color_ersetzen(ByVal ParamArray Farbwerte() As Single)
      2. Dim Farbe1 As Color
      3. Dim Farbe2 As Color
      4. Dim Picture As Bitmap = Hauptfenster.PictureBox1.Image
      5. Dim fg As FastGraphics = FastGraphics.FromBitmap(Hauptfenster.PictureBox1.Image)
      6. If Farbwerte(0) = 256 Then
      7. If Farbwerte(4) = 256 Then
      8. fg.FindAndSetPixel(Color.FromArgb(Farbwerte(1), Farbwerte(2), Farbwerte(3)), Color.FromArgb(Farbwerte(5), Farbwerte(6), Farbwerte(7)))
      9. Else
      10. fg.FindAndSetPixel(Color.FromArgb(Farbwerte(1), Farbwerte(2), Farbwerte(3)), Color.FromArgb(Farbwerte(4), Farbwerte(5), Farbwerte(6), Farbwerte(7)))
      11. End If
      12. Else
      13. If Farbwerte(4) = 256 Then
      14. fg.FindAndSetPixel(Color.FromArgb(Farbwerte(0), Farbwerte(1), Farbwerte(2), Farbwerte(3)), Color.FromArgb(Farbwerte(5), Farbwerte(6), Farbwerte(7)))
      15. Else
      16. fg.FindAndSetPixel(Color.FromArgb(Farbwerte(0), Farbwerte(1), Farbwerte(2), Farbwerte(3)), Color.FromArgb(Farbwerte(4), Farbwerte(5), Farbwerte(6), Farbwerte(7)))
      17. End If
      18. End If
      19. Hauptfenster.PictureBox1.Image = fg.Bitmap
      20. ' If Farbwerte(0) = 256 Then
      21. ' Farbe1 = Color.FromArgb(Farbwerte(1), Farbwerte(2), Farbwerte(3))
      22. ' Else
      23. ' Farbe1 = Color.FromArgb(Farbwerte(0), Farbwerte(1), Farbwerte(2), Farbwerte(3))
      24. ' End If
      25. ' If Farbwerte(4) = 256 Then
      26. ' Farbe2 = Color.FromArgb(Farbwerte(5), Farbwerte(6), Farbwerte(7))
      27. ' Else
      28. ' Farbe2 = Color.FromArgb(Farbwerte(4), Farbwerte(5), Farbwerte(6), Farbwerte(7))
      29. ' End If
      30. ' For y As Single = 1 To Hauptfenster.PictureBox1.Image.Size.Height - 1
      31. 'For x As Single = 1 To Hauptfenster.PictureBox1.Image.Size.Width - 1
      32. 'If Picture.GetPixel(x, y) = Farbe1 Then
      33. ' Picture.SetPixel(x, y, Farbe2)
      34. 'End If
      35. ' Next
      36. ' Next
      37. ' Hauptfenster.PictureBox1.Image = Picture
      38. End Sub


      (Mit dem Code mit ' davor (was genau das gleiche macht, nur isses langsamer) funktionierts einwandfrei)

      Edit: Hätte nicht jemand sagen können dass man fg.Unlock ans Ende schreiben muss? ^^

      Neues Problem:

      FindAndSetPixel kann man so oft machen wie man will, es kommt nur bis zur hälfte des Bildes bei einem 280x280 Pixel großem Bild
      (Der Code ist der Selbe wie oben nur mit fg.Unlock vor Hauptfenster.PictureBox1.Image = fg.Bitmap)

      Im Anhang sind Screenshots:
      1. Testbild ohne bearbeitung
      2. FindAndSetPixel Weiß -> Schwarz (untere Hälfte fehlt)
      3. Die Umständliche Methode mit GetPixel und SetPixel ebenfalls weiß -> Schwarz (alles Vollständig)

      Nehm ich ein anderes Bild passiert dasselbe.
      Eigenartigerweise: Wenn ich nach dem Code mit FindAndSetPixel noch irgendeinen Code schreibe, gehts plötzlich 8| :huh:
      PS: Nein ich bin nicht verrückt.
      Bilder
      • test2.jpg

        25,8 kB, 323×391, 225 mal angesehen
      • test1.jpg

        29,71 kB, 338×401, 205 mal angesehen
      • test3.jpg

        31,11 kB, 326×396, 215 mal angesehen

      Dieser Beitrag wurde bereits 10 mal editiert, zuletzt von „Funcoder...“ ()

      Hallo,

      ich suche gerade einen Weg wie ich Zahlenwerte von einem externen Programm auslesen kann und bin dabei auf diesen sehr interessanten Thread gestoßen.
      Ich denke jetzt mal kurz laut und würd es super finden wenn ihr mir sagen könntet ob ich Richtig oder Falsch liege.

      Meine Frage dazu ist ich kann dieses Programm nicht direkt auf den Frame des externen Programms ansetzen oder?
      Ich müsste den Frame als Bild in meinen Zwischenspeicher bringen oder?
      Brauch ich ein externes Programm um ein Bild von meinem Frame zu machen?

      Danke
      Hallo,

      ich habe die FastGraphicsLip eingerichtet.

      Leider erhalten ich folgenden Fehler:
      "Der Bitmapbereich ist bereits gesperrt."

      Wenn ich

      VB.NET-Quellcode

      1. Dim fg As FastGraphics = FastGraphics.FromBitmap(bmp)
      in meinen Code einfüge.

      Eventuell kann jemand weiter helfen?
      Das macht keinen Unterschied. Wenn du mehrere Aufrufe von FastGraphics::FromBitmap, Bitmap.LockBits usw. machst, spielt es keine Rolle, an welcher Stelle. Auf jeden LockBits-Aufruf muss ein UnlockBits folgen, bevor ein erneuter LockBits-Aufruf eintreten kann. Damit geht folgendes z.B. nicht:

      VB.NET-Quellcode

      1. Public Sub X()
      2. Dim bmp As New Bitmap(100, 100)
      3. Dim bd As BitmapData = bmp.LockBits(New Rectangle(Point.Empty, bmp.Size), Imaging.ImageLockMode.ReadOnly, Imaging.PixelFormat.Format32bppArgb)
      4. Y(bmp)
      5. bmp.UnlockBits(bd)
      6. End Sub
      7. Public Sub Y(ByVal bitmap As Bitmap)
      8. Dim bd As BitmapData = bitmap.LockBits(New Rectangle(Point.Empty, bmp.Size), Imaging.ImageLockMode.ReadOnly, Imaging.PixelFormat.Format32bppArgb)
      9. MessageBox.Show(bd.Scan0.ToString())
      10. bitmap.UnlockBits(bd)
      11. End Sub

      Wie man sieht ruft X LockBits und Y LockBits auf. Da die FastGraphicsLib ebenfalls über LockBits arbeitet, funktioniert das mehrfache Aufrufen natürlich ebenfalls nicht. Gleiches läuft bei einem Zeichenvorgang bei GDI ab, nur dass glaub ich eine ExternalException geschmissen wird.

      Gruß
      ~blaze~
      Hallo!

      Ich habe das Problem, dass das Bild immer nur zu einem Teil verarbeitet wird.

      VB.NET-Quellcode

      1. Dim fg As FastGraphics = FastGraphics.FromBitmap(Image.FromFile("C:\explorer_black.bmp"))
      2. fg.FindAndSetPixelPercent(Color.Black, Color.Blue, 10)
      3. fg.Unlock()
      4. PictureBox1.Image = fg.Bitmap
      Bilder
      • screen.PNG

        6,34 kB, 318×318, 202 mal angesehen
      Ist es komplett schwarz ? Abweichung von 1 in irgendeinem Channel könnte es dir versauen.Egal hast die richtige Funktion dafür benutzt.

      setPixel in FastGraphics scheint nicht zu machen was es soll

      Hallo Kevin89,

      vielen Dank für die dll,
      die Geschwindigkeitssteigerung ist wirklich super. Ich versuche derzeit ein altes Projekt "Bildmittelung" wieder aufzuleben. Was macht das: Viele Bilder (alle gleiche size und Motiv, mit Stativ o.ä. Aufgenommen) werden mit getPixel in einen array ausgelesen. Die Beispielbilder (Ausschnitte) haben im Original 3264x2448 Pixel. Bei 50-100 Bildern kann das mit default Methoden ewig dauern - ohne schnelle Graphic lib nicht zu machen. Ich habe das Programm schon einmal in java unter netbeans geschrieben und versuche nun mit VB 2010 zumindest an den speed in java ranzukommen. Die bei Industrielle Bildverarbeitung (Demant) erwähnte Skalierung auf Minimum und Maximum soll noch als Option hinzukommen.



      Aus den gemittelten Werten für jeden Kanal wird wieder ein Bitmap gemacht. Im Resultat ist das Bildrauschen stark reduziert.
      Hier zum Vergleich (links:eines der Originalfotos, rechts statistisch entrauschtes Bild)




      Möglicherweise habe ich bei der FastGraphics Methode einen bug entdeckt. Benutze ich FastGraphics.setPixel, bekomme ich immer bei x=0 und y>0 also (ganz links am Bild) eine blaue Linie die so aussieht als ob alle Pixel von x=1 auf x=0 kopiert wurden und blau gefärbt. An der FastGraphics.getPixel Methode liegt es jedenfalls nicht, die werde ich auch weiterhin verwenden.

      Hier zum Vergleich (links: Bitmap.setPixel, rechts: FastGraphics.setPixel)



      Dim fg AsNew FastGraphics
      fg.SetPixel(w,h, FromArgb(rgbs(w, h, R), rgbs(w, h, G), rgbs(w, h, B)))

      Es ist zwar schon eine Weile her das Du die dll geposted hast...aber das wäre echt riesig wenn du dir das nochmal ansehen könntest. Sollte Jemand noch eine andere schnelle Methode zum Pixel setzen kennen bin ich für Hinwiese dankbar. Grüsse, emil

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „emil.quast“ ()

      Weil es vielleicht noch ein paar Bugs gibt und der TE das nich nicht als "fertig" releasen wollte vielleicht?!
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
      Ich habe folgenden code:

      VB.NET-Quellcode

      1. Private Function convert(bmp As Bitmap, ValueR As Integer, ValueG As Integer, ValueB As Integer)
      2. Dim lb As FastGraphicsLib.FastGraphics = FastGraphicsLib.FastGraphics.FromBitmap(bmp)
      3. For x As Integer = 0 To bmp.Width - 1
      4. For y As Integer = 0 To bmp.Height - 1
      5. Dim col As Color = lb.GetPixel(x, y)
      6. Dim r2 As Integer = col.R
      7. Dim b2 As Integer = col.B
      8. Dim g2 As Integer = col.G
      9. Dim a2 As Integer = col.A
      10. r2 = r2 * (ValueR / 255)
      11. g2 = g2 * (ValueG / 255)
      12. b2 = b2 * (ValueB / 255)
      13. Dim col2 As Color = Color.FromArgb(a2, r2, g2, b2)
      14. lb.SetPixel(x, y, col2) ' <---- ERROR
      15. lb.Unlock()
      16. Next y
      17. Next x
      18. Return lb.Bitmap
      19. End Function


      ERROR:

      AccessViolationException:
      Es wurde versucht im geschützten speicher zu lesen oder schreiben. dies ist häufig ein hinweis darauf dass anderer speicher beschädigt ist.
      Das liegt am Clienten, also an VS bei dir selbst. Könnte etwa durch die dll aufkommen.
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: