Newsgroup: it.comp.lang.visual-basic
Titolo: API Stretchblt e inversione colore

Sto usando due API Stretchblt consecutive 
con parametri Mergepaint e Srcand
con una immagine e la sua maschera in nero 
per disegnare tale immagine su una picturebox
evitando così di disegnare anche lo sfondo di tale
immagine sulla picturebox.
Tecnica nota e di cui si trovano molti esempi in rete.
------------
Ora per vorrei che questa immagine che mi si va a disegare 
abbia anche l'inversione dei colori.
Es:
se l'imagine fosse una croce rossa e
la picturebox avesse anche essa in quel momento un rosso,
la croce, se non mi inverte i colori, non mi si distingue più.
Tra i parametri della API in questione
oltre a Mergepaint e Srcand
ce ne sono una decina di altri da potersi usare
(tra cui, sembra, alcuni con la proprieta invertente),
inoltre probabilmente la proprietà
.picturemode  della picturebox dovrebbe essere impostata
su vbInvert.
In totale ci sono circa 120 combinazioni possibili.
Ne ho provate un po' ma non ho ottenuto la mia immagine
a colori invertiti sulla picturebox.
Qualcuno conosce la combinazione esatta dei parametri
da mettere in gioco e se la proprietà .picturemode
della picturebox va messa su vbIvert?
Grazie


 Dunque questo è quello che mi ricordo relativamente a quando mi divertivo a
"giocare" con queste cosine.
Ci vuole una ScreeMask monocromatica e una cursor mask a colori con sfondo
nero
Poi disegni la ScreenMask in SRCAND e dopo la CursorMask SRCIVERT e il gioco
è fatto ( forse LoL )
Ciaoo
--------------------------------
Inviato via 
http://usenet.libero.it


 Scusa ho riletto la tua domanda, ti ho postato il procedimento classico per
disegnare senza alterare lo sfondo.
Per colori invertiti cosa intendi?
Ciao


Intendo che se disegni una linea rossa
su una picturebox che riporta una immagine colorata 
col metodo Line (non con le API)
e la picturebox in questione ha la proprietà 
picturemode = vbInvert
tale linea rossa, se va a coprire una zona con
del bianco rimane rossa, se va su una zona rossa
cambia colore (non è più rossa; in genere diventa giallina o bianca)
per poterla cosi distinguere dallo sfondo rosso.
Io però devo usare le API e non il metodo line Line


Scusa ma forse intendi la DrawMode non la PictureMode o mi sto confendendo
io?
Cmq se fosse la DrawMode mettendo la uguale a vbInvert non ottieni l'effetto
che vuoi perchè la vbInvert fa il NOT dei bit della destinazione.
Prova con il "NotXorPen" dovrebbe fare al caso tuo ma ricorda che il colore
di fondo in questo caso DEVE essere il bianco!


Sě č la drawmode, hai ragione
Perň tra tutti i valori provati (6, 8, 10 ...),
ammesso che vadano impostati,
per l'uso con la API Stretchblt 
(che sono obbligato ad usare)
non riesco a sortire effetti.
Sono i parametri della API
quelli da indovinare (2 o piů
in combinazione tra loro)


Cerca sull'MSDN info su questa funzione GDI SetROP2() e prova con il valore
R2_NOTXORPEN.Ti posto l'url :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/pantdraw_9gdu.asp
In pratica č equivalente alla DrawMode.
Fai un po di prove intanto mi documento meglio ( almeno ci provo )
Fammi sapere se risolvi!
Ciaooo



  Allora se non ho sbagliato i calcoli il codice esadecimale della raster
operation che devi applicare, che sarebbe appunto Not ( D xor S ) dove D e S
sono [S]orgente e [D]estinazione è
 &H00990066 ( esadecimale )
Bada che è frutto di un mio calcolo e non l'ho provato.
Fammi sapere.
Ciao



Mmmmh...
Allora,
io sono a questo punto
 StretchBlt destination.hdc,..., maskimage.hdc, ... , MERGEPAINT
 StretchBlt destination.hdc,..., realimage.hdc, ... , SRCAND
