【问题标题】:Graphics.DrawImage() Creates a Blank ImageGraphics.DrawImage() 创建一个空白图像
【发布时间】:2018-03-08 00:54:34
【问题描述】:

我正在尝试使用 Graphics.DrawImage() 来复制位图的一部分;但是,副本是空白图像。每个像素都有一个零值。为了调试问题,我创建了一个简单的单元测试来演示该问题。

为什么新位图中的所有像素都是 0?

    [Test]
    public void CopyImage()
    {
        // Create a dummy bitmap using a counter.
        Bitmap bitmap = new Bitmap(3, 3);
        int color = 0;

        for (int y = 0; y < 3; y++)
        {
            for (int x = 0; x < 3; x++)
            {
                bitmap.SetPixel(x, y, Color.FromArgb(color));
                color++;
            }
        }

        // Copy the bitmap
        Bitmap newBitmap = new Bitmap(3, 3);
        Graphics g = Graphics.FromImage(newBitmap);
        g.DrawImage(bitmap, new Point(0, 0));
        g.Save();

        // Validate the bitmap was copied correctly.
        // All pixels have an ARGB value of 0 so the
        // asserts fail.
        color = 0;

        for (int y = 0; y < 3; y++)
        {
            for (int x = 0; x < 3; x++)
            {
                Assert.AreEqual(color, newBitmap.GetPixel(x, y).ToArgb());
                color++;
            }
        }
    }

【问题讨论】:

  • 代码只是用 Color.FromArgb() 创建了不好的颜色。 A 保持为 0,因此像素是透明的。没什么可看的。 GDI+ 利用这一点来优化 blitting。最终结果是正确的,仍然什么都看不到。
  • @HansPassant 你说得对。我更新了代码来为 A 设置一个非零值并且它起作用了。如果您将此作为答案发布,我会接受。

标签: c# .net


【解决方案1】:

如果使用一个参数,我认为传递给 Color.FromArgb(color) 的颜色值必须大于 0,1,2 才能像这个十六进制一样可见:

Color.FromArgb(0x78FF0000)

否则传递 0 到 255 之间的红色、绿色、蓝色三个值,并使用 0、100、200 之类的值来查看差异:

Color.FromArgb(255, 0, 0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2017-03-01
    • 2017-01-23
    • 2012-06-05
    • 2020-05-02
    • 2011-06-07
    • 2011-08-29
    • 1970-01-01
    相关资源
    最近更新 更多