Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 27
  1. #1

    [vb.net 2008] colore pixel immagine

    Vorrei riuscire a prelevare il colore rgb di un pixel (quindi 3 numeri) in vb 2008. Lo avevo già fatto con il vb6, ma ora ho difficoltà. Riesco a collegarmi alla webcam, a leggere le immagini, ma ora come devo fare?
    Ho già dichiarato la funzione
    codice:
    Declare Function GetPixel Lib "gdi32.dll" (ByVal hdc As Integer, ByVal nXPos As Integer, ByVal nYPos As Integer) As Integer
    Ho nella picturebox di nome objPreview l'immagine della webcam. Ora quando premo un bottone dovrei riuscire ad ottenere il valore RGB del pixel... Richiamo il metodo:
    codice:
    GetPixel(objPreview, 100, 100)
    ma mi dice
    Impossibile convertire il valore di tipo 'System.Windows.Forms.PictureBox' in 'Integer'.
    Dove sbaglio???

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Ci sei quasi ma, sbagli a passare la pictureBox invece che il suo Handle

    codice:
           [DllImport("user32.dll")]
            static extern IntPtr GetDC(IntPtr hwnd);
    
            [DllImport("user32.dll")]
            static extern Int32 ReleaseDC(IntPtr hwnd, IntPtr hdc);
    
            [DllImport("gdi32.dll")]
            static extern uint GetPixel(IntPtr hdc, int nXPos, int nYPos);
    
      IntPtr myhdc = GetDC(pictureBox1.Handle );
                uint pixel = GetPixel(myhdc ,50, 50);
                ReleaseDC(IntPtr.Zero, myhdc );
                Color colore = Color.FromArgb((int)pixel);
                textBox1.Text = colore.ToString();
    Sbagliare è umano, perseverare è diabolico.

  3. #3
    non mi va... mi restituisce 255 255 255 e a me servirebbero già separate in variabili...
    se metto
    codice:
    TextBox1.Text = GetPixel(objPreview.Handle, 50, 50)
    mi restituisce sempre -1

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970


    Mai hai visto il codice che ho scritto sopra ??

    Secondo te

    codice:
    IntPtr myhdc = GetDC(pictureBox1.Handle );
    uint pixel = GetPixel(myhdc ,50, 50);
    equivale a:

    codice:
    TextBox1.Text = GetPixel(objPreview.Handle, 50, 50)
    ?

    A parte C# invece che VB ma mi sembra che :

    codice:
    Dim hdc As IntPtr = GetDC(pictureBox1.Handle)
    Dim pixel As Integer = GetPixel(hdc, 50, 50)
    ReleaseDC(IntPtr.Zero, hdc)
    Dim colore As Color = Color.FromArgb(CInt(pixel))
    textBox1.Text = colore .R.ToString()
    textBox2.Text = colore .G.ToString()
    textBox3.Text = colore .B.ToString()
    sia un pò diverso da:

    codice:
    TextBox1.Text = GetPixel(objPreview.Handle, 50, 50)
    Sbagliare è umano, perseverare è diabolico.

  5. #5
    ci ho provato a smanettare un pochino con il c e a provare a tradurlo in visual basic... ma mi restituisce errore...

    codice:
    IntPtr myhdc = GetDC(pictureBox1.Handle ); 
    uint pixel = GetPixel(myhdc ,50, 50);
    e le dichiarazioni in vb come le devo fare?
    codice:
    Public Declare Function GetPixel Lib "gdi32.dll" (ByVal hdc As Integer, ByVal nXPos As Integer, ByVal nYPos As Integer) As Integer     
    Public Declare Function GetDC Lib "user32.dll" (ByVal hwnd As IntPtr) As IntPtr     
    Public Declare Function ReleaseDC Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal hdc As IntPtr) As Int32
    così può andare?

    ma comunque in esecuzione mi dice:
    Impossibile trovare un punto di ingresso con nome 'releaseDC' nella DLL 'user32.dll'.

    edit:
    Scrivendo
    codice:
    Public Declare Function ReleaseDC Lib "user32.dll" (ByVal hWnd As System.IntPtr, ByVal hDC As System.IntPtr) As Integer
    non mi da errore, ma mi restituisce 240,240,240 se la webcam non è avviata e 255,255,255 se è avviata...
    (ovviamente ho provato a mettere luce davanti e non cambia niente..)

    riedit:
    E dopo un po ci sono riuscito :P
    Praticamente ho salvato un fotogramma in un altra picturebox, e analizzo quella con il metodo sopra e funziona :P


    codice:
    Private Sub CaptureImage()         
    Dim data As IDataObject         
    Dim bmap As Image          'copiamo l'immagine nella clipboard---           
    SendMessage(hHwnd, WM_CAP_EDIT_COPY, 0, 0)         'convertiamo il tutto in bmp           data = Clipboard.GetDataObject()         
    If data.GetDataPresent(GetType(System.Drawing.Bitmap)) Then             
    bmap = CType(data.GetData(GetType(System.Drawing.Bitmap)),  _                    Image)             
    PictureBox1.Image = bmap             'StopPreviewWindow()         
    End If     
    End Sub      
    
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click         
    CaptureImage()     
    End Sub
    e ovviamente


    Dopo basta mettere un timer che faccia in automatico i click e il gioco è fatto!
    codice:
    Dim hdc As IntPtr = GetDC(PictureBox1.Handle)

  6. #6
    A me sembra un metodo un po' contorto per ottenere il colore di un pixel... ma nella picturebox l'immagine da dove arriva?
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    non mi da errore, ma mi restituisce 240,240,240 se la webcam non è avviata e 255,255,255 se è avviata...
    (ovviamente ho provato a mettere luce davanti e non cambia niente..)
    Tu non avevi precisato da dove venisse l'immagine della PictureBox. Ovviamente il metodo che avevo postato funzionava impostando la proprietà .Image della PictureBox e non attribuendo il flusso video proveniente da una Webcam a una finestra in cui l'handle è quello della PictureBox!

    Dopodichè ti basta, piò o meno come hai già fatto, un pò più semplicemente:

    codice:
    SendMessage(hHwnd, WM_CAP_EDIT_COPY, 0, 0)
    Dim img As Image = My.Computer.Clipboard.GetImage()
    Poi con l'immagine ottenuta hai diversi metodi per estrarre l'informazioni sui singoli pixel, dipende da cosa devi fare.
    Sbagliare è umano, perseverare è diabolico.

  8. #8
    domani provo a vedere se funziona anche così, grazie mille.
    Devo studiarmi meglio il .net, è troppo diverso dal 6

  9. #9
    funziona, ma volevo registrare il video.. è normale che mi mostri sempre il mouse come in caricamento o no?
    codice:
    Private Sub btnIniziaRegistrazione_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles btnIniziaRegistrazione.Click
     btnIniziaRegistrazione.Enabled = False
     btnStopRegistrazione.Enabled = True
     '---start recording---
     SendMessage(hWnd, WM_CAP_SEQUENCE, 0, 0)
    End Sub
    
    Private Sub btnStopRegistrazione_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles btnStopRegistrazione.Click
      btnIniziaRegistrazione.Enabled = True
      btnStopRegistrazione.Enabled = False
      '---save the recording to file---
      SendMessage(hWnd, WM_CAP_FILE_SAVEAS, 0, "D:\videoRegistrato.avi")
    End Sub
    funziona, ma ho quel problema...

  10. #10
    continuando con il programma ora devo fare un altra cosa per terminare il sensore di movimento...

    La mia domanda dovrebbe essere abbastanza semplice, ho un immagine, analizzo i vari pixel con un semplice ciclo, ma se il colore soddisfa determinate condizioni come posso fare per farlo ad esempio di colore blu?

    devo ancora scrivere il codice, ma il confronto su un singolo pixel riesco a farlo, ora faccio due matrici, su una ci salvo i colori dell'immagine precedente, su un altra quelli di adesso e poi li confornto..

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.