Классы System.Drawing в .NET намного мощнее, чем думают люди. Единственное, чего не хватает (что на самом деле очень важно в 2D-графике), это умение читать и писать отдельные пиксели. Технически это возможно при использовании методов GetPixel и SetPixel для объекта Bitmap, но эти методы невообразимо медленны.
К счастью, существует супербыстрая альтернатива, которую вы можете реализовать, вызывая LockBits для битовой карты и затем напрямую обращаясь к байтовым данным битовой карты. Я использовал это для хорошего эффекта. Фактически, я провел последнюю неделю, создавая эффект «рыбий глаз» целиком в .NET (никаких библиотек или вызовов PInvoke вообще).
Этот JPEG довольно дурацкий, но он показывает, что возможно, используя только .NET:
альтернативный текст http://www.freeimagehosting.net/uploads/5fdd250b21.jpg