【问题标题】:Forcing a PictureBox to retain its image if the image was drawn on using code in vb.net如果使用 vb.net 中的代码绘制图像,则强制 PictureBox 保留其图像
【发布时间】:2011-11-13 18:57:57
【问题描述】:

我的图片框有时会在完成创建图像时清除所有绘图,或者有时在中途清除。在绘图开始之前调用 GC.Collect() 可以让它在清除之前绘制更多,但是我怎样才能阻止它完全清除呢?

这是在 vb.net 中

谢谢!

【问题讨论】:

    标签: vb.net picturebox


    【解决方案1】:

    在 .Net 中持久保存绘制图像的一种简单方法是在单独的 Bitmap 对象上进行绘制,然后将 PictureBox 的 Image 属性设置为等于 Bitmap,如下所示:

    Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
    using (Graphics g = Graphics.FromImage(bmp))
    {
        // draw whatever
    }
    pictureBox1.Image = bmp;
    

    对不起,这是C#,但应该说明原理OK。

    另一种保持绘制图像的方法是在 PictureBox 的 Paint 事件中进行绘制,但这意味着每次控件需要重新绘制自身时,您的绘制代码都会执行(每当另一个窗体被拖到它上面时就会发生这种情况等) .)。上面的方法(设置控件的Image属性)比较简单。

    【讨论】:

    • 知道了!慢一点,但如果我最小化窗口,它会更快。考虑到它必须单独绘制 30,000 个像素,3 秒还不错。
    • 如果您是逐像素绘制,一种更快但稍微复杂一点的技术是调用位图上的 LockBits 方法。见vb-helper.com/howto_net_lockbits_image_class.htmlbobpowell.net/lockingbits.htm
    • 我使用的是 SetPixel,你可以想象它非常慢,尤其是因为我添加了一些 application.doevents() 哈哈
    • 时间优化到 1.4 秒!耶:P
    • 而且它在 VS v16 中仍然是最新的。 :)
    【解决方案2】:

    在上述情况下,当“bmp”或“g”对象超出范围并被垃圾回收时,图片框图像会发生变化。我认为图像总是参考复制。我尝试 bmp.clone 将图像复制到图片框,但是当 bmp 被垃圾收集时,图片框图像消失了。就我而言,我有许多(在运行时确定)这样的图像要分配给运行时创建的图片框。

    Dim bm As New Bitmap("C:\picture.bmp")
    Dim thumb As New Bitmap(42, 30)
    Dim g As Graphics = Graphics.FromImage(thumb)
    
    g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
    g.DrawImage(bm, New Rectangle(0, 0, 42, 30), New Rectangle(0, 0, bm.Width, _bm.Height), GraphicsUnit.Pixel)
    pbxHead.Image = thumb.Clone()
    
    g.Dispose()
    bm.Dispose()
    thumb.Dispose()
    

    【讨论】:

      猜你喜欢
      • 2018-03-16
      • 1970-01-01
      • 2020-06-17
      • 2018-03-17
      • 2013-11-26
      • 2021-06-28
      • 1970-01-01
      • 2013-05-11
      • 1970-01-01
      相关资源
      最近更新 更多