Newsgroup: it.comp.lang.visual-basic
Titolo: Pixel colorati .... ?

Dispongo di un controllo PictureBox contenente un'immagine, della quale voglio sapere i colori di ogni singolo pixel.
Come procedo:
- tramite i metodi height e width mi faccio restituire le dimensioni   dell'immagine;
- creo una matrice di interi lunghi che conterra i codici colori RGB   di ogni singolo pixel;
- For x = 1 To Larghezza
       For y = 1 To Altezza
           PixTable(x, y) = Picture1.Point(x, y)
       Next
  Next
A questo punto sorgono 2 diversi problemi:
1) per ogni indice della metrice ho un intero lungo che dovrebbe       rappresentarmi il colore RGB del punto specificato (x,y): come    faccio a ottenere le componenti R, G, B?
2FileAttachment=
____________________________________________________________________
Get free e-mail and a permanent address at 
http://www.netaddress.com/?N=1
--
Automatic posted from 
www05.netaddress.usa.net
 [204.68.24.25]
via Mailgate Server - 
http://www.mailgate.org





       Next
  Next

2FileAttachment=

--
Automatic posted from 
www08.netaddress.usa.net
 [204.68.24.28]






       Next
  Next

2FileAttachment=

--
Automatic posted from 
www07.netaddress.usa.net
 [204.68.24.27]






       Next
  Next

2FileAttachment=

--
Automatic posted from 
www04.netaddress.usa.net
 [204.68.24.24]


Dispongo di un controllo PictureBox contenente un'immagine, della quale voglio sapere i colori di ogni singolo pixel.
Come procedo:
- tramite i metodi height e width mi faccio restituire le dimensioni   dell'immagine;
- creo una matrice di interi lunghi che conterra i codici colori RGB   di ogni singolo pixel;
- For x = 1 To Larghezza
       For y = 1 To Altezza
           PixTable(x, y) = Picture1.Point(x, y)
       Next
  Next
A questo punto sorgono 2 diversi problemi:
1) per ogni indice della metrice ho un intero lungo che dovrebbe       rappresentarmi il colore RGB del punto specificato (x,y): come    faccio a ottenere le componenti R, G, B?
2) quando processo immagini anche non eccessivamente grandi (150x150     pixel), il tempo di elaborazione e' piuttosto elevato (non ho una     macchina lenta): c'e' qualche altro sistema, oltre al metodo point    per svolgere il compito in maniera piu' veloce?
Un fiducioso grazie a chiunque sia in grado di rispondermi.    
 
 
____________________________________________________________________
Get free e-mail and a permanent address at 
http://www.netaddress.com/?N=1
--
Automatic posted from 
www01.netaddress.usa.net
 [204.68.24.21]


Automatic posted from 
www05.netaddress.usa.net
 [204.68.24.25]


 1) per ogni indice della metrice ho un intero lungo che dovrebbe       rappresentarmi il colore RGB del punto specificato (x,y): come    faccio a ottenere le componenti R, G, B?
v& = clng(PixTable(x, y))
rc& = v& And &Hff&
gc& = (v& And &HFF00&) / &H100&
bc& = (v& And &HFF0000) / &H10000
Semplice no?
Ciao
Roberto

2FileAttachment=
????
ciao,ciao
Maurizio
maum...@basta.tin.it
togliete basta. per rispondere
please remove basta. to reply


