无法在此函数中返回Bitmap对象

时间:2014-01-11 16:18:09

标签: .net vb.net graphics bitmap gdi+

我正在尝试编写一个应该创建指定大小的新位图并用指定颜色填充它的函数,问题是我在尝试将位图分配给任何属性时一直都是异常或者以其他几种方式使用它,比如从字典类型中获取位图来读取位图属性。

例如,这不起作用:

Private Shadows Sub Shown() Handles MyBase.Shown

    PictureBox1.BackgroundImage =
        CreateSolidBitmap(New Size(16, 16), Color.Red)

End Sub

这一直有效,直到我尝试读取位图

    Private Shadows Sub Shown() Handles MyBase.Shown

        Dim dict As New Dictionary(Of Color, Bitmap) From
            {
                {Color.Red, CreateSolidBitmap(New Size(16, 16), Color.Red)}
            }

        ' This throws the same exception above:
        MsgBox(dict(Color.Red).Size.Width)

    End Sub

例外说:

  

System.ArgumentException未处理消息:未处理的异常   System.Drawing.dll中出现'System.ArgumentException'类型   附加信息:参数无效。

这是功能,我缺少什么?

''' <summary>
''' Creates a bitmap filled with a solid color.
''' </summary>
''' <param name="FillColor">Color to fill the Bitmap.</param>
''' <returns>System.Drawing.Bitmap.</returns>
Private Function CreateSolidBitmap(ByVal Size As Size,
                                   ByVal FillColor As Color) As Bitmap

    ' Create a bitmap.
    Using bmp As New Bitmap(Size.Width, Size.Height)

        ' Create a graphics object.
        Using g As Graphics = Graphics.FromImage(bmp)

            ' Create a brush using the specified color.
            Using br As New SolidBrush(FillColor)

                ' Fill the graphics object with the brush.
                g.FillRectangle(br, 0, 0, bmp.Width, bmp.Height)

            End Using ' br

        End Using ' g

        Return bmp

    End Using ' bmp

End Function

位图是为了这个:

enter image description here

2 个答案:

答案 0 :(得分:2)

更改

Using bmp As New Bitmap(Size.Width, Size.Height)

Dim bmp As New Bitmap(Size.Width, Size.Height)

点击End Using(bmp)后,bmp将被处理。

答案 1 :(得分:1)

不是没有,但 IS 是一种优化此类方案的方法。我有一个应用程序,可以存储多达120个大小未知的图像。我还必须创建/管理该图像的thumnbnail。而不是存储巨大的位图,而是将图像保存为编码为PNG的流:

Private Sub EncodeImage(ByVal bmp As Bitmap)
    ' raw bitmaps are HUGE - 1080p can be 8MB while JPG is 400K and PNG is 2MB

   ' optional: examine bmp and make a reasonable size thumbnail.
   ' e.g. store 1080p as a max of 1600x900 or whatever.
   'you can always restore the size

   ' a backing field in the class this procedure is in
    _MS = New MemoryStream

   bmp.Save(mMS, System.Drawing.Imaging.ImageFormat.Png)
End Sub

解码很简单:

_MS.Seek(0, SeekOrigin.Begin)

Return System.Drawing.Image.FromStream(mMS, True, False)

您可以通过这种方式保存大量内存和大量内存,如果重复访问相同的图像(如循环中),则会有轻微的性能损失。对于16x16 单色位图(OP),没有理由采用这样的方法,在这种情况下我甚至不会存储位图。但是从评论(5000px bitmap)我会考虑它取决于这些是什么。

编码也会受到质量影响(这是首选PNG到JPG的原因)。对于一种颜色 bimtmap,你不会注意到。对于实际图像,您可能会,但权衡的是在应用程序中存储的图像要少得多,或者使用磁盘临时文件会更慢。

HTH