如何在SDL.NET/Tao.SDL中获得8位表面的调色板?


11

我希望在可能的情况下或(更可能是)使用Tao.SDL在SDL.NET中获得8位表面的调色板。这是因为我想直接与调色板进行调色板交换,而不是像将32位表面那样将表面放在一起以替换颜色来替换颜色。

我已经获得了SDL_Surface和SDL_PixelFormat,但是当我以相同的方式获取调色板时,却得到了System.ExecutionEngineException:

private Tao.Sdl.Sdl.SDL_Palette GetPalette(Surface surf)
{

// Get surface.
Tao.Sdl.Sdl.SDL_Surface sdlSurface = (Tao.Sdl.Sdl.SDL_Surface)System.Runtime.InteropServices.Marshal.PtrToStructure(surf.Handle,
    typeof(Tao.Sdl.Sdl.SDL_Surface));

// Get pixel format.
Tao.Sdl.Sdl.SDL_PixelFormat pixelFormat = (Tao.Sdl.Sdl.SDL_PixelFormat)System.Runtime.InteropServices.Marshal.PtrToStructure(sdlSurface.format,
    typeof(Tao.Sdl.Sdl.SDL_PixelFormat));

// Execution exception here.
Tao.Sdl.Sdl.SDL_Palette palette = (Tao.Sdl.Sdl.SDL_Palette)System.Runtime.InteropServices.Marshal.PtrToStructure(pixelFormat.palette,
    typeof(Tao.Sdl.Sdl.SDL_Palette));

return palette;
}

当我使用不安全的代码获取调色板时,出现了编译时错误:“无法获取其地址,获取其大小或声明一个指向托管类型的指针('Tao.Sdl.Sdl.SDL_Palette')”。

我获取调色板的不安全代码是这样的:

unsafe
{
    Tao.Sdl.Sdl.SDL_Palette* pal = (Tao.Sdl.Sdl.SDL_Palette*)pixelFormat.palette;
}

根据我的阅读,在这种情况下,托管类型是结构内部具有某种引用作为字段的情况。SDL_Palette结构碰巧有一个SDL_Color的数组,所以我假设这是引起问题的引用类型。但是我仍然不确定如何解决该问题以获得底层调色板。

因此,如果有人知道如何从8位表面获取调色板,无论是通过安全代码还是不安全代码,都将不胜感激。

c#  image  palette 

Answers:


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.