【问题标题】:How to create Bitmap object from a Graphics object?如何从 Graphics 对象创建 Bitmap 对象?
【发布时间】:2011-03-02 14:28:28
【问题描述】:

如何从图形对象创建位图对象?我想从我的 Graphics 对象中读取像素。例如,System.Drawing.BitMap.GetPixel()。

我正在尝试找出 pdf 文档中的空白区域(全白或任何颜色),以编写一些图形/图像。我试过这样,但它不起作用。为什么下面的代码没有按预期工作?

//
// System.Drawing.Bitmap
// System.Drawing.Graphics
//
Bitmap b = new Bitmap(width, height, graphics);

//
// In this case, for any (i, j) values, Bitmap.GetPixel returns 0
//
int rgb = b.GetPixel(i, j).ToArgb();

(在 .net-only 上下文中再次发布此问题,删除其他库依赖项)

【问题讨论】:

    标签: .net graphics bitmap getpixel


    【解决方案1】:

    理想情况下,您希望避免 GetPixel/SetPixel 并使用不安全的位图访问方法来提高速度。

    System.Drawing.Graphics 图形 = System.Drawing.Graphics.FromImage(bitmap);

    然后使用图形实例。如果我记得,修改图形对象会修改位图。

    【讨论】:

    • 感谢您的回复,MaLio。请在上面找到我的评论(对 Belousov Pavel 的回应)。
    【解决方案2】:

    首先您应该创建位图,然后从该位图创建图形,使用图形,然后保存(或使用它)位图。

    你的代码会是这样的:

    using (Bitmap image = new Bitmap(X, Y))
    {
        using (Graphics gr = Graphics.FromImage(image))
        {
            // work with graphics, Draw objects
        }
        image.Save("YourPathToFile"); // Or GetPixel, if you want
    }
    

    您的代码无法正常工作,因为 Bitmap 的构造函数仅获取 Graphics 以进行解析。 MSDN 告诉Initializes a new instance of the Bitmap class with the specified size and with the resolution of the specified Graphics object.

    【讨论】:

    • 感谢您的回复,别洛乌索夫。 -- 我已经有一个由 pdf 构造的图形对象(而且,我没有相应的位图对象,因为渲染不是我的 pdf 库的兴趣)。我只想从中读取像素,不想写/画它。我需要位图对象来读取像素,所以我试图从我拥有的图形对象构造位图对象。 -- 虽然写入 System.Drawing.Graphics 对象非常简单,但故意从中读取像素变得不可能。
    【解决方案3】:

    (很晚了,但是……)

    你试过了吗

    var bmp = System.Drawing.Bitmap.FromHbitmap(gr.GetHdc());
    

    然后你可以从bmp读取像素。

    【讨论】:

    • 为我抛出 System.Runtime.InteropServices.ExternalException。
    • 抛出“GDI+ 中出现一般错误”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 2016-11-10
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 2015-09-14
    • 2021-06-04
    相关资源
    最近更新 更多