提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
大学同学问:怎么求不规则图形面积?当时在想把一个图形看成一个一个点,这时候想到了像素,而刚好学过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,此方法可行。