private bool LoadBitmapInfoHeader( BinaryReader reader, ref ImageInfo imageData, out Utilities.BITMAPINFOHEADER infoHeader, out int padding) { infoHeader = new Utilities.BITMAPINFOHEADER (); padding = 0; infoHeader.biSize = reader.ReadUInt32 (); // 정보 구조체 크기가 40이 아니면 V3 비트맵이 아니므로 종료 if ( infoHeader.biSize != 40 ) return false; infoHeader.biWidth = reader.ReadInt32 (); infoHeader.biHeight = reader.ReadInt32 (); infoHeader.biPlanes = reader.ReadUInt16 (); infoHeader.biBitCount = reader.ReadUInt16 (); infoHeader.biCompression = reader.ReadUInt32 (); infoHeader.biSizeImage = reader.ReadUInt32 (); infoHeader.biXPelsPerMeter = reader.ReadInt32 (); infoHeader.biYPelsPerMeter = reader.ReadInt32 (); infoHeader.biClrUsed = reader.ReadUInt32 (); infoHeader.biClrImportant = reader.ReadUInt32 (); // 1장이 아니면 BMP가 아니므로 종료 if ( infoHeader.biPlanes != 1 ) return false; // 24비트 또는 32비트 비트맵이 아니면 종료 if ( !( infoHeader.biBitCount == 24 || infoHeader.biBitCount == 32 ) ) return false; // 압축된 데이터일 경우 종료 if ( infoHeader.biCompression != 0 ) return false; imageData.Width = infoHeader.biWidth; imageData.Height = infoHeader.biHeight; int rowWidth = infoHeader.biWidth * 24 / 8; padding = 0; while ( rowWidth % 4 != 0 ) { rowWidth++; padding++; } if ( infoHeader.biSizeImage == 0 ) infoHeader.biSizeImage = ( uint ) ( rowWidth * infoHeader.biHeight * ( ( infoHeader.biBitCount == 24 ) ? 3 : 4 ) ); return true; }
private bool LoadBitmapFileHeader( BinaryReader reader, ref ImageInfo imageData, out Utilities.BITMAPFILEHEADER fileHeader) { fileHeader = new Utilities.BITMAPFILEHEADER (); fileHeader.bfType = reader.ReadUInt16 (); if ( fileHeader.bfType != 0x4D42 ) return false; fileHeader.bfSize = reader.ReadUInt32 (); fileHeader.bfReserved1 = reader.ReadUInt16 (); fileHeader.bfReserved2 = reader.ReadUInt16 (); // 예약된 공간이 0이 아니면 종료 if ( fileHeader.bfReserved1 != 0 || fileHeader.bfReserved2 != 0 ) return false; fileHeader.bfOffBits = reader.ReadUInt32 (); return true; }