Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        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;
        }