通过像素点计算不规则图形面积

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

大学同学问:怎么求不规则图形面积?当时在想把一个图形看成一个一个点,这时候想到了像素,而刚好学过BMP图片格式,我虽然不知道不规则图形的面积,但我可以把不规则图形有多少像素点计算出来,而不规则图形有刚好能和它相切的矩形,那我只需要知道这个矩形的面积和矩形的像素点不就知道了这个不规则图形的面积了吗。
不规则面积 = (不规则像素点/矩形像素点)* 矩形面积
提示:以下是本篇文章正文内容,下面案例可供参考

一、BMP图片格式

最常见的BMP图片是24位的,本文也是按照24位来计算的。
BMP图片由54字节头信息和数据信息组成,本文主要用的是头信息里面的像素宽(由于图片信息的特殊性,想要一次读取一行,我能想到的是用fread一次读取像素宽这么多字节的数据)。
这是一张BMP图片的内容,这里00 00 01 01就是它的像素宽,也就是257,而一个像素点占了三个字节(三原色BGR),那么这里一行所需的字节就是257*3 = 771,但是如果把数组设置为771会出错,不能完整的读取一行。
为了提升读取速率,BMP存储时一行的字节数都是以4的整数,所以用来存储一行数据的数组还需要计算 size = (24 * width + 31) / 32 * 4。 width是像素宽也就是这里的257,带入进去size = (24 * 257 + 31)/ 32 * 4 = 193.72 * 4 = 772 (193.72要向下取整,即193)。
这里注意一下需要计算的图片应该把要计算的图形填充成三原色都有的颜色,其他区域为ff ff ff白色

在这里插入图片描述在这里插入图片描述

二、代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
	FILE *fr, *fw;
	unsigned char head_message[54] = {0};
	int x = 0, y = 0, len;
	float l = 0, w = 0;
	float sum = 0;
	int i = 0, n = 0, max_x = 0, max_y = 0, min_x = 9999, min_y = 9999, int_x = 0;
	float s = 0;

	printf("请输入长和宽:");
	scanf("%f %f", &l, &w);

	fr = fopen("1.bmp", "rb");

	fread(head_message, sizeof(char), 54, fr);

	x += head_message[18];
	x += 256 * head_message[19];
	x += 65536 * head_message[20];
	x += 16777216 * head_message[21];
	y += head_message[22];
	y += 256 * head_message[23];
	y += 65536 * head_message[24];
	y += 16777216 * head_message[25];

	printf("图片像素宽 %d   图片像素高 %d\n", x, y);
	len = (((24 * x) + 31) / 32) * 4;
	printf("一行长度 %d\n", len);

	char *data;
	data = (char *)malloc(len);	

	while ((n= fread(data, sizeof(char), len, fr)) > 0)
	{
		i++;
		for (int j = 0; j < n; ++j)
		{
			if ((data[j] != 0x0) && (data[j] != -1))     //除了纯白和纯黑
			{
				if (i < min_y)
				{
					min_y = i;
				}
				if (j < min_x)
				{
					min_x = j;
				}
				if (i > max_y)
				{
					max_y = i;
				}
				if (j > max_x)
				{
					max_x = j;
				}
				sum++;
			}
		}
	}
	
	s = sum / ((max_x - min_x + 1) * (max_y - min_y + 1));
	printf("面积 %f\n", s * l * w);

	fclose(fr);
	return  0;
}

运行结果

root@dcs-c440b22b-0:/workspace/CProject3# ./a.out 
请输入长和宽:4 4
图片像素宽 257   图片像素高 256
一行长度 772
面积 12.588088
root@dcs-c440b22b-0:/workspace/CProject3# 

测试就用的一个圆来测试,下图是原图,假设它的直径是4,这里长和宽都应该填4,最后计算出来面积是12.59,通过圆面积公式s = 3.14 * 2^2 = 12.56,此方法可行。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值