Bitmapを読み込んでCSVに出力するプログラム

bitmap-csv.png

WindowsAPIを使用しています。
32bitのビットマップを想定しています。
ビットマップのフォーマットについてはこちら→bitmapのフォーマット

#include <Windows.h>
#include <stdio.h>
#include <assert.h>
#include <fstream>
using namespace std;
 
int width;//ビットマップの幅
 int height;//ビットマップの高さ
unsigned char *texturedatapointer;
void LoadTextureData(TCHAR* _filename){
    HANDLE handle;
    DWORD temp=0;
    BITMAPFILEHEADER bitmapFileHeader;
    BITMAPINFOHEADER bitmapInfoHeader;
    handle = CreateFile(_filename,GENERIC_READ,FILE_SHARE_READ, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL );
 
    if(handle==INVALID_HANDLE_VALUE || handle==NULL){assert(!"ファイルが見つかりません。");}
    ReadFile(handle,&bitmapFileHeader,sizeof(BITMAPFILEHEADER),&temp,NULL);
    if ( temp!=sizeof(BITMAPFILEHEADER) || bitmapFileHeader.bfType!=0x4D42 )
    {
        CloseHandle(handle);
        assert(!"bmp形式ではありません");
    }
width=bitmapInfoHeader.biWidth;
height=bitmapInfoHeader.biHeight;
texturedatapointer=new unsigned char[width*height*4];//RGBAの4要素なので*4
    ReadFile(handle,&bitmapInfoHeader,sizeof(BITMAPINFOHEADER),&temp,NULL);
 
      ReadFile(handle,texturedatapointer,width*height*4,&temp,NULL);
    CloseHandle(handle);
 
}
void WriteCSVData(const char* _filename){
    ofstream ofs;
    ofs.open(_filename);
 
        for(int y=0;y<height;y++){
            for(int x=0;x<width;x++){
            ofs<<(int)texturedatapointer[(y*width+x)*4+1]<<",";//","カンマ区切りでCSV Green要素だけ抜き出すため+1にしている。
        }
        ofs<<endl;
    }
    ofs.close();
}
void main(){
    LoadTextureData("seed.bmp");
    WriteCSVData("bmp.csv");
}

WriteCSVDataのここ

ofs«(int)texturedatapointer[(y*width+x)*4+1]«",";

[(y*width+x)*4+1]に関しては、
c++:1次元配列を多次元配列かのように扱う参照


bitmap c

サポートサイト Wikidot.com bitmapc