C++ 二进制读入和Minist图片展示

二进制读入


二进制读入的方法有很多,这里我们使用fread函数进行读入(因为读取的是pixel,使用fread可以一次性读入)


Minist手写集与EasyX

MNIST 数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST). 训练集 (training set) 由来自 250 个不同人手写的数字构成, 其中 50% 是高中学生, 50% 来自人口普查局 (the Census Bureau) 的工作人员. 测试集(test set) 也是同样比例的手写数字数据


本文章讲的是利用EasyX将Minist手写集图片展示到前台


EasyX官网及下载地址
Minist数据集下载

基本思路

1.首先在Minist数据集中读入二进制数据,因为Minist数据集是经过灰度处理的图像,所以RGB三色全有1个pixel来表示
2.利用EasyX画方块的API进行绘图并填充RGB颜色

代码实现

read函数

byte* read(const char path[],int count)
{
	int cnt = count > MAX_READCOUNTS ? MAX_READCOUNTS : count;
	cnt *= BIT_WIDTH * BIT_HEIGHT;
	FILE* file = fopen(path, "rb");
	if (file == NULL)return NULL;
	fseek(file, 16, SEEK_SET);
	byte* data = new byte[cnt];
	fread(data, 1, cnt, file);	
	return data;
}

read函数第一个参数传入Minist数据集的地址,第二个传入读取的图片张数
为什么要移动16字节,下载后我们可以看到Minist的预览图
在这里插入图片描述
magic_number image_number rows columns分别占了16个字节
而rows和columns我们将使用宏进行定义


main函数

int main()
{
	int width = BIT_WIDTH * COLUMN_COUNT * RATIO;
	int height = BIT_HEIGHT * ROW_COUNT * RATIO;
	initgraph(width, height);
	byte* arr = read("你的图片地址",30);
	int position[] = { 0,0,RATIO,RATIO };
	int offset[] = { 0,0 };
	int base[] = { 0,0,RATIO,RATIO };
	for (int i = 0; i < BIT_COUNT; ++i)
	{
		solidrectangle(position[0], position[1], position[2], position[3]);
		setfillcolor(RGB(int(arr[i]), int(arr[i]), int(arr[i])));

		if (offset[0] >= BIT_WIDTH)
		{
			position[1] += OFFSET;
			position[3] += OFFSET;

			position[0] = base[0];
			position[2] = base[2];

			offset[0] = 0;
			offset[1]++;
		}
		if (offset[1] >= BIT_HEIGHT * ROW_COUNT)
		{
			base[0] += BIT_WIDTH * RATIO;
			base[2] += BIT_WIDTH * RATIO;

			position[0] = base[0];
			position[2] = base[2];
			position[1] = base[1];
			position[3] = base[3];

			offset[1] = 0;

		}

		position[0] += OFFSET;
		position[2] += OFFSET;
		offset[0]++;

	}
	_getch();
	
	delete[] arr;
	closegraph();
	return 0;

}

宏定义

#define _CRT_SECURE_NO_WARNINGS //如果你使用的是Visual Studio
#include <graphics.h>
#include <conio.h>
#include <stdio.h>

#define MAX_READCOUNTS 60000
#define BIT_WIDTH 28
#define BIT_HEIGHT 28   
#define ROW_COUNT 4   //数字行数量
#define COLUMN_COUNT 5   //数字列数量
#define RATIO 2  //放大倍数
#define OFFSET 1*RATIO
#define BIT_COUNT BIT_WIDTH*BIT_HEIGHT*ROW_COUNT*COLUMN_COUNT

ROW_COUNT 输出图片的每行的数量
COLUMN_COUNT 输出图片每列的数据
RATIO 图片放大的倍数
注意!read函数读入的数量不能低于ROW_COUNT*COLUMN_COUNT


效果图

在这里插入图片描述

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纸墨青鸢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值