Image buffer를 Bitmap file format으로 저장하기(RGB)
Image처리를 하다보면 memory buffer에 있는 image raw데이터를 BMP포멧으로 저장할 필요가 있다.
RGB Buffer(24bit)를 widows bitmap format으로 저장하는 함수
// _fname : 저장할 파일 명( xxx.bmp )
// _buf : RGB 순서로 구성된 Image buff
// _w, _h : image width, height
void saveBMPfile(char *_fname, uchar* _buf, int _w, int _h)
{
int filesize = 54 + _w * _h * 3;
unsigned char bmpfileheader[14] = {'B','M', 0,0,0,0, 0,0, 0,0, 54,0,0,0};
unsigned char bmpinfoheader[40] = {40,0,0,0, 0,0,0,0, 0,0,0,0, 1,0, 8,0};
unsigned char bmppad[3] = {0,0,0};
bmpfileheader[ 2] = (unsigned char)(filesize );
bmpfileheader[ 3] = (unsigned char)(filesize>> 8);
bmpfileheader[ 4] = (unsigned char)(filesize>>16);
bmpfileheader[ 5] = (unsigned char)(filesize>>24);
bmpinfoheader[ 4] = (unsigned char)( _w );
bmpinfoheader[ 5] = (unsigned char)( _w>> 8);
bmpinfoheader[ 6] = (unsigned char)( _w>>16);
bmpinfoheader[ 7] = (unsigned char)( _w>>24);
bmpinfoheader[ 8] = (unsigned char)( _h );
bmpinfoheader[ 9] = (unsigned char)( _h>> 8);
bmpinfoheader[10] = (unsigned char)( _h>>16);
bmpinfoheader[11] = (unsigned char)( _h>>24);
FILE* fp;
fp =fopen(_fname, "wb");
if(fp!=NULL) {
fwrite(bmpfileheader, 1, 14, fp);
fwrite(bmpinfoheader, 1, 40, fp);
fwrite(_buf, _w*_h, 3, fp);
fclose(fp);
}
}
* Gray Bufferer 저장하기 : 링크
Image buffer를 Bitmap file format으로 저장하기(Gray image)
Image처리를 하다보면 memory buffer에 있는 image raw데이터를 BMP포멧으로 저장할 필요가 있다.
Gray Buffer(8bit)를 widows bitmap fotmat으로 저장하는 함수
// _fname : 저장할 파일 명( xxx.bmp )
// _buf : RGB 순서로 구성된 Image buff
// _w, _h : image width, height
void saveBMPfile(char *_fname, uchar* _buf, int _w, int _h)
{
int filesize = 54 + 256*4 + _w*_h;
unsigned char bmppalete[256*4];
unsigned char bmpfileheader[14] = {'B','M', 0,0,0,0, 0,0, 0,0, 54+256*4,0,0,0};
unsigned char bmpinfoheader[40] = {40,0,0,0, 0,0,0,0, 0,0,0,0, 1,0, 8,0};
unsigned char bmppad[3] = {0,0,0};
// File의 크기
bmpfileheader[ 2] = (unsigned char)(filesize );
bmpfileheader[ 3] = (unsigned char)(filesize>> 8);
bmpfileheader[ 4] = (unsigned char)(filesize>>16);
bmpfileheader[ 5] = (unsigned char)(filesize>>24);
// Image buffer의 Width
bmpinfoheader[ 4] = (unsigned char)( _w );
bmpinfoheader[ 5] = (unsigned char)( _w>> 8);
bmpinfoheader[ 6] = (unsigned char)( _w>>16);
bmpinfoheader[ 7] = (unsigned char)( _w>>24);
// Image buffer의 Height
bmpinfoheader[ 8] = (unsigned char)( _h );
bmpinfoheader[ 9] = (unsigned char)( _h>> 8);
bmpinfoheader[10] = (unsigned char)( _h>>16);
bmpinfoheader[11] = (unsigned char)( _h>>24);
// Pallet 정보 Windows Format의 구성 : RGBx 4Byte
// 8bit Image의 경우 Pallet의 크기 2^8 = 256
// Gray Image의 경우 RGB 동일값
for(int i=0; i<256;i++) {
bmppalete[i*4] = bmppalete[i*4+1] = bmppalete[i*4+2] = i;
bmppalete[i*4+3] = 0;
}
FILE* fp;
fp = fopen(_fname, "wb");
if(fp!=NULL) {
fwrite(bmpfileheader, 1, 14, fp);
fwrite(bmpinfoheader, 1, 40, fp);
fwrite(bmppalete, 1, 256*4, fp);
fwrite(_buf, _w*_h, 1, fp);
fclose(fp);
}
}
* Color Buffer(RGB) 저장 : https://amosground.blogspot.com/2020/10/image-buffer-bitmap-file-format-rgb.html
관련문서
PC에서 ARM용 크로스 컴파일 후 strip 시 오류 발생
OpenCV를 ARM용으로 Cross Compile후 strip실행시 아래와 같은 오류 발생
$ strip -s *.sostrip: Unable to recognise the format of the input file 'libopencv_calib3d.so'
원인은 strip을 호스트용을 사용해서 발생한 것으로 ARM용으로 strip을 할수 있는 arm-linux-gnueabi-strip을 사용하면 정상적으로 strip이 되는것을 확인할 수 있다.
$ arm-linux-gnueabi-strip -s *.so