SDL.NET/Tao.SDL'de 8 bitlik bir yüzeyin paletini nasıl edinebilirim?


11

Mümkünse SDL.NET'te 8 bitlik bir yüzeyin paletini veya Tao.SDL kullanarak (büyük olasılıkla) elde etmek istiyorum. Bunun nedeni, 32 bitlik bir yüzeyle nasıl yapacağınız gibi renkleri değiştirmek için yüzeyleri birleştirmek yerine paletle doğrudan palet takas etmek istiyorum.

SDL_Surface ve SDL_PixelFormat'ı aldım, ancak aynı şekilde paleti almaya gittiğimde, bir System.ExecutionEngineException alıyorum:

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;
}

Paleti almak için güvenli olmayan kod kullandığımda, derleme zamanı hatası aldım: "Yönetilen bir türün adresini alamıyorum, boyutunu alamıyorum veya bir işaretçi bildiremiyorum ('Tao.Sdl.Sdl.SDL_Palette')".

Paleti almak için güvenli olmayan kodum şuydu:

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

Okuduğum kadarıyla, bu durumda yönetilen bir tür, bir yapının içinde bir alan olarak bir tür referansı olduğu zamandır. SDL_Palette yapısı SDL_Color's bir dizi var olur, bu yüzden sorunlara neden olan referans türü olduğunu varsayalım. Ancak hala altta yatan paleti elde etmek için nasıl çalışacağından emin değilim.

Bu nedenle, paletin 8 bitlik bir yüzeyden nasıl alınacağını bilen biri, güvenli veya güvenli olmayan bir kodla olsun, yardım çok takdir edilecektir.

c#  image  palette 

Yanıtlar:


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.