Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Colore Testo/Immagine di Sfondo - Contrasto

Salve,
    premetto che non ho mai lavorato con la grafica in VB, giusto adesso sto
facendo un programmino in cui devo mettere come sfondo di un form
un'immagine, che può cambiare, però ho notato che a seconda dei colori
dell'immagine dovrei anche modificare il colore del testo che è sopra
all'immagine, a questo punto volevo sapere se esiste una funzione, un'OCX o
che altro che mi dia la tonalità media di un'immagine in modo da impostare
il colore del testo in netto contrasto con essa!
Grazie Mille
Stracca
--
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - - - -
Cerca le risposte alle tue domande sul Sito Comune del
newsgroup it.comp.lang.visual-basic: 
http://www.murialdo.it/it_lang_vb
- - - - - - - - - - - - Magari prima leggi l'Help in
linea!  - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - - - -

 il colore del testo in netto contrasto con essa!
In un caso del genere non hai bisogno di una precisione estrema, penso che ti
convenga fare così:
Immagina una griglia sovrapposta all'immagine, ad esempio di 30 * 30 punti,
leggi una campionatura dell'immagine con ColoreDelPunto = Point (X,Y)
fai una media dei 900 punti letti e inverti il colore RGB facendo:
R = 255 - Rmedio  ; G = 255 - Gmedio ; B = 255 - Bmedio
Prova a mettere in un form una picturebox, un commandbutton e due
label parzialmente sovrapposte, carica un'immagine nella picturebox
e metti questo codice nel commandbutton:
_______________________________
'Private Sub Command1_Click()
    Dim PosX As Long
    Dim PosY As Long
    Dim ColoreMedio As Double
    Dim SpazioOrizzGriglia As Long
    Dim SpazioVertGriglia As Long
    Dim ColoreDaUsare As Long
    SpazioOrizzGriglia = Picture1.Width \ 30
    SpazioVertGriglia = Picture1.Height \ 30
    For PosX = 1 To 30
        For PosY = 1 To 30
            ColoreMedio = ColoreMedio + Picture1.Point(PosX * SpazioOrizzGriglia, PosY *
SpazioVertGriglia)
            ' attiva la riga qui sotto per visualizzare la griglia
            'Picture1.PSet (PosX * SpazioOrizzGriglia, PosY * SpazioVertGriglia), vbBlack
        Next PosY
    Next PosX
    ColoreMedio = ColoreMedio / 900
    ColoreDaUsare = RGB(255, 255, 255) - Fix(ColoreMedio)
    Label1.Caption = "Colore medio dell'immagine"
    Label1.BackColor = ColoreMedio
    Label2.Caption = "Colore di contrasto"
    Label2.BackColor = ColoreDaUsare
'End Sub
_______________________________
Ovviamente manca la gestione degli errori, tipo immagine troppo piccola ecc.,
però funzia !
Bye, G.
--
---------------------------------------------
    Le risposte alle tue domande le trovi sul
    Sito Comune di questo NewsGroup:
 
http://www.murialdo.it/it_lang_vb
---------------------------------------------
Real E-address: 
gaet...@hotmail.com