Ci credo che e' lento!
Point e' una funzione di PictureBox e la chiami per (150x150 =) 22500 volte!
La soluzione piu' veloce e' di lavorare direttamente sui dati della bitmap.
Purtroppo non ho del codice di esempio, ma tentero' di avviarti sulla giusta
strada:
L'help di PictureBox.Image dice:
"È possibile assegnare il valore di Image alla proprietà Picture. La
proprietà Image fornisce inoltre un valore da passare alle chiamate API di
Windows."
Per cui dovresti usare le API di Windows.
In particolare la GetDIBits(), di cui riporto sotto la pagina di Help delle
API (nel caso tu non ce l'abbia!)
Attenzione che dovresti avere un po' di conoscenza sulla struttura bitmap di
Windows.
La documentazione la puoi trovare sul sito:
http://www.wotsit.org/
che contiene la documentazione di moltissimi tipi di file.
Se non riesci a prenderlo, te lo posso mandare per e-mail (NON sul NG!)
Richiesta:
se riesci a finire il tuo progetto con le informazioni che ti ho dato, ti
chiedo di farne un progettino di esempio (o almeno la funzione per
recuperare i dati dell'immagine) e di metterli a disposizione per il sito
comune. grazie.
--
Roal Zanazzi
z...@iol.it
The GetDIBits function retrieves the bits of the specified bitmap and copies
them into a buffer using the specified format.
int GetDIBits(
    HDC hdc, // handle of device context
    HBITMAP hbmp, // handle of bitmap
    UINT uStartScan, // first scan line to set in destination bitmap
    UINT cScanLines, // number of scan lines to copy
    LPVOID lpvBits, // address of array for bitmap bits
    LPBITMAPINFO lpbi, // address of structure with bitmap data
    UINT uUsage  // RGB or palette index
   );
Parameters
hdc    Identifies the device context.
hbmp    Identifies the bitmap.
uStartScan    Specifies the first scan line to retrieve.
cScanLines    Specifies the number of scan lines to retrieve.
lpvBits    Points to a buffer to receive the bitmap data. If this parameter
is NULL, the function passes the dimensions and format of the bitmap to the
BITMAPINFO structure pointed to by the lpbi parameter.
lpbi    Points to a BITMAPINFO structure that specifies the desired format
for the device-independent bitmap (DIB) data.
uUsage    Specifies the format of the bmiColors member of the BITMAPINFO
structure. It must be one of the following values:
Value Meaning
DIB_PAL_COLORS The color table should consist of an array of 16-bit indices
into the current logical palette.
DIB_RGB_COLORS The color table should consist of literal red, green, blue
(RGB) values.
Return Values
If the lpvBits parameter is non-NULL and the function succeeds, the return
value is the number of scan lines copied from the bitmap.
Windows 95:
If the lpvBits parameter is NULL and GetDIBits successfully fills the
BITMAPINFO structure, the return value is the total number of scan lines in
the bitmap.
Windows NT:
If the lpvBits parameter is NULL and GetDIBits successfully fills the
BITMAPINFO structure, the return value is non-zero.
If the function fails, the return value is zero.
Remarks
If the requested format for the DIB matches its internal format, the RGB
values for the bitmap are copied. If the requested format doesn't match the
internal format, a color table is synthesized. The following table describes
the color table synthesized for each format.
Value Meaning
1_BPP The color table consists of a black and a white entry.
4_BPP The color table consists of a mix of colors identical to the standard
VGA palette.
8_BPP The color table consists of a general mix of 256 colors defined by
GDI. (Included in these 256 colors are the 20 colors found in the default
logical palette.)
24_BPP No color table is returned.
If the lpvBits parameter is a valid pointer, the first six members of the
BITMAPINFOHEADER structure must be initialized to specify the size and
format of the DIB. Note that a bottom-up DIB is specified by setting the
height to a positive number, while a top-down DIB is specified by setting
the height to a negative number. The bitmap's color table will be appended
to the BITMAPINFO structure.
If lpvBits is NULL, GetDIBits examines the first member of the first
structure pointed to by lpbi. This member must specify the size, in bytes,
of a BITMAPCOREHEADER or a BITMAPINFOHEADER structure. The function uses the
specified size to determine how the remaining members should be initialized.
If lpvBits is NULL and the bit count member of BITMAPINFO is initialized to
zero, GetDIBits fills in BITMAPINFOHEADER or BITMAPCOREHEADER without the
color table. This technique can be used to query bitmap attributes.
The bitmap identified by the hbmp parameter must not be selected into a
device context when the application calls this function.
The origin for a bottom-up DIB is the lower-left corner of the bitmap; the
origin for a top-down DIB is the upper-left corner.
See Also
BITMAPCOREHEADER, BITMAPINFO, BITMAPINFOHEADER, SetDIBits

>
Se ti vuo i divertire con le API puoi utilizzare questo codice (attenzione
funziona solo con una risoluzione a 256 colori, per altre risoluzioni lo
devi modificare in modo appropriato)
Inserisci su un form una picturebox contenente una immagine, una listbox e
un commandbutton
nelle dichiarazioni inserisci
Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long,
ByVal dwCount As Long, lpBits As Any) As Long
Private Declare Function MyGetObject Lib "gdi32" Alias "GetObjectA" (ByVal
hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Declare Function GetPaletteEntries Lib "gdi32" (ByVal hPalette As
Long, ByVal wStartIndex As Long, ByVal wNumEntries As Long, lpPaletteEntries
As PALETTEENTRY) As Long
Private Declare Function GetCurrentObject Lib "gdi32" (ByVal hdc As Long,
ByVal uObjectType As Long) As Long
Private Const OBJ_PAL = 5
Private Type BITMAP
            bmType As Long
            bmWidth As Long
            bmHeight As Long
            bmWidthBytes As Long
            bmPlanes As Integer
            bmBitsPixel As Integer
            bmBits As Long
    End Type
Private Type PALETTEENTRY
            peRed As Byte
            peGreen As Byte
            peBlue As Byte
            peFlags As Byte
    End Type
nell'evento click del pulsante inserisci
    Dim handlePalette As Long        ' handle della palette della picturebox
    Dim Immagine As BITMAP           ' struttura BITMAP
    Dim Buffer() As Byte                    ' buffer contenete i dati
dell'immagine
    Dim sizeBuffer As Long                ' dimensione del buffer
    Dim TempX As Long, TempY As Long, Temp As Integer    ' varie
    Dim Sunto(255) As Integer          ' matrice contenente i numeri di
pixel per colore
    Dim colore As PALETTEENTRY    ' struttura PALETTEENTRY
    handlePalette = GetCurrentObject(Picture1.hdc, OBJ_PAL)        ' ricavo
l'handle della palette
    MyGetObject Picture1.Image, Len(Immagine), Immagine            ' ricavo
parte della struttura bitmap
    sizeBuffer = Immagine.bmHeight * Immagine.bmWidthBytes    ' determino la
dimensione del buffer dei dati
    ReDim Buffer(sizeBuffer - 1) As Byte
    GetBitmapBits Picture1.Image, sizeBuffer, Buffer(0)        ' acquisisco
la struttura dell'immagine
' riempio la matrice della numerosità dei pixel per colore
    For TempY = 0 To Immagine.bmHeight - 1
        For TempX = 0 To Immagine.bmWidth - 1
            Sunto(Buffer(TempY * Immagine.bmWidthBytes + TempX)) =
Sunto(Buffer(TempY * Immagine.bmWidthBytes + TempX)) + 1
        Next
    Next
' per ogni colore presente nell'immagine reperisco dalla palette i valori
RGB e li visualizzo nella listbox
    For Temp = 0 To 255
        If Sunto(Temp) <> 0 Then
            GetPaletteEntries handlePalette, Temp, 1, colore
            List1.AddItem "Colore (" & CStr(colore.peRed) & "," &
CStr(colore.peGreen) & "," & CStr(colore.peBlue) & ")  n.ropixel = " &
CStr(Sunto(Temp))
        End If
    Next
Ciao Bruno

>


se al posto di Point usi GetPixel dovrebbe velocizzarsi l'esecuzione
e tra i vari cicli for inserisci pure un bel DoEvents..........
Prodiy2