(C#)使用BitBlt函数绘出来的图都是黑色
namespaceTestGDI{publicpartialclassForm1:Form{[DllImport("gdi32.dll")]privatestaticex...
namespace TestGDI
{
public partial class Form1 : Form
{
[DllImport("gdi32.dll")]
private static extern bool BitBlt(
IntPtr hdcDest, //目标设备的句柄
int nXDest, // 目标对象的左上角的X坐标
int nYDest, // 目标对象的左上角的X坐标
int nWidth, // 目标对象的矩形的宽度
int nHeight, // 目标对象的矩形的长度
IntPtr hdcSrc, // 源设备的句柄
int nXSrc, // 源对象的左上角的X坐标
int nYSrc, // 源对象的左上角的X坐标
int dwRop // 光栅的操作值
);
public const int ROP_SrcCopy = 0xCC0020;
public Form1()
{
InitializeComponent();
}
private void btnShow_Click(object sender, EventArgs e)
{
Image img = Image.FromFile(@"image\1.bmp");
Graphics mg = Graphics.FromImage(img);
Graphics g = this.picMain.CreateGraphics();
//pictureBox picMain
int x = this.picMain.Width; //pictureBox的Width
int y = this.picMain.Height; //pictureBox的Height
IntPtr dc1 = g.GetHdc();
IntPtr dc2 = mg.GetHdc();
BitBlt(dc1, 100, 100, x, y, dc2, 0, 0, ROP_SrcCopy);
}
}
}
在picMain里面的图的大小和1.bmp相同,但就是一团黑色的.
怎么可能画到外面去了,都说了PicMain有绘出和1.bmp一样大的黑方块,而且PicMain的才不至100X100大小.就算改成
BitBlt(dc1, 0, 0, x, y, dc2, 0, 0, ROP_SrcCopy);
还是一样. 展开
{
public partial class Form1 : Form
{
[DllImport("gdi32.dll")]
private static extern bool BitBlt(
IntPtr hdcDest, //目标设备的句柄
int nXDest, // 目标对象的左上角的X坐标
int nYDest, // 目标对象的左上角的X坐标
int nWidth, // 目标对象的矩形的宽度
int nHeight, // 目标对象的矩形的长度
IntPtr hdcSrc, // 源设备的句柄
int nXSrc, // 源对象的左上角的X坐标
int nYSrc, // 源对象的左上角的X坐标
int dwRop // 光栅的操作值
);
public const int ROP_SrcCopy = 0xCC0020;
public Form1()
{
InitializeComponent();
}
private void btnShow_Click(object sender, EventArgs e)
{
Image img = Image.FromFile(@"image\1.bmp");
Graphics mg = Graphics.FromImage(img);
Graphics g = this.picMain.CreateGraphics();
//pictureBox picMain
int x = this.picMain.Width; //pictureBox的Width
int y = this.picMain.Height; //pictureBox的Height
IntPtr dc1 = g.GetHdc();
IntPtr dc2 = mg.GetHdc();
BitBlt(dc1, 100, 100, x, y, dc2, 0, 0, ROP_SrcCopy);
}
}
}
在picMain里面的图的大小和1.bmp相同,但就是一团黑色的.
怎么可能画到外面去了,都说了PicMain有绘出和1.bmp一样大的黑方块,而且PicMain的才不至100X100大小.就算改成
BitBlt(dc1, 0, 0, x, y, dc2, 0, 0, ROP_SrcCopy);
还是一样. 展开
4个回答
展开全部
必须是Graphics绘制到能看到的地方才能用BitBlt
也就是说先用Graphics的RrawImage把图绘到一个picbox,然后才能用BitBlt把图从一个picbox复制到另一个picbox
下面这个例子是VB.net的,不过可以C#化。如果需要就留言吧。
也就是说先用Graphics的RrawImage把图绘到一个picbox,然后才能用BitBlt把图从一个picbox复制到另一个picbox
下面这个例子是VB.net的,不过可以C#化。如果需要就留言吧。
参考资料: http://www.codeproject.com/KB/GDI-plus/BitBlt.aspx
展开全部
是不是100超过picturebox宽度了,图画到外面去了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Image img = Image.FromFile(@"image\1.bmp");
Graphics mg = Graphics.FromImage(img);
Graphics g = this.picMain.CreateGraphics();
//pictureBox picMain
int x = this.picMain.Width; //pictureBox的Width
int y = this.picMain.Height; //pictureBox的Height
IntPtr dc1 = g.GetHdc();
IntPtr dc2 = mg.GetHdc();
var hbitmap = img.GetHbitmap();
var holdObject = SelectObject(dc2, hbitmap);
BitBlt(dc1, 100, 100, x, y, dc2, 0, 0, ROP_SrcCopy);
其中SelectObject如下
[DllImport("gdi32.dll")]
public static extern IntPtr SelectObject(IntPtr hDc, IntPtr hObject);
原因可能是使用Graphics.FromImage的时候,.Net底层并没有将Bitmap对应的HBitmap选入HDC而只是将两个.Net对象联系起来了,而后在DrawImage中有两次SelectObject分别选入和选出以在HBitmap上绘图。所以独立于.Net进行GDI操作的时候,需要在GDI层面再将两者联系起来,使用SelectObject
Graphics mg = Graphics.FromImage(img);
Graphics g = this.picMain.CreateGraphics();
//pictureBox picMain
int x = this.picMain.Width; //pictureBox的Width
int y = this.picMain.Height; //pictureBox的Height
IntPtr dc1 = g.GetHdc();
IntPtr dc2 = mg.GetHdc();
var hbitmap = img.GetHbitmap();
var holdObject = SelectObject(dc2, hbitmap);
BitBlt(dc1, 100, 100, x, y, dc2, 0, 0, ROP_SrcCopy);
其中SelectObject如下
[DllImport("gdi32.dll")]
public static extern IntPtr SelectObject(IntPtr hDc, IntPtr hObject);
原因可能是使用Graphics.FromImage的时候,.Net底层并没有将Bitmap对应的HBitmap选入HDC而只是将两个.Net对象联系起来了,而后在DrawImage中有两次SelectObject分别选入和选出以在HBitmap上绘图。所以独立于.Net进行GDI操作的时候,需要在GDI层面再将两者联系起来,使用SelectObject
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我也遇到这个问题..
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询