栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

#include
#include

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/744089.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号