从Graphics对象GDI +获取/设置像素

时间:2015-02-03 19:27:13

标签: c# .net graphics pinvoke gdi+

我正在尝试寻找一种替代解决方案来获取/设置Graphics对象中某个位置的像素。 现在我正在使用GDI功能:

    [DllImport("gdi32.dll")]
    public static extern int GetPixel(System.IntPtr hdc,  int nXPos,  int nYPos);

    [DllImport("gdi32.dll")]
    public static extern uint SetPixel(IntPtr hdc, int X, int Y, int crColor);

我找不到任何GDI +。 GetPixel / SetPixel似乎只在Bitmap对象上。 当图形由屏幕支持时,gdi32.dll的替代品运行良好但是当使用带位图的图形时,它不再起作用(GetPixel返回黑色,因为这适用于另一个位图而不是实际位图):{{3} }

一些示例代码:

private void ChangeImage(Graphics g)
{

        IntPtr gDC = IntPtr.Zero;

            try
            {
                gDC = g.GetHdc();


                // get the pixel color
                Color pixel = ColorTranslator.FromWin32(GetPixel(gDC, x, y));


                //change pixel object and persist
                SetPixel(gDC, x, y, ColorTranslator.ToWin32(pixel));

            }
            catch (Exception ex)
            {
                Trace.WriteLine(ex.Message);
            }
            finally
            {
                if (gDC != IntPtr.Zero)
                    g.ReleaseHdc(gDC);
            }

}

有没有办法按像素解析Graphics对象? Graphics对象表示用户可以自由添加任何对象(包括手绘)的表面。除此之外,我需要在某些屏幕部件上应用滤镜(如模糊或像素化),因此我需要访问已在图形中绘制的内容。 我也试图找到一种方法将当前图形保存到Bitmap并使用位图对象中的GetPixel,但我也找不到保存图形内容的方法。

THX

2 个答案:

答案 0 :(得分:2)

不,直接读取Graphics对象的像素是不可能的。您需要访问底层的HDC或Bitmap对象才能执行此操作。

答案 1 :(得分:0)

    Dim bmap As New Bitmap(550, 100)
    Dim g As Graphics = Graphics.FromImage(bmap)

    ' Dont use the Graphics interface, use the BitMap interface
    DIM col as color = bmap.GetPixel(x,y)