我有两个函数:其中一个用于将.mul文件中的图像从字节数组转换为位图,第二个用颜色绘制它(更改图像的像素)。所以,这里是用颜色绘制位图的功能,这个函数缓存位图:
public static void RecolorPartial(HueEntry hue, Bitmap bitmap)
{
if (hue == null)
throw new ArgumentNullException("hue");
if (bitmap == null)
return;
if (bitmap.PixelFormat != PixelFormat.Format16bppArgb1555)
throw new ArgumentException("Invalid bitmap pixel format.", "source");
BitmapData data = bitmap.LockBits(Ultima.GetBitmapBounds(bitmap), ImageLockMode.ReadWrite, PixelFormat.Format16bppArgb1555);
Debug.Assert(data.Stride % 2 == 0);
RecolorPartialInternal(hue, data.Scan0, data.Stride * data.Height / 2);
bitmap.UnlockBits(data);
}
private static unsafe void RecolorPartialInternal(HueEntry hue, IntPtr dataPtr, int lenght)
{
ushort* pData = (ushort*)dataPtr.ToPointer();
for (int i = 0; i < lenght; i++)
{
ushort c = (ushort)((*pData) & 0x1F);
if (c == (((*pData) >> 5) & 0x1F) && c == (((*pData) >> 10) & 0x1F))
{
*pData = (ushort)(((*pData) & 0x8000) | hue.Colors[c]);
}
pData++;
}
}
我无法理解,为什么当我在循环中使用它时(5-10位图(但已经有2个)),它会缓存它或者没有重绘 - 在第一个位图之后,每个下一个看起来像第一个
for (int i = 0; i < colors.Count(); i++)
{
Bitmap bit = Art.GetStatic(type);
Hues hues = Hues.Load(huePath);
if (colors[i] != 0)
RedrawHue.RecolorPartial(hues[colors[i]], bit);
Bitmap newbit = new Bitmap(bit.Width, bit.Height);
Graphics newgraph = Graphics.FromImage(newbit);
...
如果我的颜色数组看起来像{0,1590,0,1330,0,1777} - 那很好,图像从灰色(0色值)变为蓝色(1590值),但1590 = 1330 = 1777。如果我制作{1590,1330,1777,2000} - 所有的位图都是相同的,看起来像是1590(如果我洗牌的话,那么每次下一次之后应该像第一个一样)。没有循环一切都很好。 Mb这个问题很愚蠢,不完整或描述得不好,但我真的不知道为什么这就是我在循环中使用这个功能可以做些什么。