C语言对256的bmp图像进行任意剪裁

 这个程序是我在别人的基础上修改的,还可以实现输出剪裁前和剪裁后的数据进入txt中,链接找不到了

#include<stdio.h>
#include<windows.h>

#define MYCUT_HEIGHT 100	//截取高度
#define MYCUT_WIDTH 100		//截取宽度
#define BEGIN_X 80			//截取位图开始位置X坐标
#define BEGIN_Y 80			//截取位图开始位置Y坐标

int main()
{
	int bmpHeight;
	int bmpWidth;
	unsigned char* pBmpBuf;
	unsigned char* pBmpBuf2;
	RGBQUAD* pColorTable;
	int biBitCount;

	//读取bmp文件
	FILE* fp = fopen("C:\\Users\\27681\\Desktop\\test\\cut\\lena.BMP", "rb");
	if (fp == 0)
		return 0;
	BITMAPFILEHEADER fileHead;
	fread(&fileHead, sizeof(BITMAPFILEHEADER), 1, fp);

	BITMAPINFOHEADER head;
	fread(&head, 40, 1, fp);
	bmpHeight = head.biHeight;
	bmpWidth = head.biWidth;
	biBitCount = head.biBitCount;

	pColorTable = new RGBQUAD[256];
	fread(pColorTable, sizeof(RGBQUAD), 256, fp);

	int LineByte = (bmpWidth * biBitCount / 8 + 3) / 4 * 4;//保证每一行字节数都为4的整数倍
	pBmpBuf = new unsigned char[LineByte * bmpHeight];
	fread(pBmpBuf, LineByte * bmpHeight, 1, fp);

	/*以下是获得裁剪前原图的数据并打印保存*/
	printf("以下是获得裁剪前原图的数据\n");
	FILE* fs = fopen("C:\\Users\\27681\\Desktop\\test\\cut\\获得裁剪前的数据.txt", "w");
	for (int i = 0; i < bmpHeight; i++)
	{
		for (int j = 0; j < bmpWidth; j++)
		{
			// 获取循环到像元的像素值
			unsigned char pixel = pBmpBuf[j + i * bmpWidth];
			// 这里打印一下读出的像元
			printf("%d ", pixel);
			// 保存到文件中
			fprintf(fs, "%d ", pixel);
		}
		// 打印一行后换行
		printf("\n");
		// 完成一行像素的保存后换行继续进行保存
		fprintf(fs, "\n");
	}
	fclose(fs);
	fclose(fp);
	
	FILE* fop = fopen("C:\\Users\\27681\\Desktop\\test\\cut\\lena1.BMP", "wb");
	head.biHeight = MYCUT_HEIGHT;//为截取文件重写位图高度
	head.biWidth = MYCUT_WIDTH;//为截取文件重写位图宽度
	int LineByte2 = (head.biWidth * biBitCount / 8 + 3) / 4 * 4;
	pBmpBuf2 = new unsigned char[LineByte * head.biHeight];
	head.biSizeImage = LineByte2 * head.biHeight;
	fileHead.bfSize = head.biSizeImage + fileHead.bfOffBits;

	fwrite(&fileHead, sizeof(BITMAPFILEHEADER), 1, fop);
	fwrite(&head, sizeof(BITMAPINFOHEADER), 1, fop);
	fwrite(pColorTable, sizeof(RGBQUAD), 256, fop);

	for (int i = 0; i < MYCUT_HEIGHT; ++i) {
		for (int j = 0; j < MYCUT_WIDTH; ++j)
		{
			
			pBmpBuf2[i * MYCUT_WIDTH + j] = pBmpBuf[(BEGIN_Y + i) * bmpWidth + BEGIN_X + j];
		}
	}
/*以下是获得裁剪后的数据并打印保存*/
	printf("以下是获得裁剪后的数据\n");
	FILE* lata = fopen("C:\\Users\\27681\\Desktop\\test\\cut\\获得裁剪后的数据.txt", "w");
for (int i = 0; i < MYCUT_HEIGHT; i++)
	{
		for (int j = 0; j < MYCUT_WIDTH; j++)
		{
			// 获取循环到像元的像素值
			unsigned char pixel = pBmpBuf2[j + i * MYCUT_WIDTH];
			// 这里打印一下读出的像元
			printf("%d ", pixel);
			// 保存到文件中
			fprintf(lata, "%d ", pixel);
		}
		// 打印一行后换行
		printf("\n");
		// 完成一行像素的保存后换行继续进行保存
		fprintf(lata, "\n");
	}
    fclose(lata);
	fwrite(pBmpBuf2, LineByte2 * head.biHeight, 1, fop);

	
	

	fclose(fop);

	system("pause");
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值