Pages

Sunday, November 14, 2010

GDI+ භාවිතයෙන් Pictures වලට Effects යෙදීම

GDI+ කියන්නෙ Windows applications සඳහා භාවිතා කල හැකි API එකක්. විවිධ ආකාරයේ Graphics contents පෙන්වීමට හා එවා Print කර ගැනීමට අවශ්‍ය පහසුකම් මින් සපයනවා. අද මම පෙන්වන්න හදන්නෙ GDI+ භාවිතා කරල අපි ලඟ තිබෙන පින්තූරයක විවිධ වෙනස්කම් කරන්නෙ කොහොමද කියලයි. හරියට Photoshop වල Filters දානව වගෙ වැඩක්. මෙහිදී වෙන්නෙ අපේ Image එකේ තියෙන එක එක Pixel එකේ තියෙන Red, Green හා Blue Values වෙන වෙනම සොයාගෙන අපි දාන්න හදන Effect එකට අදාල විදියට වර්ණ වෙනස් කරල නැවතත් එම Pixel එකටම ඇතුලත් කිරීමයි. අපි මුලින්ම බලමු Grayscale effect එක ලබා දෙන්නෙ කොහොමද කියල. මුලින්ම පහතින් දැක් වෙන Variables ටික Class declaration එකට පහලින් Declare කර ගන්න.
Private Xpos As Integer
Private Ypos As Integer
Private colR As Integer
Private colG As Integer
Private colB As Integer
මෙහි Xpos හා Ypos වලින් එක් එක් Pixel එකේ X හා Y අගයන් ලබා ගැනීමද colR, colG හා colB වලින් එක් එක් Pixel එකේ Red, Green හා Blue Values ලබා ගැනීමද කරනවා. දැන් Grayscale effect එක සඳහා පහත Code එක ලියා ගන්න.
Private Sub Grayscale()
   Dim img As New Bitmap(picImage.Image)
   Dim colRGB As Integer
   Progressbar.Maximum = img.Width
   For Xpos = 0 To img.Width - 1
      For Ypos = 0 To img.Height - 1
         colR = img.GetPixel(Xpos, Ypos).R
         colG = img.GetPixel(Xpos, Ypos).G
         colB = img.GetPixel(Xpos, Ypos).B
         colRGB = (colR * 0.33) + (colG * 0.33) + (colB * 0.33)
         img.SetPixel(Xpos, Ypos, Color.FromArgb(colRGB, colRGB, colRGB))
      Next
      Progressbar.Value = Xpos
  Next
  picImage.Image = img
  Progressbar.Value = 0
End Sub
මුලින්ම මෙහි සිදුකර ඇත්තේ img යනුවන් Bitmap Object එකක් සාදා ගැනීමයි. මෙහි Constructor එක වශයෙන් picImage නැමති Picture Box එකෙහි Image එක භාවිතා කර තිබෙනවා. ඉන් පසු For loops දෙකක් භාවිතා කර img Object එකෙහි එක් එක් Pixel එකෙහි ඇති R,G හා B Values Variables වලට අරගෙන තියෙනවා. Bitmap Class එකෙහි GetPixel function එකෙන් Pixel වල වර්ණය ලබා ගත හැකියි. ඉන් පසු කර ඇත්තෙ colRGB යනුවෙන් නව වර්ණයක් සාදා ගැනීමයි. නව වර්ණය සාදා ගැනීම සඳහා එක් එක් R,G හා B Values 0.33 ගුණ කර නැවත ඒ සියල්ල එකට එකතු කර ගෙන ඇත. ඉන් පසු මෙම නව වර්ණය මුලින් වර්ණ ලබා ගත් Pixel එකටම SetPixel Function එක මඟින් ඇතුලත් කර ගෙන තිබෙනවා. අවසානයේ දී picImage.Image = img යන්නෙන් අපි Grayscale අකාරයට වෙනස් කර ගත් img Object එක picImage වල Image එක වශයෙන් ලබා දී තිබෙනවා. මීට අමතරව මා මෙහි Progress bar එකක් ද භාවිතා කර ඇත. පහතින් මම ලබා ගත් මුල් රූපය හා Grayscale ආකාරයට වෙනස් කර ගත් රූපය දක්වා ඇත.



Emboss Effect එක ලබා දීම.

මේ සඳහා පහත Code භාවිතා කරන්න.
Private Sub Emboss(ByVal amount As Byte)
   Dim img As New Bitmap(picImage.Image)
   Dim colR1 As Integer
   Dim colG1 As Integer
   Dim colB1 As Integer
   Progressbar.Maximum = img.Width
   For Xpos = 0 To img.Width - (amount + 1)
      For Ypos = 0 To img.Height - (amount + 1)
         colR = img.GetPixel(Xpos, Ypos).R
         colG = img.GetPixel(Xpos, Ypos).G
         colB = img.GetPixel(Xpos, Ypos).B
         colR1 = img.GetPixel(Xpos + amount, Ypos + amount).R
         colG1 = img.GetPixel(Xpos + amount, Ypos + amount).G
         colB1 = img.GetPixel(Xpos + amount, Ypos + amount).B
         colR = Math.Min(Math.Abs((colR - colR1) + 128), 255)
         colG = Math.Min(Math.Abs((colG - colG1) + 128), 255)
         colB = Math.Min(Math.Abs((colB - colB1) + 128), 255)
         img.SetPixel(Xpos, Ypos, Color.FromArgb(colR, colG, colB))
      Next
      Progressbar.Value = Xpos
   Next
   picImage.Image = img
   Progressbar.Value = 0
End Sub
මෙහිදී ද කලින් මෙන් එක් එක් Pixel එකෙහි වර්ණය ලබා ගෙන එම වර්ණය යම් ආකාරයකට වෙනස් කර නැවත එම Pixel එකටම ආදේශ කරගෙන ඇත. මීට අමතරව මෙහිදී මම amount යනුවෙන් Parameter එකක් භාවිතා කර ඇති අතර මින් Emboss විය යුතු ප්‍රමාණය ලබා දිය හැකිය. පහතින් මම ලබා ගත් මුල් රූපය හා Emboss කර ගත් රූපය දක්වා ඇත.


මීලඟ ලිපියෙන් තවත් Effects කිහිපයක් හා මේ Effects සියල්ල එක් කර සාදා ගත් Application එකක් ලබා දෙන්න බලාපොරොත්තු වෙනවා. එහෙනම් අදට නවතිනව.