2009-04-03 3 views

Antwort

1

Scheint nicht eine einfache Möglichkeit, es zu tun, aber ein hackish (und wahrscheinlich sehr buggy) Weg wäre, die Rohdaten einzulesen und in eine BITMAPV5HEADER Struktur zu konvertieren.

Struktur
[StructLayout(LayoutKind.Sequential)] 
public struct BITMAPV5HEADER 
{ 
    uint bV5Size; 
    long bV5Width; 
    long bV5Height; 
    int bV5Planes; 
    int bV5BitCount; 
    uint bV5Compression; 
    uint bV5SizeImage; 
    long bV5XPelsPerMeter; 
    long bV5YPelsPerMeter; 
    uint bV5ClrUsed; 
    uint bV5ClrImportant; 
    uint bV5RedMask; 
    uint bV5GreenMask; 
    uint bV5BlueMask; 
    uint bV5AlphaMask; 
    uint bV5CSType; 
    IntPtr bV5Endpoints; 
    uint bV5GammaRed; 
    uint bV5GammaGreen; 
    uint bV5GammaBlue; 
    uint bV5Intent; 
    uint bV5ProfileData; 
    uint bV5ProfileSize; 
    uint bV5Reserved; 
} 
Helper-Methode
public static T RawStructureRead<T>(Stream stream) where T : struct 
{ 
    T @struct; 
    int size = Marshal.SizeOf(typeof(T)); 

    BinaryReader reader = new BinaryReader(stream); 
    byte[] buffer = reader.ReadBytes(size); 

    GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned); 
    @struct = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T)); 
    handle.Free(); 

    return @struct; 
} 
Nutzungs
using (FileStream stream = File.OpenRead("...")) 
{ 
    BITMAPV5HEADER header = RawStructureRead<BITMAPV5HEADER>(stream); 
} 
+0

'IntPtr bV5Endpoints' im Header sollte durch eine Struktur ersetzt werden, die 3' Uint' enthält, bitte überprüfen Sie die Definition von 'CIEXYZTRIPLE' – csharpfolk

0

Ich bezweifle es. Die ist für GDI-Objekte nicht GDI +, die mit der Bitmap gemacht wird. Ich würde die Datei, wenn möglich, mit den Standard-GDI-Aufrufen erneut öffnen.

+0

Wenn es aus einer Datei nicht kommt? –