zu erhalten Gibt es eine Möglichkeit, ein BITMAPV5HEADER aus einem Bitmap-Objekt in C# zu erhalten? Oder einfach die Werte, die in ihrem sind? Ich muss einige ColorSpace-Informationen aus einer Bitmap abrufen und kann in C# keine Möglichkeit dafür finden.Gibt es eine Möglichkeit, einen BITMAPV5HEADER aus einem Bitmap-Objekt in C#
0
A
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.
[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
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? –
'IntPtr bV5Endpoints' im Header sollte durch eine Struktur ersetzt werden, die 3' Uint' enthält, bitte überprüfen Sie die Definition von 'CIEXYZTRIPLE' – csharpfolk