none
怎样将picturebox上的控件画到picturebox的image上 RRS feed

  • 问题

  • picturebox上加载了emf格式的文件,然后被放大到指定尺寸(通过改变picturebox的大小),同时上面添加了一些控件(panel类型);
    现在我想将这些控件画到picturebox底图上,然后导出emf格式文件。以前问过好像是通过Graphics.DrawImage 方法,但是具体不知怎么用。
    private void exportEMF()
    {
    foreach (control c in picturebox.controls)
    {
    DrawImage???
    }
    //保存

    }
    2009年11月5日 8:15

答案

  • 你好!
         控件都有DrawToBitmap方法的,应该可以满足你的要求:
    pictureBox1.DrawToBitmap(bitmap,   rectangle);
    周雪峰
    • 已标记为答案 ahking 2009年11月12日 0:09
    2009年11月5日 11:02
    版主
  • 我看了一下你的代码,是个控件层层嵌套的结构啊,还有继承Panel的自定义控件用来放你的柱状图的吧。

    我自己画了个白底的图片,并在右边的一半画了个圆、写了些文字作为参照,然后按照你程序设计的步骤进行绘图并导出图片,发觉似乎是自定义控件中的柱状图的边框显示的有些模糊,尤其是那些文字。你可以看一下参照的效果:http://cid-75a4db78b1d41bb2.skydrive.live.com/self.aspx/TroubleShoot/untitled1.emf
    所以我建议你可以先检查一下你的自定义控件的代码,是不是有可能引发这样的问题。

    还有一种可能性,就是由于层层的控件嵌套导致的,这就涉及到z-order。如果你是按照PictureBox中嵌套了自定义控件或者其他控件的话,在处理的时候可能要反过来进行,就是从最上层的控件到最底层的控件。
    这里有个类似的问题,你看下会不会对你有所帮助。
    http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/3dab4185-0763-4a6e-b287-c925bfa1af2e
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    • 已标记为答案 ahking 2009年11月11日 8:45
    2009年11月11日 6:43

