我正在使用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比特。
提前致谢。
答案 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);
}
}