2016-11-16 6 views
0

24ビットイメージでクラスを使用しても、8ビットイメージを使用しても動作しない場合、C++を使用してBMPイメージを読み書きしたいファイルを開くことはできません)、1ビットイメージと同様です。1、8、24ビットのBMPファイルをC++で読み取る

「開く」機能を使用してbmpファイルを開き、「保存」機能(これをコピーするだけ)を使用してこれを保存します。結果ファイルは、ファイルが24bit bmpファイルの場合のみオープンされます。その場合、あなたがする必要がある、

#pragma pack(push, 1) 
struct FILEHEADER 
{ 
    WORD bfType; 
    DWORD bfSize; 
    WORD bfReserved1; 
    WORD bfReserved2; 
    DWORD bOffBits; 
}; 
#pragma pack(pop) 

#pragma pack(push, 1) 
struct INFOHEADER 
{ 
    DWORD biSize; 
    LONG biWidth; 
    LONG biHeight; 
    WORD biPlanes; 
    WORD biBitCount; 
    DWORD biCompression; 
    DWORD biSizeImage; 
    LONG biXPelsPerMeter; 
    LONG biYPelsPerMeter; 
    DWORD biClrUsed; 
    DWORD biClrImportant; 
}; 
typedef INFOHEADER infoheader; 
typedef FILEHEADER fileheader; 

const WORD BMP_FORMAT = 0x4D42; 

class Bitmap2 
{ 
private: 
    BYTE *data; 
    infoheader h_info; 
    fileheader h_file; 

    WORD Type(); 
    DWORD OffBits(); 
    DWORD ImageSize(); 
    LONG Rows(); 
    LONG Cols(); 
    WORD BitsPerPixel(); 
    DWORD SizeInBytes(); 
public: 
    void Load(char *filename); 
    void Save(char *filename); 
    void PrintHeaders(); 
}; 

void Bitmap2::Load(char *filename) 
{ 
    std::ifstream file; 

    file.open(filename, std::fstream::binary); 
    if (!file.is_open()) 
     return; 

    file.read((char *)&(h_file), sizeof(fileheader)); 

    // 
    if (Type() != BMP_FORMAT) 
    { 
     file.close(); 
     return; 
    } 

    file.read((char *)&h_info, sizeof(infoheader)); 

    // 
    file.seekg(OffBits()); 

    data = new BYTE[SizeInBytes()]; 

    if (!data) 
    { 
     delete data; 
     file.close(); 
     return; 
    } 

    file.read((char *)data, SizeInBytes()); 

    if (data == NULL) 
    { 
     file.close(); 
     return; 
    } 

    file.close(); 
} 

void Bitmap2::Save(char *filename) 
{ 
    std::ofstream file; 

    if (!data) 
     return; 

    file.open(filename, std::fstream::binary); 
    if (!file.is_open()) 
     return; 

    file.write((char *)&(h_file), sizeof(fileheader)); 

    // 
    if (Type() != BMP_FORMAT) 
    { 
     file.close(); 
     return; 
    } 

    file.write((char *)&h_info, sizeof(infoheader)); 

    file.write((char *)data, SizeInBytes()); 

    file.close(); 
} 

void Bitmap2::PrintHeaders() 
{ 
    std::cout << "biSize = "   << h_info.biSize   << std::endl; 
    std::cout << "biWidth = "   << h_info.biWidth   << std::endl; 
    std::cout << "biHeight = "   << h_info.biHeight   << std::endl; 
    std::cout << "biPlanes = "   << h_info.biPlanes   << std::endl; 
    std::cout << "biBitCount = "  << h_info.biBitCount  << std::endl; 
    std::cout << "biCompression = "  << h_info.biCompression  << std::endl; 
    std::cout << "biSizeImage = "  << h_info.biSizeImage  << std::endl; 
    std::cout << "biXPelsPerMeter = " << h_info.biXPelsPerMeter << std::endl; 
    std::cout << "biYPelsPerMeter = " << h_info.biYPelsPerMeter << std::endl; 
    std::cout << "biClrUsed = "   << h_info.biClrUsed   << std::endl; 
    std::cout << "biClrImportant = " << h_info.biClrImportant << std::endl; 
} 

WORD Bitmap2::Type() 
{ 
    return h_file.bfType; 
} 

DWORD Bitmap2::OffBits() 
{ 
    return h_file.bOffBits; 
} 

DWORD Bitmap2::ImageSize() 
{ 
    return h_info.biSizeImage; 
} 

LONG Bitmap2::Rows() 
{ 
    return h_info.biHeight; 
} 

LONG Bitmap2::Cols() 
{ 
    return h_info.biWidth; 
} 
WORD Bitmap2::BitsPerPixel() 
{ 
    return h_info.biBitCount; 
} 
DWORD Bitmap2::SizeInBytes() 
{ 
    return h_info.biSizeImage; 
} 

int main() 
{ 
    Bitmap2 x; 

    x.Load("test.bmp"); 
    x.Save("test_o.bmp"); 
    x.PrintHeaders(); 
    std::cout << "__________" << std::endl; 
} 
+0

「ペイントできない」とはどういう意味ですか? – GMichael

+0

詳細を入力してください。 8ビットイメージを保存するのが問題ならば、少なくともヘッダー情報を作成するコードを追加してください。 –

+0

"開く"機能を使用してbmpファイルを開き、 "保存"機能(これをコピーするだけ)を使用してこれを保存します。結果ファイルは、ファイルが24bit bmpファイルの場合のみオープンされます。ヘッダーを作成せず、Open関数を使用してソースからヘッダーをコピーします。 –

答えて

2

biSizeImage may be 0:私は、私が使用したコードがある

(読み込みと保存機能を参照してください)Open関数を使用してソースからヘッダをコピーし、任意のヘッダを作成しないでください実際のサイズを計算します。

また、私はcolor table(パレット)を読み書きしているところはわかりません。 1ビットと8ビットのビットマップファイルにはパレットが必要なため、24ビットのビットマップファイルには問題がありません。

関連する問題