OVVIAMENTE ho detto una Craxata immane... così imparo a scrivere senza pensare !
Ho provato l'esempio che ti ho dato, e mi sono reso conto che, OVVIAMENTE,
non posso trattare un valore RGB come un numero normale, in quanto è
la composizione di 3 elementi, che OVVIAMENTE vanno separati e valutati
individualmente e, OVVIAMENTE, mi cospargo il capo di cenere e mi ci mando da solo...
:-((((((((((
Cmq, la procedura corretta è (beh, dovrebbe essere..., cioè, lo spero...) la seguente:
__________________________
    Dim PosX As Long
    Dim PosY As Long
    Dim ColoreMedio As Double
    Dim ColoreDelPunto As Long
    Dim SpazioOrizzGriglia As Long
    Dim SpazioVertGriglia As Long
    Dim ColoreDaUsare As Long
    Dim Rmedio As Double
    Dim Gmedio As Double
    Dim Bmedio As Double
    Dim PuntiDellaGriglia As Long
    Dim PuntiTotali As Double
    Picture1.AutoRedraw = True
    PuntiDellaGriglia = 30
    PuntiTotali = PuntiDellaGriglia * PuntiDellaGriglia
    SpazioOrizzGriglia = Picture1.Width \ PuntiDellaGriglia
    SpazioVertGriglia = Picture1.Height \ PuntiDellaGriglia
    For PosX = 0 To PuntiDellaGriglia
        For PosY = 0 To PuntiDellaGriglia
            ColoreDelPunto = Picture1.Point(PosX * SpazioOrizzGriglia, _
            PosY * SpazioVertGriglia)
            Rmedio = Rmedio + ColoreDelPunto Mod &H100
            ColoreDelPunto = ColoreDelPunto \ &H100
            Gmedio = Gmedio + ColoreDelPunto Mod &H100
            ColoreDelPunto = ColoreDelPunto \ &H100
            Bmedio = Bmedio + ColoreDelPunto Mod &H100
            ' attiva la riga qui sotto per visualizzare la griglia
            ' Picture1.PSet (PosX * SpazioOrizzGriglia, PosY * _
            SpazioVertGriglia), vbBlack
        Next PosY
    Next PosX
    Rmedio = Rmedio / PuntiTotali
    Bmedio = Bmedio / PuntiTotali
    Gmedio = Gmedio / PuntiTotali
    ColoreMedio = RGB(Rmedio, Gmedio, Bmedio)
    ColoreDaUsare = RGB(255 - Rmedio, 255 - Gmedio, 255 - Bmedio)
    Label1.Caption = "Colore medio dell'immagine"
    Label1.BackColor = ColoreMedio
    Label2.Caption = "Colore di contrasto"
    Label2.BackColor = ColoreDaUsare
_______________________
ATTENZIONE: un'ultimo avviso, la funzione Point funziona correttamente solo se
tutta l'immagine è visibile oppure se Picture1.Autoredraw = True.
Già che c'ero ho parametrizzato la spaziatura della griglia, ora puoi variare
semplicemente il valore di PuntiDellaGriglia per rendere la griglia più o meno fitta,
e ho corretto i cicli For che dovevano iniziare da 0 anziché da 1.
Bye, G.
--
---------------------------------------------
    Le risposte alle tue domande le trovi
    sul Sito Comune di questo NewsGroup:
 
http://www.murialdo.it/it_lang_vb
       ... e nell'help in linea !
---------------------------------------------
Real E-address: 
gaet...@hotmail.com

    Label2.BackColor = ColoreDaUsare
+ o -, funziona, ma non e' preciso, o meglio, credo che si possa far di
meglio.
Un sacco di tempo fa' ebbi la necesita' di trovare la luminosita' di un
colore e scegliere da una palette il colore di luminosita' opposta per avere
la massima differenza, chiesi ad una BBS su Fidonet e mi risposeco un una
formulina per ricavare un fattore di luminosita' dal RGB.
Haime' era ancora su Amiga 2000 ed ho perso i sorgenti, ma a sensazione la
formula era circa cosi':
Luminosita = Verde * 3 + Rosso * 2.5 + Blu * 1.5
Dato che cosi' facendo la luminosita' va da 0 a 1785 direi che il
ColoreDaUsare sia solo o NERO o BIANCO e scegliere NERO se la luminosita'
media e' >= 892 e BIANCO se < di 892.
PS: se qualcuno sa la formula esatta x la luminosita', si faccia avanti... .
Salutoni
Ciao
By -MES-   Maronese Ettore
http://www.maronese.com/mes
(con OCX per stampare i recordset)
Sito Comune di programmatori Visual Basic
http://www.murialdo.it/it_lang_vb