将0和1二值掩膜图像按位存储的c语言实现

//将1024*1024kb的二值mask转为1024*8kb的数组
//命令行输入参数:mask.raw 图像长度 图像宽度
#include<stdio.h>
#include<stdlib.h>
#include<string.h>


int main(int argc, char *argv[])
{
	FILE *fp = NULL;
	char cMask[400] = { 0 };
	int iWidth = 0, iHeight = 0;
	unsigned char *ucMaskData = NULL;
	unsigned char *ucNewMaskData = NULL;
	unsigned char *ucReMaskData = NULL;
	unsigned char ucTemp[8] = { 0 };
	int iCnt = 0;
	int iTemp = 0;
	int iInd = 0;
	int n = 0;

	//读入参数
	if (argc != 4)
	{
		printf("please input mask\n");
		getchar();
	}
	else
	{
		strcpy(cMask, argv[1]);
		iWidth = (int)atoi(argv[2]);
		iHeight = (int)atoi(argv[3]);
	}

	//读入mask数据
	if ((fp = fopen(cMask, "rb")) == NULL)
	{
		printf("输入mask文件无效\n");
		exit(0);
	}
	if ((ucMaskData = (unsigned char *)calloc(iWidth*iHeight, sizeof(char))) == NULL)
	{
		printf("申请内存空间失败\n");
		exit(0);
	}
	if ((ucNewMaskData = (unsigned char *)calloc(iWidth*iHeight / 8, sizeof(char))) == NULL)
	{
		printf("申请内存空间失败\n");
		exit(0);
	}
	memset(ucMaskData, 0, iWidth*iHeight);//初始化
	fread(ucMaskData, iWidth*iHeight, 1, fp);
	fclose(fp);
	fp = NULL;
	for (int i = 0; i < iWidth*iHeight; i++)
	{
		ucMaskData[i] = ucMaskData[i] / 255;
		//printf("%d\n", ucMaskData[i]);
	}

	//8个值为0或1的字节转为一个字节
	for (int i = 0; i < iWidth*iHeight; i += 8)
	{
		ucNewMaskData[iCnt++] = ucMaskData[i] * 1 + ucMaskData[i + 1] * 2 + ucMaskData[i + 2] * 4 + ucMaskData[i + 3] * 8 \
			+ ucMaskData[i + 4] * 16 + ucMaskData[i + 5] * 32 + ucMaskData[i + 6] * 64 + ucMaskData[i + 7] * 128;
	}


	if ((fp = fopen("newmask.raw", "wb")) == NULL)
	{
		printf("输入mask文件无效\n");
		exit(0);
	}

	fwrite(ucNewMaskData, iWidth*iHeight / 8, 1, fp);
	fclose(fp);
	fp = NULL;


	//从1024*128k的码流中恢复成1024*1024k的mask
	if ((ucReMaskData = (unsigned char *)calloc(iWidth*iHeight, sizeof(char))) == NULL)
	{
		printf("申请内存空间失败\n");
		exit(0);
	}
	memset(ucReMaskData, 0, iWidth*iHeight);//初始化
	iCnt = 0;
	for (int i = 0; i < iWidth*iHeight; i = i + 8)
	{
		n = 0;
		iTemp = ucNewMaskData[iCnt++];
		iInd = i;
		while (iTemp > 0)//十进制转二进制
		{
			ucTemp[n++] = iTemp % 2;
			iTemp = iTemp / 2;
		}
		//printf("%d\n", ucNewMaskData[iCnt - 1]);

		if (ucNewMaskData[iCnt - 1] != 0)
		{
			for (int j = 0; j < 8; j++)
			{
				ucReMaskData[iInd++] = ucTemp[j];
				ucTemp[j] = 0;
				//printf("%d", ucTemp[j]);
			}
		}
		else
		{
			ucReMaskData[iInd++] = 0;
		}

		//getchar();

	}
	for (int i = 0; i < iWidth*iHeight; i++)
	{
		ucReMaskData[i] = ucReMaskData[i] * 255;
		//printf("%d\n", ucReMaskData[i]);
	}



	if ((fp = fopen("remask.raw", "wb")) == NULL)
	{
		printf("输入mask文件无效\n");
		exit(0);
	}

	fwrite(ucReMaskData, iWidth*iHeight, 1, fp);
	fclose(fp);
	fp = NULL;

	free(ucReMaskData);
	ucReMaskData = NULL;
	free(ucMaskData);
	ucMaskData = NULL;
	free(ucNewMaskData);
	ucNewMaskData = NULL;
	return 0;

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值