骰子作画

#include "Windows.h"  
#include "stdio.h"  
#include "string.h"  
#include "malloc.h"  
#include <iostream>
#include "time.h"
using namespace std;

unsigned char* pBmpBuf;//读入图像数据的指针  
int bmpWidth;//图像的宽  
int bmpHeight;//图像的高  
RGBQUAD* pColorTable;//颜色表指针  
int biBitCount;//图像类型,每像素位数  

//骰子图像:16*16二维数组
int touzi1[16][16] = { {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0, 255,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0, 255, 255, 255,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0, 255, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0, 255, 255, 255,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0, 255,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 } };

int touzi2[16][16] = { {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0, 255,   0,   0,   0,   0,   0,   0, 255,   0,   0,   0,   0 },
					   {    0,   0,   0, 255, 255, 255,   0,   0,   0,   0, 255, 255, 255,   0,   0,   0 },
					   {    0,   0, 255, 255, 255, 255, 255,   0,   0, 255, 255, 255, 255, 255,   0,   0 },
					   {    0,   0,   0, 255, 255, 255,   0,   0,   0,   0, 255, 255, 255,   0,   0,   0 },
					   {    0,   0,   0,   0, 255,   0,   0,   0,   0,   0,   0, 255,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 } };

int touzi3[16][16] = { {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0, 255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0, 255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0, 255, 255,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0, 255, 255,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 } };

int touzi4[16][16] = { {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0, 255,   0,   0,   0,   0,   0,   0, 255,   0,   0,   0,   0 },
					   {    0,   0,   0, 255, 255, 255,   0,   0,   0,   0, 255, 255, 255,   0,   0,   0 },
					   {    0,   0, 255, 255, 255, 255, 255,   0,   0, 255, 255, 255, 255, 255,   0,   0 },
					   {    0,   0,   0, 255, 255, 255,   0,   0,   0,   0, 255, 255, 255,   0,   0,   0 },
					   {    0,   0,   0,   0, 255,   0,   0,   0,   0,   0,   0, 255,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0, 255,   0,   0,   0,   0,   0,   0, 255,   0,   0,   0,   0 },
					   {    0,   0,   0, 255, 255, 255,   0,   0,   0,   0, 255, 255, 255,   0,   0,   0 },
					   {    0,   0, 255, 255, 255, 255, 255,   0,   0, 255, 255, 255, 255, 255,   0,   0 },
					   {    0,   0,   0, 255, 255, 255,   0,   0,   0,   0, 255, 255, 255,   0,   0,   0 },
					   {    0,   0,   0,   0, 255,   0,   0,   0,   0,   0,   0, 255,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 } };

int touzi5[16][16] = { {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0, 255, 255,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255,   0,   0 },
					   {    0, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255,   0 },
					   {    0, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255,   0 },
					   {    0,   0, 255, 255,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0, 255, 255,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0, 255, 255,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0, 255, 255,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255,   0,   0 },
					   {    0, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255,   0 },
					   {    0, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255,   0 },
					   {    0,   0, 255, 255,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 } };

int touzi6[16][16] = { {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0, 255, 255,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255,   0,   0 },
					   {    0, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255,   0 },
					   {    0, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255,   0 },
					   {    0,   0, 255, 255,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0, 255, 255,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255,   0,   0 },
					   {    0, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255,   0 },
					   {    0, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255,   0 },
					   {    0,   0, 255, 255,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 },
					   {    0,   0, 255, 255,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255,   0,   0 },
					   {    0, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255,   0 },
					   {    0, 255, 255, 255, 255,   0,   0,   0,   0,   0,   0, 255, 255, 255, 255,   0 },
					   {    0,   0, 255, 255,   0,   0,   0,   0,   0,   0,   0,   0, 255, 255,   0,   0 },
					   {    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 } };

//字符画数组
char asciiart[72] = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]? -_ +~<>i!lI;:,\"^`'. ";

bool readBmp(char* bmpName)
{

	//二进制读方式打开指定的图像文件  
	FILE* fp = fopen(bmpName, "rb");
	if (fp == 0) return 0;


	//跳过位图文件头结构BITMAPFILEHEADER  
	fseek(fp, sizeof(BITMAPFILEHEADER), 0);
	//定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中  
	BITMAPINFOHEADER head;
	fread(&head, sizeof(BITMAPINFOHEADER), 1, fp);
	//获取图像宽、高、每像素所占位数等信息  
	bmpWidth = head.biWidth;
	bmpHeight = head.biHeight;
	biBitCount = head.biBitCount;
	//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)  
	int lineByte = (bmpWidth * biBitCount / 8 + 3) / 4 * 4;
	//灰度图像有颜色表,且颜色表表项为256  
	if (biBitCount == 8) {
		//申请颜色表所需要的空间,读颜色表进内存  
		pColorTable = new RGBQUAD[256];
		fread(pColorTable, sizeof(RGBQUAD), 256, fp);
	}
	//申请位图数据所需要的空间,读位图数据进内存  
	pBmpBuf = new unsigned char[lineByte * bmpHeight];
	fread(pBmpBuf, 1, lineByte * bmpHeight, fp);
	//关闭文件  
	fclose(fp);
	return 1;
}

