Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с двоичными файлами, Чтение заголовков 
V
    Опции темы
v00d00
Дата 15.3.2009, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 28.12.2005

Репутация: нет
Всего: нет



Нужно прочесть заголовки BMP файла в память из файла на диске. В каком направлении копать?
Пока почти все что нашел в гугле было связано со стандартными компонентами для чтения картинок. По тех заданию это не допускается.

Вот нашел оисание структур заголовка БМП

Код

[StructLayout(LayoutKind.Sequential)]
public struct BITMAPFILEHEADER
{
    public short bfType;
    public int bfSize;
    public short bfReserved1;
    public short bfReserved2;
    public int bfOffBits;
}
[StructLayout(LayoutKind.Sequential)]
public struct BMPINFO
{
    public int hBmp;
    public int Width;
    public int Height;
    public int XPelsPerMeter;
    public int YPelsPerMeter;
    public int Length;
}
[StructLayout(LayoutKind.Sequential)]
public struct BITMAPCOREHEADER
{
    public Int32 bcSize;
    public short bcWidth;
    public short bcHeight;
    public short bcPlanes;
    public short bcBitCount;
}
[StructLayout(LayoutKind.Sequential)]
public struct BITMAPINFOHEADER
{
    public Int32 biSize;
    public Int32 biWidth;
    public Int32 biHeight;
    public short biPlanes;
    public short biBitCount;
    public Int32 biCompression;
    public Int32 biSizeImage;
    public Int32 biXPelsPerMeter;
    public Int32 biYPelsPerMeter;
    public Int32 biClrUsed;
    public Int32 biClrImportant;
}
[StructLayout(LayoutKind.Sequential)]
public struct RGBQUAD
{
    public byte rgbBlue;
    public byte rgbGreen;
    public byte rgbRed;
    public byte rgbReserved;
}
[StructLayout(LayoutKind.Sequential)]
public struct RGBTRIPLE
{
    public byte rgbtBlue;
    public byte rgbtGreen;
    public byte rgbtRed;
}
[StructLayout(LayoutKind.Sequential)]
public struct BITMAPINFO
{
    public BITMAPINFOHEADER bmiHeader;
    public RGBQUAD[] bmiColors;
}
[StructLayout(LayoutKind.Sequential)]
public struct PALETTEENTRY
{
    public byte peRed;
    public byte peGreen;
    public byte peBlue;
    public byte peFlags;
    public int numColors;
}
[StructLayout(LayoutKind.Sequential)]
public struct LOGPALETTE
{
    public short PALVERSION;
    public int palNumEntries;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
    public PALETTEENTRY[] palPalEntry;
}
[StructLayout(LayoutKind.Sequential)]
public struct LOGFONT
{
    public Int32 lfHeight;
    public Int32 lfWidth;
    public Int32 lfEscapement;
    public Int32 lfOrientation;
    public Int32 lfWeight;
    public byte lfItalic;
    public byte lfUnderline;
    public byte lfStrikeOut;
    public byte lfCharSet;
    public byte lfOutPrecision;
    public byte ClipPrecision;
    public byte lfQuality;
    public byte lfPitchAndFamily;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
    public byte[] lfFaceName;
}
[StructLayout(LayoutKind.Sequential)]
public struct PANEINFO
{
    public BMPINFO BI;
    public Int32 hDCMem;
    public Int32 Zoom;
    public Int32 zLeft;
    public Int32 zTop;
    public Int32 zWidth;
    public Int32 zHeight;
    public bool AllowPaint;
}


Как из потока прочесть байты в такие структуры?
PM MAIL   Вверх
v00d00
Дата 15.3.2009, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 28.12.2005

Репутация: нет
Всего: нет



Написал такую функцию:
Код

private T ReadStruct<T>()
        {
            byte[] data = new byte[Marshal.SizeOf(typeof(T))];
            fs.Read(data,0,data.Length);
            IntPtr pointer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(T)));
            Marshal.Copy(data, 0, pointer, Marshal.SizeOf(typeof(T)));
            T result = (T)Marshal.PtrToStructure(pointer, typeof(T));
            Marshal.FreeHGlobal(pointer);
            return result; 
        }


Применение 

Код

 BITMAPFILEHEADER bmpFileHead = ReadStruct<BITMAPFILEHEADER>(); 
 BITMAPINFOHEADER bmpInfoHead = ReadStruct<BITMAPINFOHEADER>();
 bmpFileHead.bfSize = 0;


Такое чтение данных неправильно сохраняет двойные слова. Слово в файле сохранено как little-endian, а функция читает его как big-endian.
Почему так выходит?И почему номер прокатывал в программе на Си?



Разобрался: структура сохранялась в память с выравниванием по четырёхбайтным полям( что не правильно), нужно было поставить Pack=1 в объявлении структуры


Это сообщение отредактировал(а) v00d00 - 15.3.2009, 17:18
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0395 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.