C#图像绘制颜色不正确

Jon*_*ury 4 c# drawing gdi+ winforms

我有一个1x1的源位图,我试图拍摄该图像并将其绘制到一个新的位图.源位图全部为红色,但由于某种原因,新位图以渐变结束(参见图像).使用下面的代码,新的位图不应该是完全红色的吗?从哪里获得白色/ alpha?

alt text http://www.binaryfortress.com/Temp/Error.jpg

private void DrawImage()
{
    Bitmap bmpSOURCE = new Bitmap(1, 1, PixelFormat.Format32bppArgb);
    using (Graphics g = Graphics.FromImage(bmpSOURCE))
    {
        g.Clear(Color.Red);
    }

    Bitmap bmpTest = new Bitmap(300, 100, PixelFormat.Format32bppArgb);
    using (Graphics g = Graphics.FromImage(bmpTest))
    {
        g.CompositingMode = CompositingMode.SourceCopy;
        g.CompositingQuality = CompositingQuality.AssumeLinear;
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        g.PageUnit = GraphicsUnit.Pixel;
        g.PixelOffsetMode = PixelOffsetMode.None;
        g.SmoothingMode = SmoothingMode.None;

        Rectangle rectDest = new Rectangle(0, 0, bmpTest.Width, bmpTest.Height);
        Rectangle rectSource = new Rectangle(0, 0, 1, 1);
        g.DrawImage(bmpSOURCE, rectDest, rectSource, GraphicsUnit.Pixel);
    }

    pictureBox1.Image = bmpTest;
}
Run Code Online (Sandbox Code Playgroud)

Ada*_*son 7

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

Bitmap source = // get the source

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

Bitmap target = // get the target    

target.Clear(color);
Run Code Online (Sandbox Code Playgroud)

尽管如此,问题很可能是InterpolationMode,因为这是缩放图像时使用的.尝试使用Lowistead HighQualityBicubic.

g.InterpolationMode = InterpolationMode.Low;
Run Code Online (Sandbox Code Playgroud)

  • @Jon:`InterpolationMode`确定缩放图像时的行为,这就是你在这里所做的.GDI(默认情况下)不会简单地通过在固定间隔上复制或移除像素来缩放图像,因为这通常会产生低质量的结果.相反,它使用各种算法对新像素进行插值,具体的算法由"InterpolationMode"的值确定.有关更多信息,请参阅http://msdn.microsoft.com/en-us/library/system.drawing.drawing2d.interpolationmode.aspx. (3认同)