Android上层保存图片需要大量的内存空间,所以在此用C++底层保存图片,减少上层的内存申请。在此做一下记录。
函数接收的参数依次为:图片名称,图片宽度,图片高度,图片数据。
int CSaveImage::saveBmp(const char* name,int width,int height,unsigned char* data) { //int widthStep = (((width * 24) + 31) & (~31)) / 8 ; //每行实际占用的大小(每行都被填充到一个4字节边界) int size = width*height*2; // 每个像素点3个字节 // 位图第一部分,文件信息 BMPFILEHEADER_T bfh; bfh.bfType = 0x4d42; //bm bfh.bfSize = size // data size + sizeof(BMPFILEHEADER_T) // first section size + sizeof(BMPINFOHEADER_T); // second section size bfh.bfReserved1 = 0; // reserved bfh.bfReserved2 = 0; // reserved bfh.bfOffBits = bfh.bfSize - size; //bfh.bfSize = (bfh.bfSize + 3)&~3; size = bfh.bfSize - bfh.bfOffBits; // 位图第二部分,数据信息 BMPINFOHEADER_T bih; bih.biSize = sizeof(BMPINFOHEADER_T); bih.biWidth = width; bih.biHeight = height; bih.biPlanes = 1; bih.biBitCount = 16; bih.biCompression = 3; bih.biSizeImage = size; bih.biXPelsPerMeter = 0; bih.biYPelsPerMeter = 0; bih.biClrUsed = 0; bih.biClrImportant = 0; bih.rgb[0] = 0xF800; bih.rgb[1] = 0x07E0; bih.rgb[2] = 0x001F; bih.rgb[3] = 0; FILE * fp = fopen(name,"wb"); if(!fp) return -1; /*//给图像分配内存 RGB *bmp_data = NULL; if((bmp_data=(RGB*)malloc(size)) == NULL) { printf("申请内存失败!\n"); return -1; } //RGB赋值并写入文件中 int iLen = width * height; int iIndex = 0; for(int i= 0; i<iLen; i++) { bmp_data[i].red = data[iIndex]; iIndex++; bmp_data[i].green = data[iIndex]; iIndex++; bmp_data[i].blue = data[iIndex]; iIndex++; if(bmp_data[i].red < 0 || bmp_data[i].green < 0 || bmp_data[i].blue < 0) { return -110; } } for (int i=0;i<height;i++) //注意:JPG从左上角开始,往右往下;而BMP是从左下角开始,往右往上 { fwrite(&(bmp_data[i*width]),3,width,fp); if (FillZeroNum) fwrite(Zeros,sizeof(BYTE),4-FillZeroNum,fp); } fwrite( bmp_data, 3 , iLen, fp);*/ fwrite( &bfh, 1, sizeof(BMPFILEHEADER_T), fp); fwrite( &bih, 1, sizeof(BMPINFOHEADER_T), fp); fwrite( data, 1, size, fp); fclose( fp ); return 0; }