C#图像绘制颜色不正确

C#图像绘制颜色不正确,c#,winforms,gdi+,drawing,C#,Winforms,Gdi+,Drawing,我有一个1x1的源位图,我正在尝试将该图像绘制成一个新的位图。源位图全部为红色,但由于某种原因,新位图以渐变结束(见图)。使用下面的代码,新位图不应该是完全红色的吗?它从哪里得到白色/阿尔法 这不是用颜色填充区域的好方法。更好的方法是确定源图像中像素的颜色,并使用该颜色填充目标 Bitmap source = // get the source Color color = source.GetPixel(1, 1); Bitmap target = // get the target

我有一个1x1的源位图,我正在尝试将该图像绘制成一个新的位图。源位图全部为红色,但由于某种原因,新位图以渐变结束(见图)。使用下面的代码,新位图不应该是完全红色的吗?它从哪里得到白色/阿尔法


这不是用颜色填充区域的好方法。更好的方法是确定源图像中像素的颜色,并使用该颜色填充目标

Bitmap source = // get the source

Color color = source.GetPixel(1, 1);

Bitmap target = // get the target    

target.Clear(color);
尽管如此,问题可能是
插值模式
,因为这是缩放图像时使用的。尝试使用
Low
istead的
HighQualityBicubic

g.InterpolationMode = InterpolationMode.Low;

我为您的问题找到了以下解决方案:

g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.CompositingQuality = CompositingQuality.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;

你试过改变插值模式吗?我并没有用它来填充一个区域的颜色,这只是一个小程序来演示这个问题。我尝试了一些不同的插值模式设置,唯一有效的是最近邻。这解决了问题,但我仍然不明白为什么目标图像不是全红色的?为什么它会随机混合红色和白色?@Jon:InterpolationMode决定缩放图像时的行为,这就是你在这里所做的。GDI(默认情况下)不会简单地通过按固定间隔复制或移除像素来缩放图像,因为这样通常会产生低质量的结果。相反,它使用各种算法对新像素进行插值,具体的算法由
InterpolationMode
的值确定。有关更多信息,请参阅。它之所以给出alpha值,是因为过滤()。为了在调整大小时提供更好的纹理,像素从一种颜色平滑地插值到下一种颜色。在启用过滤的情况下,您会看到红色像素使用纯透明像素进行插值(因为您的单个像素没有可用于插值的邻居,所以这是合理的)。最近邻插值不进行过滤,因此解决了您的问题。将插值模式更改为“最近邻”可以提供纯色,但现在它只填充了一半图像。因此,我得到了一个100像素宽的图像,左半部分为红色,右半部分为白色。还是不行(依靠插值填充区域是填充区域的错误方式。如果要清除整个位图,请使用Graphics.Clear;如果要填充区域,请使用Graphics.FillRectangle。
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.CompositingQuality = CompositingQuality.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;