wmismail Posted August 10, 2008 Share Posted August 10, 2008 Özet Bu makalemizde bir Windows form içindeki resme parlaklık arttırıp azaltmayı inceleyeceğiz. Bunun için .net içindeki kütüphanelerden de faydalanabiliriz veya kendimizde çözüm geliştirebiliriz. Bu makalede her ikisine de değinilecektir. GDI+ Nedir ? .Net içindeki gelişmiş kütüphanelerden biridir. System.Drawing sınıfını desteklemektedir. Bu sınıf aracılığıyla projelerimiz içinde görsel uygulamalar oluşturabiliriz. GDI+ içindeki tüm sınıflar 6 tane isim uzayında toplanmıştır. System.Drawing System.Drawing.Desing System.Drawing.Printing System.Drawing.Imaging System.Drawing.Drawing2D System.Drawing.Text <strong>Design Şimdi kodlarımızı yazalım ve manasını açıklamaya çalışalım. public static Bitmap Brightness(Bitmap b, int nBrightness) { if (nBrightness < -255 || nBrightness > 255) return b; BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); int stride = bmData.Stride; System.IntPtr Scan0 = bmData.Scan0; int nVal = 0; unsafe { byte* p = (byte*)(void*)Scan0; int nOffset = stride - b.Width * 3; int nWidth = b.Width * 3; for (int y = 0; y < b.Height; ++y) { for (int x = 0; x < nWidth; ++x) { nVal = (int)(p[0] + nBrightness); if (nVal < 0) nVal = 0; if (nVal > 255) nVal = 255; p[0] = (byte)nVal; ++p; } p += nOffset; } } b.UnlockBits(bmData); return b; } Gördüğünüz gibi fonksiyonumuz Bitmap veritipinde bir değişken ve birde kullanıcının gireceği değeri alıyor. Bu parametreleri bu fonksiyona yolladığımızda bunlar işlenip bize aynı bitmapın parlatılmış hali yollanıyor. Burada dikkat edeceğiniz en önemli kısım Setpixel() ve GetPixel() fonksiyonlarının kullanılmamış olması ve bunların yerine dizilerin kullanılmış olduğudur. p[0] = (byte)nVal; gördüğünüz gibi GetPixel() fonksiyonunun yaptığı iş burada byte[0] dizisi ile sağlanıyor. Dizilerle yapılan bu işlem bir önceki yapılan uygulamaya göre inanılmaz derecede hız sağlıyor. 30 MB bir resim üzerinde denedim çok kısa süre içinde resmi istediğim değerde parlattı. Bunu diğer uygulama ile yapmaya çalışırsanız çok uzun sürecektir ve zaten diğer yöntemi kullanmanın pek mantıklı olduğunu düşünmüyorum. Bu her iki uygulamayı da kodlarıyla birlikte aşağıdaki linkten indirebilirsiniz. Her ikisi de aynı proje içindedir dolayısıyla fonksiyonlardan birini commentleyip ikisini de test edebilirsiniz. Makaleye ait örnek uygulamayı indirmek için tıklayın. Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.