GdipEffects

    • Release
    • Open Source

    Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Zcared.

      Vorwort:
      Da ich mich wegen eines anderen Projektes durch die GDI+ Doku wühlen muss, bin ich auf die Methode Bitmap::ApplyEffect gestoßen. GDI+ verfügt über recht schnelle Effekte, zu sehen hier. Leider bietet .Net diese nicht an, da die Klassen erst ab GDI+ Version 1.1 verfügbar sind. Es gibt 2 Versionen von GDI+, 1.0 für XP und 1.1 ab Vista. Deswegen fand ich es doch ganz nützlich diese Effektklassen zur Verfügung zu stellen.

      Name des Programms:
      GdipEffects

      Beschreibung:
      Die Bibliothek wrappt die Effektklassen von GDI+ und wendet sie auf eine Bitmap an.

      Screenshot(s):
      Siehe Anhang

      Verwendete Programmiersprache(n) und IDE(s):
      C++/CLI (IDE: VS 2012)

      Systemanforderungen:
      .NET Framework 4.0
      Mindestens Windows Vista

      Systemveränderungen:
      Keine

      Download(s):
      Bibliothek im Anhang
      Quellcode: Github

      Lizenz/Weitergabe:

      Freeware; OpenSource
      Bilder
      • ClassDiagram.png

        82,49 kB, 1.723×650, 345 mal angesehen
      Dateien

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Gonger96“ ()

      Falls noch Interesse besteht, vervollständige ich den Wrapper (9 Effekte + 1 Überladung von ApplyEffect). Ich hab aus Spaß mal den Blureffekt auf einen Button angewendet
      Spoiler anzeigen

      C#-Quellcode

      1. public class BlurredButton :
      2. Button
      3. {
      4. private float effectRadius = 0.7f;
      5. public float EffectRadius
      6. {
      7. get { return effectRadius; }
      8. set
      9. {
      10. if (effectRadius == value) return;
      11. effectRadius = value;
      12. if(effect != null)
      13. effect.Radius = value;
      14. Invalidate();
      15. }
      16. }
      17. private bool effectExpandEdge = true;
      18. public bool EffectExpandEdge
      19. {
      20. get { return effectExpandEdge; }
      21. set
      22. {
      23. if (effectExpandEdge == value) return;
      24. effectExpandEdge = value;
      25. if(effect != null)
      26. effect.ExpandEdge = effectExpandEdge;
      27. Invalidate();
      28. }
      29. }
      30. private Blur effect;
      31. bool effectCreated = false;
      32. protected override void Dispose(bool disposing)
      33. {
      34. effect.Dispose();
      35. base.Dispose(disposing);
      36. }
      37. protected override void OnPaint(PaintEventArgs pevent)
      38. {
      39. if (!effectCreated)
      40. {
      41. effect = new Blur();
      42. effect.Radius = effectRadius;
      43. effect.ExpandEdge = effectExpandEdge;
      44. effectCreated = true;
      45. }
      46. base.OnPaint(pevent);
      47. using (Bitmap bmp = new Bitmap(ClientRectangle.Width, ClientRectangle.Height))
      48. {
      49. DrawToBitmap(bmp, ClientRectangle);
      50. bmp.ApplyEffect(effect, ClientRectangle);
      51. pevent.Graphics.DrawImage(bmp, ClientRectangle);
      52. }
      53. }
      54. }

      Zuerst einmal: Gute Arbeit! :)

      Ich habe deine Bibliothek mal getestet.
      Zwei Ideen habe ich noch:
      1. Eine Methode die angibt ob die Effekte auf dem momentanem System unterstützt werden
      2. Eine Kompilierung der Bibliothek auf AnyCPU (Ist das möglich?)

      Eine Weiterentwicklung fände ich super, diese Feature trägt doch einiges zu GDI bei.
      SᴛᴀʀGᴀᴛᴇ01
      Der Wrapper sollte so nun Vollständig sein. Zu den Effekten ist noch die Eigenschaft IsAvailable hinzugefügt worden und die Klasse ColorModifier. Diese ist eine Collection aus 256 Bytes. Zusammen mit dem Effekt ColorLUT werden entsprechende Farbkanalwerte ersetzt.

      C#-Quellcode

      1. using (ColorLUT effect = new ColorLUT())
      2. {
      3. effect.AlphaChannel[0] = 255; // Ersetzt jeden Alphawert = 0 mit 255
      4. effect.Update();
      5. Bitmap.ApplyEffect(effect, new Rectangle(0, 0, backImage.Width, backImage.Height));
      6. }

      Vielleicht mach ich mich demnächst mal schlau, ob man auch eigene Effekte hinbekommt. Ansonsten war's das.
      Das ginge z.B. über ColorLUT

      VB.NET-Quellcode

      1. Using eff As New ColorLUT()
      2. For i As Integer = 0 To 255
      3. eff.RedChannel(i) = Not CByte(i)
      4. eff.GreenChannel(i) = Not CByte(i)
      5. eff.BlueChannel(i) = Not CByte(i)
      6. Next
      7. eff.Update()
      8. bmp.ApplyEffect(eff, New Rectangle(0, 0, bmp.Width, bmp.Height))
      9. End Using

      Oder ganz einfach mit einer ColorMatrix und DrawImage, dass dürfte wohl schneller sein.