骰子作画-----自己选定一幅灰度图像,将其转换为骰子图形组成的画。

#include "Windows.h"  
#include "stdio.h"  
#include "string.h"  
#include "malloc.h"  
#include <iostream>
#include "time.h"
#pragma warning(suppress : 4996)
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:\\OneDrive\\桌面\\数据结构\\骰子图像\\sss.bmp";
	char outFileName[90] = "D:\\OneDrive\\桌面\\数据结构\\骰子图像\\shui3.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;
}

自己选定一幅灰度图像,将其转换为骰子图形组成的画。

imageprocess.cpp中提供了读写bmp灰度图像的代码,用readBmp读图像,图像数据存在pBmpBuf(一维)中,值的范围为0-255,找到图像二维数据和一维数组之间的对应关系,将图像分为16*16大小的块,计算每块数据的平均值,转换至对应[1,6]的值,将对应的骰子图像数据(touzi1-touzi6 6个数组)替换原有图像数据,用saveBmp函数将图像数组中的数据写入新图像文件。大家也可以尝试字符画,使用的字符可以参考asciiart数组,从0开始,从密至疏排列,可将对应的图像数据转换为对应的字符,在屏幕上输出或者写入到txt文件中。

**注意:需要事先将图像在相关图像处理(画图、photoshop等)软件中转换为256色bmp图像。

        替换图像是16*16大小的,所以要考虑到不是16整数倍的情况。

        bmp图像存储时,每一行的字节数是4的整数倍,不足4的倍数用0补足,所以循环时不能直接用宽度。

        默认bmp位图数据存储是相反的,即上面的图像数据存储在数据末端。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值