我正在尝试找到一种替代解决方案来获取/设置图形对象中某个位置的像素。现在我正在使用 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 返回黑色,因为这适用于另一个位图而不是实际位图): http://support.microsoft.com/kb/311221
一些示例代码:
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 对象表示用户可以在其中自由添加任何对象(包括手绘图)的表面。最重要的是,我需要在某些屏幕部分应用滤镜(如模糊或像素化),所以我需要访问图形中已经绘制的内容。我还尝试找到一种方法将当前图形保存到位图并使用位图对象中的 GetPixel,但我也找不到保存图形内容的方法。
感谢
不,无法直接从图形对象读取像素。您需要访问底层 HDC 或位图对象才能执行此操作。
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)