Wie kann ich die Palette einer 8-Bit-Oberfläche in SDL.NET/Tao.SDL abrufen?


11

Ich möchte die Palette einer 8-Bit-Oberfläche in SDL.NET erhalten, wenn dies möglich ist, oder (höchstwahrscheinlich) Tao.SDL verwenden. Dies liegt daran, dass ich Paletten direkt mit der Palette austauschen möchte, anstatt Oberflächen zusammenzuschneiden, um Farben zu ersetzen, wie Sie es bei einer 32-Bit-Oberfläche tun würden.

Ich habe das SDL_Surface und das SDL_PixelFormat erhalten. Wenn ich jedoch die Palette auf die gleiche Weise abrufe, erhalte ich eine 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;
}

Wenn ich unsicheren Code zum Abrufen der Palette verwendet habe, wurde ein Fehler bei der Kompilierung angezeigt: "Die Adresse eines verwalteten Typs ('Tao.Sdl.Sdl.SDL_Palette') kann nicht übernommen, die Größe ermittelt oder ein Zeiger deklariert werden."

Mein unsicherer Code, um die Palette zu erhalten, war folgender:

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

Nach dem, was ich gelesen habe, ist ein verwalteter Typ in diesem Fall, wenn eine Struktur eine Art Referenz als Feld enthält. Die SDL_Palette-Struktur enthält zufällig ein Array von SDL_Color, daher gehe ich davon aus, dass dies der Referenztyp ist, der Probleme verursacht. Ich bin mir jedoch immer noch nicht sicher, wie ich das umgehen soll, um die zugrunde liegende Palette zu erhalten.

Wenn also jemand weiß, wie man die Palette von einer 8-Bit-Oberfläche erhält, sei es durch sicheren oder unsicheren Code, wäre die Hilfe sehr dankbar.

c#  image  palette 

Antworten:


1

Vielleicht kann Ihnen das helfen:

http://www.libsdl.org/docs/html/sdlsurface.html

In der Dokumentation hat die Struktur SDL_Surface das Attribut SDL_PixelFormat * format. Und die Struktur SDL_PixelFormat hat eine Attribut-SDL_Palette * -Palette. Ich denke, Sie müssen nur Folgendes tun:

SDL_Surface* targetSurface;
SDL_Palette* myPalette = targetSurface->format->palette; 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.