× Aktuálně z oboru

SHIELD Experience Upgrade 7 – méně hledání a více zábavy [ clanek/2018052902-shield-experience-upgrade-7-mene-hledani-a-vice-zabavy/ ]
Celá zprávička [ clanek/2018052902-shield-experience-upgrade-7-mene-hledani-a-vice-zabavy/ ]

Práca s grafikou I. - Inverzia

[ http://programujte.com/profil/1863-marek/ ]Google [ ?rel=author ]       [ http://programujte.com/profil/118-zdenek-lehocky/ ]Google [ ?rel=author ]       23. 10. 2005       11 631×

Týmto článkom by som chcel naštartovať novú sériu článkov o počítačovej grafike vo Visual Basicu. Dnes sa pozrieme na inverziu obrázku a predstavíme si dve API funkcie, ktoré podstatne zrýchlia vaše aplikácie...

Prvá API funkcia sa volá GetPixel a slúži na zistenie farby pixelu. Je podobná funkcii Picturebox.point, ale ako som už spomínal, je niekoľkonásobne rýchlejšia. Druhá funkcia sa volá SetPixel a slúži na nakreslenie pixelu. Deklarácia týchto funkcií sa prevedie nasledovne:


Private Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long

Teraz niečo k inverzii. Inverzia je funkcia, pri ktorej sa každý pixel obrázku rozloží na RGB zložky a každá zložka sa odčíta od hodnoty 255. Zdrojový kód vyzerá takto:


Private Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long

Private Function Inverzia(Obrazok As Object)

Dim X, Y As Double
Dim Color As Long
Dim R, R1, R2 As Integer
Dim G, G1, G2 As Integer
Dim B, B1, B2 As Integer

For X = 0 To (Obrazok.Width - 1) / 15
For Y = 0 To (Obrazok.Height - 1) / 15
Color = GetPixel(Obrazok.hdc, X, Y)
B1 = Color  256  256
G1 = (Color  256) Mod 256
R1 = Color Mod 256
R = 255 - R1
G = 255 - G1
B = 255 - B1
Color = RGB(R, G, B)
SetPixel Obrazok.hdc, X, Y, Color
Next Y
Next X

End Function

Implementáciu funkcie si môžete pozrieť tu [ http://programujte.com/file.php?id=25_1130008557_inverzia ].
Samozrejme, že existuje aj API funkcia na inverziu, ale cieľom tohto článku je vytvoriť si vlastnú, aj keď pomalšiu funkciu.

Na záver by som ešte pridal pár tipov pre prácu s grafikou.

1.) Pre obrázok, ktorý chcete invertovať nastavte:
AutoRedraw = true
AutoSize = true

2.) Použitie funkcií GetPixel a SetPixel je až 3 krát rýchlejšie, keď má obrázok nastavenú hodnotu visible = false

V ďalšom článku sa môžete tešiť na transparenciu.


Článek stažen z webu Programujte.com [ http://programujte.com/clanek/2005110601-praca-s-grafikou-i-inverzia/ ].