Newsgroup: it.comp.lang.visual-basic
Titolo: Come Standardizzare Colore RGB  a 256 colori

Come qualcuno di voi già ha letto ho trovato per alcune immagini un colore 
medio. Non essendoci pero' un ordinamento dei colori (intendo quelli a 
16milioni) per poter definire dei range di colore e per quindi definire una 
classificazione. Ho pensato che il risultato ottenuto potrei standardizzarlo 
a 256colori. In questo modo potrei per tutti i 256colori controllarli 
manualmente ed effettuare la classificazione manuale,ma almeno non sarebbero 
16milioni di colore ma solamente 256.
C'è quindi un modo semplice che dal colore RGB in esadecimale (per esempio 
#909194) al colore RGB a 256 colori più vicino? 


L'API GetNearestColor:
http://www.allapi.net/apilist/GetNearestColor.shtml
Bye
Raf

"Rafunk" <rafun...@NOTHANKSlibero.it> ha scritto nel messaggio 
news:e3ponq$8mn$1...@alix.livenet.it...

E come posso usarla?
Io ho una variabile stringa con dentro #909194 (eventualmente posso crearla 
anche senza il cancelletto se puo' dare problemi). Come faccio a creare 
un'altra variabile con dentro il codice "sicuro" a 256 colori? 

 un'altra variabile con dentro il codice "sicuro" a 256 colori?
Mi sono dimenticato di dire una cosa importantissima. A me interessa che 
faccia questo mestiere dentro una applicazione Visual Basic (VBA) 

 ha scritto nel messaggio news:rRZ7g.1081$bH....@tornado.fastwebnet.it...

ci vuoi anche il formaggio grattugiato sulla minestra?

 ci vuoi anche il formaggio grattugiato sulla minestra?
Se è possibile si. Non essendo un esperto programmatore, se ci fosse qualche 
cosa di già fatto sarebbe l'ideale! 

 ha scritto:

C'è anche un esempio
http://www.allapi.net/apilist/172B5720053F57342F4E6F8706B66B29.html
che ti restituisce un Long del colore partendo da un Long del tuo colore,
che puoi generare dalla stringa creata con HEX$() usando la funzione Val
Dim Col as Long
Dim Colore as String
Colore = "F2CD2F"
Col = Val ("&H" & Colore)
--
ciao
  Stefano

 ha scritto nel messaggio 
news:ZmZ7g.1013$bH....@tornado.fastwebnet.it...

Questa domanda mi riporta indietro negli anni, quando ancora avevo tempo da 
perdere nello sperimentare :)
Prova a vedere se questo di da una mano, io poi non ci avevo più provato:
http://groups.google.it/group/it.comp.lang.visual-basic/browse_frm/thread/36e053bfd311805c/2614c266759721e4?q=zanna+256+colori&rnum=18#2614c266759721e4
Ciao 

 
http://www.allapi.net/apilist/GetNearestColor.shtml
Siamo sicuri che questa funzioni?
Dice che questa usa la palette di sistema, ma se uno lavora a 32bit non 
credo che vi sia una palette.
E se uno lavora a 16bit che cavolo restituisce?
Ciao 

 Col = Val ("&H" & Colore)
Non ho capito tanto bene.In pratica io arrivo con la variabile Stringa 
RGBEsadec che contiene per esempio #363849 devo trasformarla in Long in modo 
che non contenga più il cancelletto. Quindi creo RGBESA che conterrà il 
valore 363849 e adesso come passo questo valore alla funzione?
Scrivo:
GetNearestColor (RGBESA,Risultato)
e dovrei trovarmi nella variabile anchessa Long il risultato cercato? 

e dovrei trovarmi nella variabile anchessa Long il risultato cercato? 
No, le API prima vanno dichiarate così:
Private Declare Function GetNearestColor Lib "gdi32" (ByVal hdc As Long, ByVal
crColor As Long) As Long
'Poi devi seguire l'enunciato:
Dim Col as Long
Dim Colore as String
Dim Risultato as Long
Colore = "F2CD2F"
Col = Val ("&H" & Colore)
Risultato = GetNearestColor (Me.hdc,Col )
'Me.hdc se usi la palette del Form ovviamente
--
ciao
  Stefano

  Stefano 

Le palette del Form? E quali sono? Ce ne sono altre?
Non complichiamo troppo le cose, era solo per dire che ti serve un handle as un
oggetto e facendo Me.hdc tu prendi l'handle e la palette del Form.
--
ciao
  Stefano

 Ciao
Bye
Raf

 Googlando, qualcosa si trova.
