现在的位置: 首页 > 综合 > 正文

Android底层jni中保存RGB565图片

2018年04月04日 ⁄ 综合 ⁄ 共 1623字 ⁄ 字号 评论关闭

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;
}

抱歉!评论已关闭.