Jump to content

Gdi+ Vs Byte[]


wmismail

Recommended Posts

Ö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

3.png

Ş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

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...