Si ma io che non sono esperto non ci capisco nulla! 

SetPaletteEntries, SelectPalette...
Auguri, Thommino   :-)
--
ciao
  Stefano

 Si ma io che non sono esperto non ci capisco nulla!
Secondo me, che sono un esperto quanto te di immagini, una soluzione 
"barbara" è questa: ti scorri tutta l'immagine pixel per pixel (o volendo 
una minore precisione ma un'elaborazione più rapida leggi un pixel sì e uno 
no, o 2 sì e 2 no, ecc...) , e metti ogni colore in una Collection con 
chiave qualcosa tipo "C" & ColoreDelPixel (una chiave deve iniziare per una 
lettera) e come valore il numero contenuto nell'item stesso + 1, in modo che 
alla fine avrai tutti i colori contenuti nell'immagine con la relativa 
quantità di volte che quel colore appare.
Alla fine te lo scorri e pigli i 256 colori più usati (ti fai un array di 
long da 256 elementi e ci butti dentro man mano i colori più usati 
sovrascrivendo quelli meno usati).
questo array sarà la tua palette "personalizzata" per quell'immagine, ora 
ordini l'array e puoi iniziare la conversione così:
- scorri nuovamente tutta l'immagine
- per ogni pixel cerchi il valore che più si avvicina al colore del pixel 
(questo adesso che l'array è ordinato è facile: prendi il colore del pixel e 
scorri l'array finchè la differenza tra il l'item corrente e il colore sia 
inferiore alla differenza tra l'item successivo e il colore, stando attenti 
ai limiti superiori e inferiori dell'array).
- Sostituisci il pixel con il colore trovato.
Facile, no? ;)
Ciao 

 crColor
c.v.d... con lo schermo a 16/24/32bit che lavora senza palette restituisce 
il colore d'entrata :)
Ciao 


Sì, ma le consulenze degli "esperti" si pagano :-)))) eh eh eh...


Allora, scrivo un po' di considerazioni per darti un aiuto.
Innanzitutto non esistono 256 colori "standard" (come invece i 16 base), ma
esistono varie palettes "standard", ad esempio quella dei "mezzitoni" di
Windows, quella "web" di Internet Explorer...
Però se il tuo obiettivo è una semplice classificazione, e non quello di
effettuare un rendering realistico di un'immagine di cui si deve ridurre la
profondità di colore, una palette vale l'altra.
Visto che esiste una comoda API per creare la palette "mezzitoni"
(CreateHalftonePalette), usiamo quella.
Per implementare la funzione che approssima il colore, allora per prima cosa
creiamo la palette halftone, dopodiché l'API GetNearestPaletteIndex serve per
ottenere l'indice del colore della palette che più si avvicina a quello dato.
In ultimo con l'API GetPaletteEntry si estraggono le componenti RGB del colore
della palette dato l'indice.
Copia e incolla in un modulo BAS:
Private Type PALETTEENTRY
    peRed As Byte
    peGreen As Byte
    peBlue As Byte
    peFlags As Byte
End Type
Private Declare Function CreateHalftonePalette Lib "gdi32.dll" _
    (ByVal hDC As Long) As Long
Private Declare Function GetNearestPaletteIndex Lib "gdi32.dll" _
    (ByVal hPalette As Long, ByVal crColor As Long) As Long
Private Declare Function GetPaletteEntries Lib "gdi32.dll" (ByVal hPalette As
Long, ByVal wStartIndex As Long, _
    ByVal wNumEntries As Long, ByRef lpPaletteEntries As PALETTEENTRY) As Long
Private Declare Function DeleteObject Lib "gdi32.dll" _
    (ByVal hObject As Long) As Long
Public Function Get256Color(ByVal Color As Long) As Long
Dim hPal As Long
Dim Index As Long
Dim PalEntry As PALETTEENTRY
    hPal = CreateHalftonePalette(0)
    Index = GetNearestPaletteIndex(hPal, Color)
    GetPaletteEntries hPal, Index, 1, PalEntry
    With PalEntry
        Get256Color = RGB(.peRed, .peGreen, .peBlue)
    End With
    DeleteObject hPal
End Function
Per utilizzarla devi passarle sotto forma di Long il colore da "approssimare".
Es. Get256Color(&H909194) --> 9868950 (decimale) = 969696 (hex) = R150 G150 B150
HTH
Raf

 Copia e incolla in un modulo BAS:
Io farei una classe, ma meglio non addentrarci in questo fantasti mondo, 
altrimenti Thommino non ne esce più :P
Ciao 

 altrimenti Thommino non ne esce piů :P
Grazie