Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Visual Basic 6 - Salvare una picturebox modificata con TransparentBlt
Forum - Visual Basic 6 - Salvare una picturebox modificata con TransparentBlt

Avatar
Lorenzo L (Normal User)
Newbie


Messaggi: 4
Iscritto: 05/06/2010

Segnala al moderatore
Postato alle 10:44
Sabato, 05/06/2010
Salve a tutti, sono un nuovo utente ma consulto questo interessantissimo sito da tempo.

Ho un problema che probabilmente si dimostrerà essere una stupidata...

In pratica devo sovrapporre un logo su una immagine, mantenendo i bordi rendendo trasparenti alcune parti del logo stesso. Quindi in modo abbastanza efficace ho usato l'API TransparentBlt. Però quando devo salvare l'immagine nella picture modificata, non viene inserito il logo. Questo invece succedeva se usavo il metodo PaintPicture, ma avevo l'inconveniente che non c'era la trasparenza...

Dove sbaglio?

Codice sorgente - presumibilmente VB.NET

  1. 'Ci sono solo due Picturebox. Picturebox1 è un'immagine con il logo il cui colore bianco deve essere reso trasparente. La Picturebox2 contiene lo sfondo.
  2. Private Declare Function TransparentBlt Lib "msimg32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal crTransparent As Long) As Boolean
  3. Private Sub Form_Load()
  4.     Picture1.ScaleMode = vbPixels
  5.     Picture2.ScaleMode = vbPixels
  6.     Picture1.AutoSize = True
  7. End Sub
  8.  
  9. Private Sub Picture2_Paint()
  10.     DoEvents
  11.     TransparentBlt Picture2.hdc, 0, 0, Picture2.ScaleWidth, Picture2.ScaleHeight, Picture1.hdc, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, vbWhite
  12.     SavePicture Picture2.Image, "c:\prova.bmp"
  13. End Sub



Grazie a tutti!!!
Siete grandi!

PM Quote
Avatar
Alfonso (Ex-Member)
Guru


Messaggi: 688
Iscritto: 30/09/2009

Segnala al moderatore
Postato alle 13:28
Sabato, 05/06/2010
Il risultato della tua routine è solo virtuale. Quello che vedi è memorizzato nella zona usata per il display del monitor.
L'unica maniera per poter salvare il risultato è operare una cattura della porzione di schermo che inquadra la PictureBox2.
Oppure, cambiando metodo, usare la funzione BitBlt e qualche maschera.

PM Quote
Avatar
Lorenzo L (Normal User)
Newbie


Messaggi: 4
Iscritto: 05/06/2010

Segnala al moderatore
Postato alle 14:32
Sabato, 05/06/2010
Salve,

grazie mille della pronta risposta. Immaginavo, a forza di tentativi, che l'immagine fosse solo virtuale. Ho provato con il metodo bitblt ma non cambia nulla.


Codice sorgente - presumibilmente VB.NET

  1. 'Ci sono solo due Picturebox. Picturebox1 è un'immagine con il logo il cui colore bianco deve essere reso trasparente. La Picturebox2 contiene lo sfondo.
  2. Private Declare Function TransparentBlt Lib "msimg32.dll" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal crTransparent As Long) As Boolean
  3. Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
  4.  
  5. Private Sub Form_Load()
  6.     Picture1.ScaleMode = vbPixels
  7.     Picture2.ScaleMode = vbPixels
  8.     Picture1.AutoSize = True
  9. End Sub
  10.  
  11. Private Sub Picture2_Paint()
  12.     DoEvents
  13.     TransparentBlt Picture2.hdc, 0, 0, Picture2.ScaleWidth, Picture2.ScaleHeight, Picture1.hdc, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, vbWhite
  14.     BitBlt Picture3.hdc, 0, 0, Picture2.Width, Picture2.Height, Picture2.hdc, 0, 0, vbSrcCopy
  15.     SavePicture Picture3.Image, "c:\fotoelogo.bmp"
  16.    
  17. End Sub



In ogni caso, esistono altre vie con VB6 per inserire un immagine sopra ad un'altra con relativa trasparenza (quindi senza usare paintimage) e soprattutto salvare il risultato?

PM Quote
Avatar
Alfonso (Ex-Member)
Guru


Messaggi: 688
Iscritto: 30/09/2009

Segnala al moderatore
Postato alle 14:52
Sabato, 05/06/2010
Questo è un piccolo esempio. Bisogna solo crearsi una bitmap che funga da maschera.


Alfonso ha allegato un file: Trasparenza.zip (31602 bytes)
Clicca qui per scaricare il file
PM Quote
Avatar
Lorenzo L (Normal User)
Newbie


Messaggi: 4
Iscritto: 05/06/2010

Segnala al moderatore
Postato alle 15:44
Sabato, 05/06/2010
Grazie Alfonso.

Il programma che hai gentilmente postato lo studiato per bene, però non mi sembra abbastanza flessibile. Infatti devo sempre avere due immagini (logo + mask) e lo sfondo. La mask non è tanto facile da fare se ho ad'esempio un titolo sotto il logo.


Ultima modifica effettuata da Lorenzo L il 05/06/2010 alle 15:46
PM Quote
Avatar
Alfonso (Ex-Member)
Guru


Messaggi: 688
Iscritto: 30/09/2009

Segnala al moderatore
Postato alle 17:04
Sabato, 05/06/2010
Puoi sempre crearti al volo la maschera. Nel caso il colore da rendere trasparente sia il bianco:

Codice sorgente - presumibilmente VB.NET

  1. Private Function CreaMaschera()
  2.   Dim x As Integer, y As Integer
  3.   Mask.Picture = PictureBox1.Picture
  4.   For x = 0 To PictureBox1.ScaleWidth
  5.     For y = 0 To PictureBox1.ScaleHeight
  6.        If Mask.Point(x, y) <> vbWhite Then
  7.          Mask.PSet (x, y), vbBlack
  8.        End If
  9.     Next
  10.   Next
  11. End Function


PM Quote
Avatar
Lorenzo L (Normal User)
Newbie


Messaggi: 4
Iscritto: 05/06/2010

Segnala al moderatore
Postato alle 13:46
Domenica, 06/06/2010
Grazie mille!
Così posso superare le difficoltà che avevo trovato. Visto che comunque nel web ho trovato altri utenti che si facevano la mia domanda, se riesco faccio un piccolo programma-riassuntivo del prezioso codice postato da Alfonso. :k:

PM Quote