Любой способ получить BITMAPV5HEADER из объекта Bitmap в C # - PullRequest
0 голосов
/ 03 апреля 2009

Есть ли способ получить BITMAPV5HEADER из объекта Bitmap в C #? Или просто получить значения, которые есть у них? Мне нужно получить некоторую информацию о ColorSpace из растрового изображения, и я не вижу способа сделать это в C #.

Ответы [ 2 ]

1 голос
/ 03 апреля 2009

Кажется, это не простой способ сделать это, но хакерский (и, вероятно, очень ошибочный) способ - это прочитать исходные данные и преобразовать их в структуру BITMAPV5HEADER.

Состав
[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;
}
Вспомогательный метод
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;
}
использование
using (FileStream stream = File.OpenRead("..."))
{
  BITMAPV5HEADER header = RawStructureRead<BITMAPV5HEADER>(stream);
}
0 голосов
/ 03 апреля 2009

Я сомневаюсь в этом. BITMAPV5HEADER - для объектов GDI, а не GDI +, для которого Bitmap сделан Я бы открыл файл, если это возможно, используя стандартные вызовы GDI.

...