如果图像没有流,则设置图像调色板会引发GDI +一般错误异常

时间:2013-03-07 09:42:33

标签: .net vb.net winforms gdi+

我正在使用GDI +将一些图像渲染到位图上,然后将位图渲染到面板上以用作编辑器。

选择编辑器面板中的图像时,应突出显示红色。我使用以下代码

If mCurrentindex = ind Then
    Dim redImage As Bitmap = item.Image.Clone()

    Dim pal As ColorPalette

    pal = redImage.Palette

    For i As Integer = 0 To pal.Entries.Length - 1
        If pal.Entries(i).Name = "ff000000" Then
            pal.Entries(i) = Color.Red
        End If
    Next

    redImage.Palette = pal

    g.DrawImage(redImage, 0, 0, (CType((item.Image.Width), Integer)), (CType((item.Image.Height), Integer)))

    Dim highlightPen As New Pen(Brushes.Red, 2)
    g.DrawRectangle(highlightPen, New Rectangle(0, 0, item.W - 1, item.H - 1))
Else
    g.DrawImage(item.Image, 0, 0, (CType((item.Image.Width), Integer)), (CType((item.Image.Height), Integer)))
End If

当我使用Image.FromFile加载图像时这是有效的,它会锁定文件,这是我不想要的。我更改了代码,使用steam将图像加载到临时图像中,将其克隆到另一个图像中,然后处理临时图像。但是,现在当我点击

redImage.Palette = pal

我收到了通用的GDI +错误。任何受到打击的人都知道他们基本上没有提供比“某些东西破坏”更多的信息。我不确定为什么更改调色板会在原始图像中起作用,而不是克隆图像。任何人都可以帮助我吗?

应该注意的是,如果图像产生差异,则每个像素的图像为1比特。

提前致谢。

1 个答案:

答案 0 :(得分:0)

  

Bitmap(Image)和Bitmap.Clone()

之间有什么区别

副本之间的区别。 Bitmap.Clone()是一个浅拷贝,不复制位图的像素数据。它保留指向原始像素数据的指针。当你使用一个带有Rectangle的重载时,它才真正有用。

因此,Bitmap.Clone()将锁定像素数据的基础源。就像加载图像的文件一样。或者如果您使用MemoryStream来锁定文件的流。哪个 要求您保持MemoryStream活着。关闭或处理它会使程序崩溃。之后,需要像素数据时。通常在涂漆时。

通过创建不锁定文件的深层副本来避免所有这些:

    public static Bitmap LoadBitmapWithoutLock(string path) {
        using (var temp = Image.FromFile(path)) {
            return new Bitmap(temp);
        }
    }