e così ottengo la trasparenza dello sfondo della realimage.hdc
(tale realimage è una croce rossa su sfondo bianco, ma, come detto,
quest'ultimo diventa trasparente e riesco a vederci sotto la
destination.hdc che è per la metà di sinistra blu e per la metà di
destra rossa. Quando sono sopra al blu,
il rosso della croce lo distinguo,
qunado sono sopra al rosso lo perdo perchè
la combinazione consecutiva MERGEPAINT e SRCAND 
assicura trasparenza ma non da'  inversione di colore).
A questo punto il valore esadecimale che hai trovato dove lo
imposto?
nota:
la croce è una esemplificazione, la mia realimage è
più complessa.


 Allora andiamo per gradi, normalmente per dare trasparenza allo sfondo di
una immagine si fa cosi :
ScreeMask nera con sfondo bianco
CursorMask a colori con sfondo nero
Poi disegni la ScreenMask in SRCAND ( non MERGEPAINT ) e dopo la CursorMask
SRCINVERT.
 
Questo assicura trasparenza.
Il codice del'operazione che ti ho indicato dovvrebbe fare in modo che la
"croce rossa" su sfondo bianco sia normalmente visibile, mentre su sfondo
rosso si visibile con i colori invertiti, però, ora che mi ha fatto
l'esempio "rivelatore", c'è da considerare anche la trasparenza dello
sfondo.
Le cose si complicano...ci penso...



 Ah ma per curiosità dove hai visto questo effetto?
Magari se lo vedo mi viene in mente qualcosa!!!


Siccome ho chiesto anche sul newsgroup
microsoft.public.vb.winapi
col titolo
"Stretchblt API : transparency + color inversion"
in data
14 Aug 2003
tra le risposte che ho avuto
c'č da ultimo una che parla di
0x990066  "NOTXORSRC"
te lo comunico nel caso ti puņ esssere utile.
Te ci sei arrivato un giorno prima 
(sempre che funzioni) !
Adesso vado a provarlo, se 
ci riesco; sento che...


 Bene allora il calcolo che avevo fatto è giusto!
 Solo che da altri calcoli ( bit a bit ) che ho fatto, per la trasparenza non
dovresti aveer problemi, ma per l'immagine principale si perchè l'immagine
sulla quale vai a disegnare la CursorMask ( a colori con sfondo nero )
essendo trova i bit a zero della ScreenMask e questo comporta una inversione
di colore anche quando non serve!!
Credo che ci voglia uno o piu passaggi intermedi.
Continuo a fare calcoli...



 Anzi credo che avrai problemi anche con lo sfondo...mmm...a meno che...non
usi una sola maschera con sfondo bianco ma anche cosi hai la trasparenza ma
hai sempre e cmq l'inversione di colore anche quando non serve tranne che
sul bianco ...continuo a pensare...forse ho capito ( forse eh! Considera che
solo le 00:10 quindi potrei essere il pieno delirio LoL ).
Ciao
Ciao


Dunque questa funziona
Const NOTXORSRC = &H990066 
StretchBlt destination.hdc,..., realimage.hdc, ... , NOTXORSRC
e non c'è bisogno di mettere in gioco la mask.
Ottengo cioè l'inversione del colore rosso della mia 
croce rossa presente nella realimage
quando si posiziona sui diversi colori
della destination.hdc
ed anche trasparenza dello sfondo bianco
cha ha tale croce rossa nella realimage.
----
Ora una domanda:
se al posto della croce rossa sulla mia realimage ho:
sfondo bianco
cappuccio di Babbo Natale rosso con ponpon bianco
- io vorrei ovviamente che il ponpon bianco 
  non mi diventi trasparente
-la trasparenza dello sfondo bianco
-l'inversione dei colori (del rosso del cappuccio e del ponpon
 bianco) sui diversi colori della destination .hdc
---     ---      ----      ----
Come detto, se metto in gioco la sola
StretchBlt destination.hdc,..., realimage.hdc,..., NOTXORSRC
come per le precedente immagine tutta rossa,
essa mi fa diventare trasparente anche il ponpon,
cosa che non voglio.
Penserei ora di ricorrere ad una mask
(cosa che non mi da fastidio):
ora però occorre beccare i prametri giusti ed anche 
la loro sequenza, suppongo.
Ho provato con
StretchBlt Picture1.hdc,..., Picture2.hdc,..., MERGEPAINT
StretchBlt Picture1.hdc,..., Picture3.hdc,..., SRCAND
StretchBlt Picture1.hdc,..., Picture3.hdc,..., &H990066 
ma non ha funzionato.
Qualche idea?

 ha scritto nel messaggio
news:3f3f5d27...@powernews.inwind.it...
[cut]
: Ora una domanda:
: se al posto della croce rossa sulla mia realimage ho:
:
: sfondo bianco
: cappuccio di Babbo Natale rosso con ponpon bianco
:
: - io vorrei ovviamente che il ponpon bianco
:   non mi diventi trasparente
: -la trasparenza dello sfondo bianco
: -l'inversione dei colori (del rosso del cappuccio e del ponpon
:  bianco) sui diversi colori della destination .hdc
[cut]
:Qualche idea?
Babbo Natale non esiste...sigh...
Scherzavo, good coding!
Ciao, Luca.


 Come da me "pre-postato" hai avuto problemi con la trasparenza e cioè tutto
ciò che è bianco diventa trasparente e anche di inversione , perchè
l'inversione l'hai su qualsiasi sfondo e non solo su colori di primo
piano/sfondo uguali rosso giusto!?
Purtroppo credo che bisognerà creare immagini di passaggio per ottenere
tutti gli effetti desiderati!
Ci sto lavorando...



Come va il lavoro?
A questa inversione di colori
sono interessato anche io   :-)  


 Procedono...:)


Il 17 Ago 2003, 13:08, 
Mich...@inwind.it
 (Mike) ha scritto:

Allora vediamo un po se cosi può andare,
1) Disegni la tua immagine secondo il metodo classico per la trasparenza (
quindi ScreenMask in SRCAND e CursorMask in SRCINVERT )
2) Ti prepari una nuova MASK che abbia in BIANCO tutto quello che
nell'immagine finale NON DEVE SUBIRE VARIAZIONI DI COLORE ( in pratica sarà
trasparente ).
Applichi questa MASK con il NOTXORPEN ( &H990066 )
In pratica tutto quello che sulla MASK è bianco diverrà trasparente tutto
quello con i colori originali subirà inversione.
Si una una MASK in più ma per il momento è l'unica soluzione che "vedo".
Naturalmente questo è applicabile a immagini relativamete semplici, non è
che prendi una foto la scannerizzi e applichi il tutto a questa foto, anche
perchè la MASK nuova la devi creare ad-hoc a manella...!!!
NOTA :
   L'ho provato SOLAMENTE sul blocco note, fammi sapere se funzia.


Sě,
sembrerebbe che fare uso di un'altra picturebox
messa in mask, che fa da ponte
prima della picturebox di destinazione finale
sia l'unica soluzione...
Grazie