Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Извесно Color.FromArgb. Требуется найти координаты этого цвета на цветовой палитре. / 7 сообщений из 7, страница 1 из 1
08.09.2004, 11:31
    #32684864
chess
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извесно Color.FromArgb. Требуется найти координаты этого цвета на цветовой палитре.
Добрый день!
Помогите разобраться в следующем.
Есть некоторая цветовая палитра (отрисовывается в panel1_Paint).
С помощью API функции (GetPixel) по координатам мыщи определяю цвет, на который указывает мыш и выважу эти значения в numericUpDown1-3.(rgb)
Подскажите, как произвести обратное, т.е. при задании цвета в numericUpDown1-3 получить координаты этого цвета на данной панели??
Для полной ясности привожу код.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Drawing.Drawing2D ;
using System.Runtime.InteropServices;
namespace WindowsApplication2
{
  /// <summary> 
  /// Summary description for Form1. 
  /// </summary> 
 public class Form1 : System.Windows.Forms.Form
 {
  private System.Windows.Forms.Panel panel1;
  private System.Windows.Forms.Label label1;
  private System.Windows.Forms.Label label2;
  private System.Windows.Forms.Label label3;
  private System.Windows.Forms.NumericUpDown numericUpDown1;
  private System.Windows.Forms.NumericUpDown numericUpDown2;
  private System.Windows.Forms.NumericUpDown numericUpDown3;
   /// <summary> 
   /// Required designer variable. 
   /// </summary> 
  private System.ComponentModel.Container components = null;
  public Form1()
  {
    // 
    // Required for Windows Form Designer support 
    // 
   InitializeComponent();

    // 
    // TODO: Add any constructor code after InitializeComponent call 
    // 
  }
   /// <summary> 
   /// Clean up any resources being used. 
   /// </summary> 
  protected override void Dispose( bool disposing )
  {
   if( disposing )
   {
    if (components != null) 
    {
     components.Dispose();
    }
   }
   base.Dispose( disposing );
  }
  #region Windows Form Designer generated code
   /// <summary> 
   /// Required method for Designer support - do not modify 
   /// the contents of this method with the code editor. 
   /// </summary> 
  private void InitializeComponent()
  {
   this.panel1 = new System.Windows.Forms.Panel();
   this.label1 = new System.Windows.Forms.Label();
   this.label2 = new System.Windows.Forms.Label();
   this.label3 = new System.Windows.Forms.Label();
   this.numericUpDown1 = new System.Windows.Forms.NumericUpDown();
   this.numericUpDown2 = new System.Windows.Forms.NumericUpDown();
   this.numericUpDown3 = new System.Windows.Forms.NumericUpDown();
   ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit();
   ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).BeginInit();
   ((System.ComponentModel.ISupportInitialize)(this.numericUpDown3)).BeginInit();
   this.SuspendLayout();
    //  
    // panel1 
    //  
   this.panel1.Location = new System.Drawing.Point(16, 16);
   this.panel1.Name = "panel1";
   this.panel1.Size = new System.Drawing.Size(216, 120);
   this.panel1.TabIndex = 0;
   this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint);
   this.panel1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseMove);
    //  
    // label1 
    //  
   this.label1.Location = new System.Drawing.Point(32, 160);
   this.label1.Name = "label1";
   this.label1.Size = new System.Drawing.Size(56, 23);
   this.label1.TabIndex = 1;
   this.label1.Text = "Красный";
    //  
    // label2 
    //  
   this.label2.Location = new System.Drawing.Point(32, 192);
   this.label2.Name = "label2";
   this.label2.Size = new System.Drawing.Size(56, 23);
   this.label2.TabIndex = 1;
   this.label2.Text = "Зеленый";
    //  
    // label3 
    //  
   this.label3.Location = new System.Drawing.Point(32, 224);
   this.label3.Name = "label3";
   this.label3.Size = new System.Drawing.Size(56, 23);
   this.label3.TabIndex = 1;
   this.label3.Text = "Синий";
    //  
    // numericUpDown1 
    //  
   this.numericUpDown1.Location = new System.Drawing.Point(112, 160);
   this.numericUpDown1.Maximum = new System.Decimal(new int[] {
                     255,
                     0,
                     0,
                     0});
   this.numericUpDown1.Name = "numericUpDown1";
   this.numericUpDown1.Size = new System.Drawing.Size(48, 20);
   this.numericUpDown1.TabIndex = 2;
    //  
    // numericUpDown2 
    //  
   this.numericUpDown2.Location = new System.Drawing.Point(112, 192);
   this.numericUpDown2.Maximum = new System.Decimal(new int[] {
                     255,
                     0,
                     0,
                     0});
   this.numericUpDown2.Name = "numericUpDown2";
   this.numericUpDown2.Size = new System.Drawing.Size(48, 20);
   this.numericUpDown2.TabIndex = 2;
    //  
    // numericUpDown3 
    //  
   this.numericUpDown3.Location = new System.Drawing.Point(112, 224);
   this.numericUpDown3.Maximum = new System.Decimal(new int[] {
                     255,
                     0,
                     0,
                     0});
   this.numericUpDown3.Name = "numericUpDown3";
   this.numericUpDown3.Size = new System.Drawing.Size(48, 20);
   this.numericUpDown3.TabIndex = 2;
    //  
    // Form1 
    //  
   this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
   this.ClientSize = new System.Drawing.Size(292, 273);
   this.Controls.Add(this.numericUpDown1);
   this.Controls.Add(this.label1);
   this.Controls.Add(this.panel1);
   this.Controls.Add(this.label2);
   this.Controls.Add(this.label3);
   this.Controls.Add(this.numericUpDown2);
   this.Controls.Add(this.numericUpDown3);
   this.Name = "Form1";
   this.Text = "Form1";
   ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit();
   ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).EndInit();
   ((System.ComponentModel.ISupportInitialize)(this.numericUpDown3)).EndInit();
   this.ResumeLayout(false);
  }
  #endregion
   
   /// <summary> 
   /// The main entry point for the application. 
   /// </summary> 
  [STAThread]
  static void Main() 
  {
   Application.Run(new Form1());
  }
  private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
  {
   LinearGradientBrush br = new LinearGradientBrush(this.panel1.ClientRectangle,Color.Black,Color.Black,0,false); 
   ColorBlend cb = new ColorBlend(); 
   cb.Positions=new float[8]; 
   int i=0; 
   for(float f=0;f<=1;f+=1.0f/7) 
    cb.Positions[i++]=f; 
   cb.Colors=new Color[]{Color.Red,Color.Orange,Color.Yellow,Color.Green,Color.Blue,Color.Indigo,Color.Violet, Color.Black }; 
   br.InterpolationColors=cb; 
   e.Graphics.FillRectangle(br,0,0,this.panel1.Width ,this.panel1 .Height ); 
   
  }
  void SelectColor(Color _color)
  {
   this.numericUpDown1.Value = _color.R;
   this.numericUpDown2.Value =_color.G;
   this.numericUpDown3.Value = _color.B;
  }
  private void panel1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
  {
   Graphics graphics = this.panel1.CreateGraphics();
   IntPtr hDC = graphics.GetHdc();
   Color color = GetPixelColor(hDC, e.X, e.Y);
   
    SelectColor(color);
   
   graphics.ReleaseHdc(hDC);
    
   base.OnMouseMove(e);
  }
  [DllImport("Gdi32.dll")]
  static extern int GetPixel(
   IntPtr hdc,    
   int nXPos, 
   int nYPos  
   );
  public static Color GetPixelColor(IntPtr hDC, int x, int y)
  {
   long colorRef = GetPixel(hDC, x, y);
   return Color.FromArgb((byte)colorRef, (byte)(colorRef >> 8), (byte)(colorRef >> 16));
  }
 }
}
...
Рейтинг: 0 / 0
08.09.2004, 12:16
    #32685015
