#706 fixed histogram byte count, aligned luminance formula

This commit is contained in:
Thibault Deckers 2024-01-23 00:13:07 +01:00
parent da38e4a4ed
commit 2e13879d77
2 changed files with 12 additions and 11 deletions

View file

@ -6,6 +6,7 @@ All notable changes to this project will be documented in this file.
### Added ### Added
- Viewer: optional histogram (for real this time)
- Collection: allow hiding thumbnail overlay HDR icon - Collection: allow hiding thumbnail overlay HDR icon
- Collection: allow setting any filtered collection as home page - Collection: allow setting any filtered collection as home page

View file

@ -42,16 +42,13 @@ mixin HistogramMixin {
final blueLevels = List.filled(bins, 0); final blueLevels = List.filled(bins, 0);
final view = Uint8List.view(data.buffer); final view = Uint8List.view(data.buffer);
final pixelCount = view.length / 4; final viewSize = view.length;
for (var i = 0; i < pixelCount; i += 4) { for (var i = 0; i < viewSize; i += 4) {
final a = view[i + 3]; final a = view[i + 3];
if (a > 0) { if (a > 0) {
final r = view[i + 0]; redLevels[view[i + 0]]++;
final g = view[i + 1]; greenLevels[view[i + 1]]++;
final b = view[i + 2]; blueLevels[view[i + 2]]++;
redLevels[r]++;
greenLevels[g]++;
blueLevels[b]++;
} }
} }
@ -75,14 +72,17 @@ mixin HistogramMixin {
const normMax = bins - 1; const normMax = bins - 1;
final view = Uint8List.view(data.buffer); final view = Uint8List.view(data.buffer);
final pixelCount = view.length / 4; final viewSize = view.length;
for (var i = 0; i < pixelCount; i += 4) { for (var i = 0; i < viewSize; i += 4) {
final a = view[i + 3]; final a = view[i + 3];
if (a > 0) { if (a > 0) {
final r = view[i + 0]; final r = view[i + 0];
final g = view[i + 1]; final g = view[i + 1];
final b = view[i + 2]; final b = view[i + 2];
lumLevels[(Color.fromARGB(a, r, g, b).computeLuminance() * normMax).round()]++; // `Color.computeLuminance()` is more accurate, but slower
// and photo software typically use the simpler formula
final luminance = (r * 0.3 + g * 0.59 + b * 0.11) / 255;
lumLevels[(luminance * normMax).round()]++;
} }
} }