Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么SetPixel不能正确使用ColorDialog?_C#_Drawing - Fatal编程技术网

C# 为什么SetPixel不能正确使用ColorDialog?

C# 为什么SetPixel不能正确使用ColorDialog?,c#,drawing,C#,Drawing,我正在尝试使用Bitmap.SetPixel方法更改图像颜色。当我像这样使用它时,我有一个问题: Bitmap bmp = new Bitmap(Project1.Properties.Resources.gray_square_button); int Width = bmp.Width; int Height = bmp.Height; Bitmap Nbmp = new Bitmap(bmp); ColorDialog ColorDialog = new ColorDialog(); Co

我正在尝试使用Bitmap.SetPixel方法更改图像颜色。当我像这样使用它时,我有一个问题:

Bitmap bmp = new Bitmap(Project1.Properties.Resources.gray_square_button);
int Width = bmp.Width;
int Height = bmp.Height;
Bitmap Nbmp = new Bitmap(bmp);
ColorDialog ColorDialog = new ColorDialog();
ColorDialog.AllowFullOpen = true;
DialogResult result = ColorDialog.ShowDialog();

if (result == DialogResult.OK)
{
    for (int y = 0; y < Height; y++)
    {
        for (int x = 0; x < Width; x++)
        {
            System.Drawing.Color BackColor = ColorDialog.Color;
            System.Drawing.Color p = bmp.GetPixel(x, y);
            int a = BackColor.A;
            int r = BackColor.R;
            int g = BackColor.G;
            int b = BackColor.B;

            Nbmp.SetPixel(x, y, System.Drawing.Color.FromArgb(a, r, g, b));
        }
    }
    PictureBox1.Image = Nbmp;
}
正确应用颜色并正确显示图像:

我尝试的是只更改RGB颜色的1个值。但是,如果您选择一种颜色,则该颜色将不是您选择的颜色,而是基于“颜色”对话框的颜色修改的颜色的不同颜色

int a = p.A;
int r = BackColor.R;
int g = p.G;
int b = p.B;
为什么ColorDialog RGB值不允许正确显示图像,而只允许显示彩色正方形

这是原始图像:


您正在使用从
颜色对话框
中选择的平坦颜色替换“着色”图像的颜色。因此,基本上,您将使用对话框中的单个ARGB替换每个像素,而不考虑ARGB,因此完全覆盖任何现有图像信息。您也可以根据旧图像的尺寸从头开始绘制图像,而不考虑原始图像,因为它正在被完全重写

听起来你可能打算把这两种颜色混合在一起(原始图像+新颜色)。实际上有数百种方法可以做到这一点。我想到的一个方法是创建一个透明度为50%的覆盖,并将其应用于原始图像。您还可以将ARGB设置为平均值:

int a = (BackColor.A + p.A) / 2;
int r = (BackColor.R + p.R) / 2;
int g = (BackColor.G + p.G) / 2;
int b = (BackColor.B + p.B) / 2;

<>这将给你一种感觉,在改变颜色的同时,可以考虑原色的变化。如果你不介意的话,请看一下我的问题:注意:如果你将a设置为
p.a
,结果会更好,因为原始图像的透明度。@MikaelTörnqvist我刚才确实看了一下。不幸的是,WPF真的不是我喜欢的。您可能想连接某种单击事件并阅读单击点的ARGB,但我不确定如何执行。好的,非常感谢您的关注:)
int a = (BackColor.A + p.A) / 2;
int r = (BackColor.R + p.R) / 2;
int g = (BackColor.G + p.G) / 2;
int b = (BackColor.B + p.B) / 2;