全部回复

  • 你好!
         控件都有DrawToBitmap方法的,应该可以满足你的要求:
    pictureBox1.DrawToBitmap(bitmap,   rectangle);
    周雪峰
    • 已标记为答案 ahking 2009年11月12日 0:09
    2009年11月5日 11:02
    版主
  • 你好!
         每个控件都有一个DrawToBitmap方法,用这个方法来实现:
         pictureBox1.DrawToBitmap(bitmap,rect);
    周雪峰
    2009年11月5日 11:11
    版主
  • 可是我想保存成emf格式的啊
    2009年11月5日 23:38
  • 再这样保存就可以了:
    bitmap1.Save(@"C:\a.emf");
    周雪峰
    2009年11月6日 5:34
    版主
  • 控件画到bitmap的图形明显不清楚,有什么更好的办法么?

    2009年11月6日 9:07
  • 你好!

    我试了一下周版主的建议,用了以下的代码:

                Image myImage=Image.FromFile (@"C:\a.jpg");
                pictureBox1.Image = myImage;
                Bitmap myBitmap = new Bitmap(this.pictureBox1.Image,pictureBox1.Width, pictureBox1.Height);
                Rectangle rect = new System.Drawing.Rectangle(0,0, pictureBox1.Width,pictureBox1.Height);
                pictureBox1.DrawToBitmap(myBitmap, rect);
                myBitmap.Save(@"C:\a.emf");

    我觉得效果还是挺好的,图片也显示很清楚。

    请问你要画的图形到底是什么样的?
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2009年11月6日 10:03
  • 控件画到bitmap的图形明显不清楚,有什么更好的办法么?

    你好!
         你绘制到bitmap,选择rect参数的时候选择和Picture一样大小的矩形,否则存在缩放,导致图象不清楚的问题!

    周雪峰
    2009年11月6日 10:27
    版主
  • 控件画到bitmap的图形明显不清楚,有什么更好的办法么?

    你好!
         你绘制到bitmap,选择rect参数的时候选择和Picture一样大小的矩形,否则存在缩放,导致图象不清楚的问题!

    周雪峰
    picturebox本身的图片还比较清楚,主要是它上面的控件不是很清楚啊
    Bitmap bmp = new Bitmap(this.pictureBox1.image, this.pictureBox1.Size);
                foreach (Control c in this.pictureBox1.Controls)
                {
                    Rectangle rect = new Rectangle(c.Location, c.Size);
                    c.DrawToBitmap(bmp, rect);
                }
                bmp.Save(@"c:\a.bmp");
    2009年11月8日 23:48
  • picturebox本身的图片还比较清楚,主要是它上面的控件不是很清楚啊
    Bitmap bmp = new Bitmap(this.pictureBox1.image, this.pictureBox1.Size);
                foreach (Control c in this.pictureBox1.Controls)
                {
                    Rectangle rect = new Rectangle(c.Location, c.Size);
                    c.DrawToBitmap(bmp, rect);
                }
                bmp.Save(@"c:\a.bmp");

    你所说的“上面的控件”是指什么控件呢?

    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2009年11月9日 4:52
  • 请看最开始的问题
    2009年11月9日 5:45
  • 你是说,你想在一个PictureBox里嵌套几个Panel控件和一张图片,然后把整个PictureBox里的东西作为图片保存,对吧。

    你可以试一下类似截屏的方法,这就需要用到Graphics类了。我以前做过一个类似的例子,你可以参考一下:
    http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/b09c6fa6-a537-4f91-978c-e4242fe570bf
    也就是把整个PictureBox作为一个截屏保存下来,虽然例子中是对于RichTextBox的截图,但是一样可以用的。截取图片之后保存为“emf”的格式就可以了。

    希望对你有所帮助。
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2009年11月9日 6:21
  • 你好,关于拷屏的方法有一种情况不适用,就是picturebox的大小超过了屏幕大小,窗体出现滚动条;而且我需要按当前大小保存,用拷屏方法无法拷贝全部。所以才用到了DrawToBitmap的方法。
    picturebox中动态添加了panel,并在panel实现绘图,而且开启了抗锯齿e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;

    导出图形时,不清楚的部分主要是圆形和文字边缘,似乎有一层黑边,不知该怎么解决了

    2009年11月10日 0:27
  • 谢谢你的回复,似乎在你的图片中还有文字啊。如果可以的话,你能把这个项目通过邮件发给我吗?
    邮箱: v-yicche@micrsoft.com
    我可以本地再现一下,看看能不能帮你解决。
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2009年11月10日 4:21
  • 谢谢你的回复,似乎在你的图片中还有文字啊。如果可以的话,你能把这个项目通过邮件发给我吗?
    邮箱: v-yicche@micrsoft.com
    我可以本地再现一下,看看能不能帮你解决。
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.

    我用163.com和msn.com的邮箱均无法发送到你指定的信箱中,可否给各msn.com的 信箱
    2009年11月11日 0:16
  • 抱歉,邮箱拼写的时候写错了,呵呵,应该是v-yicche@microsoft.com 。如果还是不能发送的话,请发到这个邮箱: chenyichun0407@126.com

    谢谢!
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2009年11月11日 1:58
  • 我看了一下你的代码,是个控件层层嵌套的结构啊,还有继承Panel的自定义控件用来放你的柱状图的吧。

    我自己画了个白底的图片,并在右边的一半画了个圆、写了些文字作为参照,然后按照你程序设计的步骤进行绘图并导出图片,发觉似乎是自定义控件中的柱状图的边框显示的有些模糊,尤其是那些文字。你可以看一下参照的效果:http://cid-75a4db78b1d41bb2.skydrive.live.com/self.aspx/TroubleShoot/untitled1.emf
    所以我建议你可以先检查一下你的自定义控件的代码,是不是有可能引发这样的问题。

    还有一种可能性,就是由于层层的控件嵌套导致的,这就涉及到z-order。如果你是按照PictureBox中嵌套了自定义控件或者其他控件的话,在处理的时候可能要反过来进行,就是从最上层的控件到最底层的控件。
    这里有个类似的问题,你看下会不会对你有所帮助。
    http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/3dab4185-0763-4a6e-b287-c925bfa1af2e
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    • 已标记为答案 ahking 2009年11月11日 8:45
    2009年11月11日 6:43
  • 先把picturebox上的控件画到一个空的bmp上,然后再将picturebox的图像画到该bmp上就行了;不过这是为什么么啊?
    2009年11月11日 8:26
  • 这好像是Winform程序中的一个小问题,呵呵,需要用这个小trick来处理吧。不过很高兴听到你说问题解决了,呵呵。
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2009年11月11日 8:37