bool saveBmp(char* bmpName, unsigned char* imgBuf, int width, int height,
	int biBitCount, RGBQUAD* pColorTable)
{
	//如果位图数据指针为0,则没有数据传入,函数返回  
	if (!imgBuf)
		return 0;
	//颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0  
	int colorTablesize = 0;
	if (biBitCount == 8)
		colorTablesize = 1024;
	//待存储图像数据每行字节数为4的倍数  
	int lineByte = (width * biBitCount / 8 + 3) / 4 * 4;
	//以二进制写的方式打开文件  
	FILE* fp = fopen(bmpName, "wb");
	if (fp == 0) return 0;
	//申请位图文件头结构变量,填写文件头信息  
	BITMAPFILEHEADER fileHead;
	fileHead.bfType = 0x4D42;//bmp类型  
	//bfSize是图像文件4个组成部分之和  
	fileHead.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
		+ colorTablesize + lineByte * height;
	fileHead.bfReserved1 = 0;
	fileHead.bfReserved2 = 0;
	//bfOffBits是图像文件前3个部分所需空间之和  
	fileHead.bfOffBits = 54 + colorTablesize;
	//写文件头进文件  
	fwrite(&fileHead, sizeof(BITMAPFILEHEADER), 1, fp);
	//申请位图信息头结构变量,填写信息头信息  
	BITMAPINFOHEADER head;
	head.biBitCount = biBitCount;
	head.biClrImportant = 0;
	head.biClrUsed = 0;
	head.biCompression = 0;
	head.biHeight = height;
	head.biPlanes = 1;
	head.biSize = 40;
	head.biSizeImage = lineByte * height;
	head.biWidth = width;
	head.biXPelsPerMeter = 0;
	head.biYPelsPerMeter = 0;
	//写位图信息头进内存  
	fwrite(&head, sizeof(BITMAPINFOHEADER), 1, fp);
	//如果灰度图像,有颜色表,写入文件    
	if (biBitCount == 8)
		fwrite(pColorTable, sizeof(RGBQUAD), 256, fp);
	//写位图数据进文件  
	fwrite(imgBuf, height * lineByte, 1, fp);
	//关闭文件  
	fclose(fp);
	return 1;
}

int main()
{
	char inFileName[90] = "D:\\newpic.bmp";
	char outFileName[90] = "D:\\newpic3.bmp";
	//printf("请输入原始位图文件的文件名:");
	//scanf("%s", inFileName);
	//printf("请输入新位图文件的文件名:");
	//scanf("%s", outFileName);
	//读入指定BMP文件进内存  
	
	readBmp(inFileName);
	//输出图像的信息  
	printf("width=%d,height=%d, biBitCount=%d\n", bmpWidth, bmpHeight, biBitCount);

	//这里填写处理过程函数或代码

	int sum = 0;

	for (int I = 0; I < bmpWidth / 16; I++)

	{

		for (int j = 0; j < bmpHeight / 16; j++)

		{

			for (int k = 0; k < 16; k++)

			{

				for (int n = 0; n < 16; n++)

				{

					sum += (*(pBmpBuf + (I * 16 + k) * bmpHeight + k + j * 16 + n));

				}

			}

			int average = sum / 256;

			if (0 <= average && average <= 41)

			{

				for (int k = 0; k < 16; k++)

					for (int n = 0; n < 16; n++)

						pBmpBuf[(I * 16 + k) * bmpHeight + j * 16 + n] = touzi1[k][n];

			}

			if (41 < average && average <= 83)

			{

				for (int k = 0; k < 16; k++)

					for (int n = 0; n < 16; n++)

						pBmpBuf[(I * 16 + k) * bmpHeight + j * 16 + n] = touzi2[k][n];

			}

			if (83 <= average && average <= 124)

			{

				for (int k = 0; k < 16; k++)

					for (int n = 0; n < 16; n++)

						pBmpBuf[(I * 16 + k) * bmpHeight + j * 16 + n] = touzi3[k][n];

			}

			if (124 < average && average <= 165)

			{

				for (int k = 0; k < 16; k++)

					for (int n = 0; n < 16; n++)

						pBmpBuf[(I * 16 + k) * bmpHeight + j * 16 + n] = touzi4[k][n];

			}

			if (165 < average && average <= 206)

			{

				for (int k = 0; k < 16; k++)

					for (int n = 0; n < 16; n++)

						pBmpBuf[(I * 16 + k) * bmpHeight + j * 16 + n] = touzi5[k][n];

			}

			if (206 < average && average <= 256)

			{

				for (int k = 0; k < 16; k++)

					for (int n = 0; n < 16; n++)

						pBmpBuf[(I * 16 + k) * bmpHeight + j * 16 + n] = touzi6[k][n];

			}

			sum = 0;

		}

	}

	//将图像数据存盘  
	saveBmp(outFileName, pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);
	//清除缓冲区,pBmpBuf和pColorTable是全局变量,在文件读入时申请的空间  
	delete[]pBmpBuf;
	if (biBitCount == 8)
		delete[]pColorTable;
	return 0;
}

需要一张黑白图,和创建一张空白的bmp图片按下面方式创建,文件对应的路径和名称千万别打错在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值