想用bitmap类的clone函数作分割图像,但是显示上面的错误,在msdn中明明有这样的重载,网上的例子也是这么写的,为什么不行呢

解决方案 »

  1.   

    RectangleF part = new RectangleF(0,0,400,400);//像素矩阵
    Bitmap s = MyImage.Clone(part, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
    这样写对吗
      

  2.   


    如果你的MyImage是通过这样定义的,即Bitmap对象,就没有错:
     Bitmap MyImage = new Bitmap("C:/test.BMP");
      

  3.   

    rect = new Rectangle();
            rect = Screen.GetWorkingArea(this);
            //创建一个以当前屏幕为模板的图象
             g1 = this.CreateGraphics();
            //创建以屏幕大小为标准的位图 
           Bitmap MyImage = new Bitmap(rect.Width, rect.Height, g1);
             g2 = Graphics.FromImage(MyImage);
            //得到屏幕的DC
            dc1 = g1.GetHdc();
            //得到Bitmap的DC 
            dc2 = g2.GetHdc();
            //调用此API函数,实现屏幕捕获
            BitBlt(dc2, 0, 0, rect.Width, rect.Height, dc1, 0, 0, 13369376);
            //释放掉屏幕的DC
            g1.ReleaseHdc(dc1);
            //释放掉Bitmap的DC 
            g2.ReleaseHdc(dc2);
            //以JPG文件格式来保存
      

  4.   

    楼主,下面的代码没问题,可以参照这个例子修改private void button1_Click(object sender, EventArgs e)
    {
        GetScreenIng_Class sc = new GetScreenIng_Class();
        System.Drawing.Bitmap img = sc.GetScreenImg();
        img.Save("c:\\screen.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);//保存图片为jpeg格式
    }class GetScreenIng_Class
    {
        [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
        private static extern bool BitBlt(
            IntPtr hdcDest, //目标设备的句柄 
            int nXDest, // 目标对象的左上角的X坐标 
            int nYDest, // 目标对象的左上角的Y坐标 
            int nWidth, // 目标对象的矩形的宽度 
            int nHeight, // 目标对象的矩形的高度 
            IntPtr hdcSrc, // 源设备的句柄 
            int nXSrc, // 源对象的左上角的X坐标 
            int nYSrc, // 源对象的左上角的Y坐标 
            System.Int32 dwRop // 光栅的操作值 
            );
        [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
        private static extern IntPtr CreateDC(
            string lpszDriver, // 驱动名称 
            string lpszDevice, // 设备名称 
            string lpszOutput, // 无用,可以设定为"NULL" 
            IntPtr lpInitData // 任意的打印机数据 
            );
        public Bitmap GetScreenImg()
        {
            Bitmap MyImage = null;
            IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null);
            //创建显示器的DC 
            Graphics g1 = Graphics.FromHdc(dc1);
            //由一个指定设备的句柄创建一个新的Graphics对象 
            MyImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, g1);
            //根据屏幕大小创建一个与之相同大小的Bitmap对象 
            Graphics g2 = Graphics.FromImage(MyImage);
            //获得屏幕的句柄 
            IntPtr dc3 = g1.GetHdc();
            //获得位图的句柄 
            IntPtr dc2 = g2.GetHdc();
            //把当前屏幕捕获到位图对象中 
            BitBlt(dc2, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, dc3, 0, 0, 13369376);
            //把当前屏幕拷贝到位图中 
            g1.ReleaseHdc(dc3);
            //释放屏幕句柄 
            g2.ReleaseHdc(dc2);
            //释放位图句柄 
            return MyImage;
        }
    }
      

  5.   

    rect = new Rectangle(); 
            rect = Screen.GetWorkingArea(this); 
            //创建一个以当前屏幕为模板的图象 
            g1 = this.CreateGraphics(); 
            //创建以屏幕大小为标准的位图 
          Bitmap MyImage = new Bitmap(rect.Width, rect.Height, g1); 
            g2 = Graphics.FromImage(MyImage); 
            //得到屏幕的DC 
            dc1 = g1.GetHdc(); 
            //得到Bitmap的DC 
            dc2 = g2.GetHdc(); 
            //调用此API函数,实现屏幕捕获 
            BitBlt(dc2, 0, 0, rect.Width, rect.Height, dc1, 0, 0, 13369376); 
            //释放掉屏幕的DC 
            g1.ReleaseHdc(dc1); 
            //释放掉Bitmap的DC 
            g2.ReleaseHdc(dc2); 
            //以JPG文件格式来保存
             RectangleF part = new RectangleF(0,0,400,400);//像素矩阵 
             Bitmap s = MyImage.Clone(part,System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
    我主要是想分割图像,后面两句的错误 
      

  6.   

    试试,保存部分图,没问题private void button1_Click(object sender, EventArgs e)
    {
        GetScreenIng_Class sc = new GetScreenIng_Class();
        System.Drawing.Bitmap img = sc.GetScreenImg();
        img.Save("c:\\screen.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);//保存图片为jpeg格式
        RectangleF part = new RectangleF(0,0,400,400);//像素矩阵 
        
        Bitmap s = img.Clone(part,PixelFormat.Format32bppPArgb);
        s.Save("c:\\part.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);  //保存部分图片为jpeg格式}class GetScreenIng_Class
    {
        [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
        private static extern bool BitBlt(
            IntPtr hdcDest, //目标设备的句柄 
            int nXDest, // 目标对象的左上角的X坐标 
            int nYDest, // 目标对象的左上角的Y坐标 
            int nWidth, // 目标对象的矩形的宽度 
            int nHeight, // 目标对象的矩形的高度 
            IntPtr hdcSrc, // 源设备的句柄 
            int nXSrc, // 源对象的左上角的X坐标 
            int nYSrc, // 源对象的左上角的Y坐标 
            System.Int32 dwRop // 光栅的操作值 
            );
        [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
        private static extern IntPtr CreateDC(
            string lpszDriver, // 驱动名称 
            string lpszDevice, // 设备名称 
            string lpszOutput, // 无用,可以设定为"NULL" 
            IntPtr lpInitData // 任意的打印机数据 
            );
        public Bitmap GetScreenImg()
        {
            Bitmap MyImage = null;
            IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null);
            //创建显示器的DC 
            Graphics g1 = Graphics.FromHdc(dc1);
            //由一个指定设备的句柄创建一个新的Graphics对象 
            MyImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, g1);
            //根据屏幕大小创建一个与之相同大小的Bitmap对象 
            Graphics g2 = Graphics.FromImage(MyImage);
            //获得屏幕的句柄 
            IntPtr dc3 = g1.GetHdc();
            //获得位图的句柄 
            IntPtr dc2 = g2.GetHdc();
            //把当前屏幕捕获到位图对象中 
            BitBlt(dc2, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, dc3, 0, 0, 13369376);
            //把当前屏幕拷贝到位图中 
            g1.ReleaseHdc(dc3);
            //释放屏幕句柄 
            g2.ReleaseHdc(dc2);
            //释放位图句柄 
            return MyImage;
        }
    }