Image 有可能知道一幅画在飘动中的亮度吗?

Image 有可能知道一幅画在飘动中的亮度吗?,image,flutter,dart,camera,brightness,Image,Flutter,Dart,Camera,Brightness,我正在构建一个内置摄像头的应用程序 在我拍完一张照片后,我想对它进行分析,以了解这张照片的亮度,如果它不好,我必须再拍一张照片 这是我现在的代码,这是我在Dart中找到并编写的javascript函数: 感谢@Abion47 编辑1 for(int i=0;i>16; int g=(像素&0x0000FF00)>>8; int r=(像素&0x000000FF); 平均值=((r+g+b)/3); colorSum+=平均值; } 亮度=(颜色总和/(宽度*高度)).floor(); } 亮度=

我正在构建一个内置摄像头的应用程序

在我拍完一张照片后,我想对它进行分析,以了解这张照片的亮度,如果它不好,我必须再拍一张照片

这是我现在的代码,这是我在Dart中找到并编写的javascript函数:

感谢@Abion47

编辑1
for(int i=0;i>16;
int g=(像素&0x0000FF00)>>8;
int r=(像素&0x000000FF);
平均值=((r+g+b)/3);
colorSum+=平均值;
}
亮度=(颜色总和/(宽度*高度)).floor();
}
亮度=(色和/(宽*高)).round();
//我试过使用其他代码
//亮度=(colorSum/pixels.length).round();
返回亮度;
但是白色的亮度比黑色的要低,数字有点奇怪

你知道一个更好的了解亮度的方法吗

解决方案: 在进一步的调查中,我们找到了解决方案,我们在进行图像解码时出错,但我们使用了图像函数来进行解码

这是我们的最终代码:

Image=decodeImage(file.readAsBytesSync());
var data=image.getBytes();
var-colorSum=0;
对于(变量x=0;x

希望它能对您有所帮助。

您的代码有几处错误

首先,由于试图访问一个不存在的像素,因此会出现范围错误。这可能是因为
宽度
和/或
高度
大于图像的实际宽度或高度。有很多方法可以尝试获取这些值,但对于这个应用程序来说,这其实并不重要,因为最终的结果是获得图像中所有像素的平均值,而不需要图像的宽度或高度

其次,通过将颜色值序列化为十六进制字符串,然后解析各个通道子字符串来获取颜色值。您的
子字符串将导致不正确的值,因为:

  • foo。子字符串(a,b)
    foo
    的子字符串从
    a
    取到
    b
    ,独占。这意味着
    a
    b
    是索引,而不是长度,结果字符串将不包括
    b
    处的字符。所以假设
    hex
    是“01234567”,当你做
    hex.substring(0,2)
    时,你得到“01”,然后你做
    hex.substring(3,5)
    你得到“34”,而
    hex.substring(6,8)
    得到“67”。您需要执行
    hex.substring(0,2)
    ,然后执行
    hex.substring(2,4)
    hex.substring(4,6)
    以获得前三个通道
  • 也就是说,您正在获取错误的通道。
    图像
    包以ABGR格式存储其像素值,这意味着十六进制字符串中的前两个字符将是alpha通道,这在计算图像亮度时并不重要。相反,您希望第二、第三和第四个通道分别用于蓝色、绿色和红色值
  • 尽管如此,当从整数颜色值检索通道数据的首选方法是对整数本身进行逐位操作时,无论如何,这是一种效率极低的方法。(除非绝对必要,否则切勿将数字转换为字符串,反之亦然。)
总之,你想要的可能是类似于以下的东西:

最终像素=image.data;
双色和=0;
对于(int i=0;i>16;
int g=(像素&0x0000FF00)>>8;
int r=(像素&0x000000FF);
平均值=(r+g+b)/3;
colorSum+=平均值;
}
返回colorSum/pixels.length;

图像对象的宽度和高度是多少?您是如何获取它们的?另外,通过将int转换为十六进制字符串,然后解析子字符串来检索颜色通道a)可能无法像您认为的那样工作,因为这些奇怪的子字符串范围,B)是一种极其缓慢的方法。我正在用和计算图片的高度。是的,我知道这不是最好的方法,但不幸的是,我没有找到更好的方法:(为什么?您正在使用
图像
软件包。
图像
对象已经具有
宽度
高度
属性。首先感谢您的回答。您的注释非常有用,现在我正在尝试您的代码,它工作正常,但亮度值不同,取决于照片分辨率。我的意思是,从android emulator(1280x720)可以看到0到3之间的值,但galaxy s10可以看到4到6之间的值,iPhone xr(3840x2160)从8到22。我还删除了rounds方法以查看原始值。@NicolasLucero如果不准确度随分辨率增大而增大,这可能表明存在舍入错误。我会说,是的,去掉所有舍入函数,将平均值视为浮点值。(我还错误地将其留在
colorSum/(width*height)中)
应该是
colorSum/pixels.length
,所以这可能也是原因之一。)现在所有设备中的数字都非常相似。但是这些数字很奇怪,当图片是完全白色时,我的数字比其他完全黑色时小。我会尝试解决它并发布解决方案。谢谢你