powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Извесно Color.FromArgb. Требуется найти координаты этого цвета на цветовой палитре.
7 сообщений из 7, страница 1 из 1
Извесно Color.FromArgb. Требуется найти координаты этого цвета на цветовой палитре.
    #32684864
chess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Помогите разобраться в следующем.
Есть некоторая цветовая палитра (отрисовывается в 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
Извесно Color.FromArgb. Требуется найти координаты этого цвета на цветовой палитре.
    #32685015
LexaLong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Палитра созданая линейным градиентом даже из множества цветов никогда не будет полным набором цветов в пространстве ARGB - поэтому не все значения апдаунов дадут точку в палитре

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

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

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

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


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