In generale, una semplice soluzione per realizzare un ColorPicker si basa sull'utilizzo di un' immagine che rappresenta lo spettro dei colori, come la seguente:
Dopodiché, per rilevare il colore selezionato al passaggio del Mouse abbiamo ovviamente bisogno di conoscere le coordinate del cursore su tale immagine.
In WPF questa operazione è veramente molto semplice sfruttando la classe CroppedBitmap.
Se definissimo una BitmapSource come Source della nostra Image WPF, ecco come potremmo implementare un semplice metodo per individuare il colore RGB corrispondente alle coordinate del cursore (MouseX,MouseY) su tale immagine-spettro:
using System.Windows.Media.Imaging;
...
public System.Windows.Media.Color GetSelectedColor(BitmapSource bitmapSource, int MouseX, int MouseY)
{
CroppedBitmap cb = new CroppedBitmap(bitmapSource, new Int32Rect(MouseX, MouseY, 1, 1)); // CroppedBitmap di 1px X 1px
rgbChannels = new byte[4];
cb.CopyPixels(rgbChannels, 4, 0); // 4 è la dimensione minima specificabile per individuare il colore RGB
return System.Windows.Media.Color.FromRgb(rgbChannels[2], rgbChannels[1], rgbChannels[0]); // R,G,B
}
Un esempio di Colorpicker WPF stupidissimo sviluppato con questa tecnica potebbe essere il seguente:
P.S.: Se la nostra Bitmap provenisse dal mondo GDI+ ( System.Drawing.Bitmap ), avremmo bisogno di una conversione in BitmapSource (WPF). A riguardo, riporto un metodo che effettua tale conversione tramite il BREVISSIMO metodo CreateBitmapSourceFromHBitmap di System.Windows.Interop.Imaging:
private BitmapSource GetBitmapSource(System.Drawing.Bitmap source)
{
return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(source.GetHbitmap(),IntPtr.Zero,Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
}