Imagini [Visual Basic]

Salut ! Astazi voi scrie un tutorial legat de programare, mai exact, Visual Basic. Ce vom invata ? Vom invata despre Imagini, Pixeli, R, G, B, GrayScale, etc. Sa incepem !

Ce este o imagine ? O imagine reprezinta mai multe obiecte adunate intr-un tot unitar. O imagine este o insiruire de pixeli. Ce este un pixel ? Pixelul este cea mai mica subdiviziune a unei imagini. Pixelul apare sub forma unui punct [.] si are diferite culori. In concluzie, o imagine este formata din mai multi pixeli cu diferite culori.

Valoarea unei culori este de obicei pe 32 de biti [colorref] (valoarea unei culori este stocata pe 4 bytes, doar 3 sunt importanti -> R, G, B), in format RGB. Ce inseamna format RGB ? R=Red [Rosu], G=Green [Verde], B=Blue [Albastru]. Orice culoare se poate obtine prin amestecul a diferite cantitati din aceste 3 culori.

Acum sa aflam cum putem seta un pixel la o anumita culoare, cum putem scoate R, G, B dintr-o culoare si, mai tarziu [cod sursa], sa folosim GrayScale.

1. Cum setam o un pixel la o anumita culoare ? Pentru aceasta, folosim 2 functii API din libraria GDI32, foarte importante, si anume:

</p>
<p class="MsoNormal">Public Declare Function GetPixel Lib "GDI32" (ByVal hDC As Long, ByVal x As Long, ByVal y As Long) As Long</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">Public Declare Function SetPixel Lib "GDI32" (ByVal hDC As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long</p>
<p class="MsoNormal"><span> </span>

Despre Functii API am invatat intr-un tutorial anterior (il gasiti pe vladii.wordpress.com). Sa explicam prima functie. GetPixel preia culoarea pixelului aflat la coordonatele (x,y). ByVal hDC As Long reprezinta handleul canvasului imaginii (am povestit despre Handleuri in acelasi tutorial despre Functii API). Handleul Canvasului imaginii se noteaza astfel: Picture1.hDC, unde Picture1 este o imagine de pe Formularul dumneavoastra. Sa dau un exemplu concret de extragere a culorii unui pixel si o atribuie variabilei color (de tip Long):

</p>
<p class="MsoNormal">Dim color as Long</p>
<p class="MsoNormal">color = GetPixel(Picture1.hDC, 100, 100)</p>
<p class="MsoNormal">

Cum setam unui pixel o anumita culoare ? Simplu, folosind functia API, SetPixel. Cum functioneaza ea ? La fel ca cea de mai sus, spre exemplu: Call SetPixel(Picture1.hDC, 100, 100, color), unde color este culoarea care vrem sa ii fie atribuita pixelului de coordinate (100, 100) din imaginea Picture1.

2. Cum extragem R, G, B dintr-un ColorRef (dintr-o culoare) ? Urmatorul cod sursa face exact acest lucru, sa-l vedem si analizam (bineinteles, eu am exemplificat pana acum codurile, folosind un modul in care am adaugat functiile API. Un modul se adauga in felul urmator: Project -> Add Module -> New (Module) -> Open):

</p>
<p class="MsoNormal">Dim color as Long</p>
<p class="MsoNormal">color = GetPixel(Picture1.hDC, 100, 100)</p>
<p class="MsoNormal">Dim R as Integer</p>
<p class="MsoNormal">Dim G as Integer</p>
<p class="MsoNormal">Dim B as Integer</p>
<p class="MsoNormal">R = <span> </span>color Mod 256</p>
<p class="MsoNormal">G= (color \ &amp;H100) Mod 256</p>
<p class="MsoNormal">B = (color \ &amp;H10000) Mod 256</p>
<p class="MsoNormal">

 

Asa extragem R, G, B dintr-o culoare. Acum sa creem o aplicatie care transforma o imagine (imagine color, bineineles), in una alb-negru (cand spun imaginea alb-negru ma refer la GrayScale, adica la orice nuanta de gri, culorile obtinute prin amestecul non-culorilor alb si negru). GrayScale se obtine atribuind lui R valoarea (R+G+B) \ 3, lui G valoarea (R+G+B) \ 3, iar lui B valoarea (R+G+B) \ 3. Deci, va trebuie sa avem pe Formular 3 butoane, un Common Dialog(care il introducem prin: Project -> Components -> Microsoft common Dialog Control 6.0 -> Ok [acesta ne va folosi pentru a incarca imaginea din calculator]), si un PictureBox, cu denumirea Picture1.De mentionat ca trebuie sa aveti adaugat un modul in care sa declarati functiile API: GetPixel si SetPixel. Imaginea urmatoare sper sa va clarifice lucrurile in minte despre GrayScale:

Inainte [Fara GrayScale] -> Dupa [Cu GrayScale]

Sa transcriem codul:

Codul pentru Load Image, pus pe butonul cu denumirea Command1:

</p>
<p class="MsoNormal">Dim filelocation As String</p>
<p class="MsoNormal">CommonDialog1.Filter = "All images"</p>
<p class="MsoNormal">CommonDialog1.ShowOpen</p>
<p class="MsoNormal">filelocation = CommonDialog1.FileName</p>
<p class="MsoNormal">Picture1.Picture = LoadPicture(filelocation)</p>
<p class="MsoNormal"><span> </span>

Codul pentru butonul, care daca apasam pe el, se produce transformarea in alb-negru a imaginii incarcate anterior:

</p>
<p class="MsoNormal">Dim a As Integer</p>
<p class="MsoNormal">Dim b As Integer</p>
<p class="MsoNormal">Dim color As Long</p>
<p class="MsoNormal">Dim colorR As Integer</p>
<p class="MsoNormal">Dim colorG As Integer</p>
<p class="MsoNormal">Dim colorB As Integer</p>
<p class="MsoNormal">Dim pixel As Integer</p>
<p class="MsoNormal">For a = 1 To 1000</p>
<p class="MsoNormal">For b = 1 To 1000 ‘aceste 2 Foruri parcurg imaginea</p>
<p class="MsoNormal">color = GetPixel(Picture1.hDC, a, b)</p>
<p class="MsoNormal">colorR = color Mod 256</p>
<p class="MsoNormal">colorG = (color \ &amp;H100) Mod 256</p>
<p class="MsoNormal">colorB = (color \ &amp;H10000) Mod 256</p>
<p class="MsoNormal">pixel = (colorR + colorG + colorB) \ 3</p>
<p class="MsoNormal">Call SetPixel(Picture1.hDC, a, b, RGB(pixel, pixel, pixel))</p>
<p class="MsoNormal">Next</p>
<p class="MsoNormal">Next</p>
<p class="MsoNormal">

Codul pentru butonul de iesire:

</p>
<p class="MsoNormal">Unload Me</p>
<p class="MsoNormal">

 

Cam atat pentru acest tutorial ! Bafta, si nu uitati ! Mai treceti pe la http://vladii.wordpress.com deoarece in fiecare zi acest site va fi updatat cu noi tutoriale facute de mine ! Salut !

 

Bibliografie:

</p>
<p class="MsoNormal"><a href="http://www.devx.com/vb2themax/Tip/18427">http://www.devx.com/vb2themax/Tip/18427</a></p>
<p class="MsoNormal">

 

Lasă un Răspuns