LexaLong
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извесно Color.FromArgb. Требуется найти координаты этого цвета на цветовой палитре.
Палитра созданая линейным градиентом даже из множества цветов никогда не будет полным набором цветов в пространстве ARGB - поэтому не все значения апдаунов дадут точку в палитре

т.е. в каких-то случаях будет происходить ошибка или в крайнем случае возвращаться null.

Ну а искать можно двумя способами

1. перебор по X-координате GetPixel с поиском совпадений
2. построение HashTable при создании формы - где ключом будут цвета из палитры а значениями поинты(или X-координаты)
...
Рейтинг: 0 / 0
08.09.2004, 12:25
    #32685042
chess
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извесно Color.FromArgb. Требуется найти координаты этого цвета на цветовой палитре.
Тогда напрашивается вопрос, по какому принципу сделана цветовая палитра в ColorDialog-е
...
Рейтинг: 0 / 0
08.09.2004, 12:30
    #32685061
profil
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извесно Color.FromArgb. Требуется найти координаты этого цвета на цветовой палитре.
на сколько я понимаю, ARGB - это та же палитра RGB (как в ColorDialog) + alfa-канал (A = [0..100])
...
Рейтинг: 0 / 0
08.09.2004, 12:44
    #32685113
chess
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извесно Color.FromArgb. Требуется найти координаты этого цвета на цветовой палитре.
авторна сколько я понимаю, ARGB - это та же палитра RGB (как в ColorDialog) + alfa-канал (A = [0..100])

alpha
The alpha value for the new Color structure. Valid values are 0 through 255.
...
Рейтинг: 0 / 0
08.09.2004, 12:53
    #32685151
LexaLong
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извесно Color.FromArgb. Требуется найти координаты этого цвета на цветовой палитре.
В колордиалоге используются не RGB, а HSL(HSB) координаты:
цветной квадрат - координаты H(тон) по горизонтали и S(насыщенность) по вертиткали
Вертикальная полоска - L(Яркость)
и рисуются они не градиентом, а попиксельно
В одном из номеров MSDN Magazine за 2003 год была статья по поводу колорпикера
вот ссылка на аглицкую версию
...
Рейтинг: 0 / 0
08.09.2004, 13:12
    #32685190
profil
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извесно Color.FromArgb. Требуется найти координаты этого цвета на цветовой палитре.
chessalpha
The alpha value for the new Color structure. Valid values are 0 through 255.пардон, не спроецировал мыслю на c# ))
alpha характеризует прозрачность, т.е. при А=0 - цвет прозрачный, при А=255 - цвет насыщенный (соответствует цвету RGB)
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Извесно Color.FromArgb. Требуется найти координаты этого цвета на цветовой палитре. / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]