Official GranTracker Thread

GranTracker v1.5.5 has just been released.

Get it here: https://www.grantracker.com/downloads.html

Major Bug Fix

Please install this version immediately, or at least before you import any more races.

The last version introduced a bug which caused DR Percentages to be wrong, when scanning a Profile Screenshot. So any races you imported with version 1.5.4 have the wrong DR Percentage.

See the rest of the version notes for information on how to adjust any races that were affected by this bug. https://www.grantracker.com/downloads.html
 
Last edited:
That was quick, thank you! I'll test it later. Did the fix also address that historically it was recording by 1 pixel off as well?
Unfortunately, you’re stuck with those wrong percentages.
Or if users are technically proficient they can manually open the json in the users folder and add 9 to the DR percentage points for the affected races (with GranTracker closed of course).
 
Or if users are technically proficient they can manually open the json in the users folder and add 9 to the DR percentage points for the affected races (with GranTracker closed of course).
Actually, you can do it right in the app. Double-click to edit the race, and change the DR Percent value. The problem is that it's not necessarily 9 points. Mine was only 7.5 points when I imported a new screenshot (without doing another race). So it's basically an educated guess. But I'll update the notes to indicate that's a possibility.
 
That was you? I wondered what happened. Thanks for that by the way, because you caused a massive traffic jam which gave me a 4 second lead through most of the race. First win at Spa this week, and it's all thanks to you! 😂
haha consider it my contribution to GranTracker. Congrats on the win, the upside to that (and the other race when it disconnected at the end of the penultimate lap and I got DQed) was that I got a few more pole positions and race wins to pad my stats as I almost surely would have been bumped up to A lobbies if that hadn't happened.
 
haha consider it my contribution to GranTracker. Congrats on the win, the upside to that (and the other race when it disconnected at the end of the penultimate lap and I got DQed) was that I got a few more pole positions and race wins to pad my stats as I almost surely would have been bumped up to A lobbies if that hadn't happened.
Do you have a Fanatec wheel? I started getting random disconnects, one of which killed a race, and I ended up having to re-seat the wheel axle as it had drifted and disconnected it's internal USB C port (really dumb design on Fanatec's part there..)
 
Do you have a Fanatec wheel? I started getting random disconnects, one of which killed a race, and I ended up having to re-seat the wheel axle as it had drifted and disconnected it's internal USB C port (really dumb design on Fanatec's part there..)
Yep, that is exactly what happened. Took me a minute to figure it out because it was kind of intermittent at first. FFB went and came back, couldn't shift properly at times. After the second race when it went out and didn't come back I figured out that was what it was. Thanks for checking.
 

GranTracker v1.5.5 has just been released.

Get it here: https://www.grantracker.com/downloads.html

Major Bug Fix

Please install this version immediately, or at least before you import any more races.

The last version introduced a bug which caused DR Percentages to be wrong, when scanning a Profile Screenshot. So any races you imported with version 1.5.4 have the wrong DR Percentage.

See the rest of the version notes for information on how to adjust any races that were affected by this bug. https://www.grantracker.com/downloads.html
Gee I failed my job as a tester :( O well back to retirement
 

GranTracker v1.5.5 has just been released.

Get it here: https://www.grantracker.com/downloads.html

Major Bug Fix

Please install this version immediately, or at least before you import any more races.

The last version introduced a bug which caused DR Percentages to be wrong, when scanning a Profile Screenshot. So any races you imported with version 1.5.4 have the wrong DR Percentage.

See the rest of the version notes for information on how to adjust any races that were affected by this bug. https://www.grantracker.com/downloads.html
I just uploaded new races. The DR calculation is still off my one pixel. When I manually inspect the capture I get 54 lit pixels in the bar but the import in GranTracker records 53% so it is off my 1 on the low side. It is the same with others. It is always low by 1%.
 
Gee I failed my job as a tester :( O well back to retirement
Since you weren't getting paid to be a tester, you're forgiven. :lol:
I just uploaded new races. The DR calculation is still off my one pixel. When I manually inspect the capture I get 54 lit pixels in the bar but the import in GranTracker records 53% so it is off my 1 on the low side. It is the same with others. It is always low by 1%.
You may be right, so let me tell you what I'm doing, and see if you think I'm wrong, or there's a better way.

(FYI: The final percent is rounded to the nearest .25, because otherwise it just looked silly. I don't remember when I changed this, so earlier versions of the program won't have this rounding.)

The easiest way to find the log information I'm about to talk about is to open the Logs folder (there's a link to it under the Help menu), and delete the file "debuglog.txt". Then import a screenshot.

There'll be a file called "pctbar.png" which is what I'm using to scan for the percentage. Open the the file "debuglog.txt". Look around until you find where you imported the race (FYI, the log file gets rewritten each day). You should find something like this:

Code:
2023-08-28 15:46:15.685 imag detail start: 12, end: 145, y: 17
2023-08-28 15:46:15.686 imag detail pixelColor(12, 17).hsl.l: 67.5}; set progBarStart to 12
2023-08-28 15:46:15.686 imag detail pixelColor(13, 17).hsl.l: 73.3}
2023-08-28 15:46:15.686 imag detail pixelColor(14, 17).hsl.l: 76.9}
2023-08-28 15:46:15.686 imag detail pixelColor(15, 17).hsl.l: 78.8}
2023-08-28 15:46:15.686 imag detail pixelColor(16, 17).hsl.l: 79.6}
2023-08-28 15:46:15.686 imag detail pixelColor(17, 17).hsl.l: 79.2}
2023-08-28 15:46:15.686 imag detail pixelColor(18, 17).hsl.l: 79.2}
2023-08-28 15:46:15.686 imag detail pixelColor(19, 17).hsl.l: 79.2}
2023-08-28 15:46:15.686 imag detail pixelColor(20, 17).hsl.l: 78.8}
2023-08-28 15:46:15.686 imag detail pixelColor(21, 17).hsl.l: 79.6}
2023-08-28 15:46:15.686 imag detail pixelColor(22, 17).hsl.l: 79.2}
2023-08-28 15:46:15.686 imag detail pixelColor(23, 17).hsl.l: 79.2}
2023-08-28 15:46:15.686 imag detail pixelColor(24, 17).hsl.l: 79.2}
2023-08-28 15:46:15.687 imag detail pixelColor(25, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(26, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(27, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(28, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(29, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(30, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(31, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(32, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(33, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(34, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(35, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(36, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(37, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(38, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(39, 17).hsl.l: 79.2}
2023-08-28 15:46:15.688 imag detail pixelColor(40, 17).hsl.l: 79.2}
2023-08-28 15:46:15.688 imag detail pixelColor(41, 17).hsl.l: 79.2}
2023-08-28 15:46:15.688 imag detail pixelColor(42, 17).hsl.l: 79.2}
2023-08-28 15:46:15.688 imag detail pixelColor(43, 17).hsl.l: 79.2}
2023-08-28 15:46:15.688 imag detail pixelColor(44, 17).hsl.l: 79.2}
2023-08-28 15:46:15.688 imag detail pixelColor(45, 17).hsl.l: 78.8}
2023-08-28 15:46:15.688 imag detail pixelColor(46, 17).hsl.l: 78.8}
2023-08-28 15:46:15.688 imag detail pixelColor(47, 17).hsl.l: 78.4}
2023-08-28 15:46:15.688 imag detail pixelColor(48, 17).hsl.l: 78.4}
2023-08-28 15:46:15.688 imag detail pixelColor(49, 17).hsl.l: 78.4}
2023-08-28 15:46:15.688 imag detail pixelColor(50, 17).hsl.l: 78.4}
2023-08-28 15:46:15.688 imag detail pixelColor(51, 17).hsl.l: 78.4}
2023-08-28 15:46:15.688 imag detail pixelColor(52, 17).hsl.l: 78.4}
2023-08-28 15:46:15.689 imag detail pixelColor(53, 17).hsl.l: 78.4}
2023-08-28 15:46:15.689 imag detail pixelColor(54, 17).hsl.l: 78.8}
2023-08-28 15:46:15.689 imag detail pixelColor(55, 17).hsl.l: 78.8}
2023-08-28 15:46:15.689 imag detail pixelColor(56, 17).hsl.l: 78.8}
2023-08-28 15:46:15.689 imag detail pixelColor(57, 17).hsl.l: 78.4}
2023-08-28 15:46:15.689 imag detail pixelColor(58, 17).hsl.l: 78.4}
2023-08-28 15:46:15.689 imag detail pixelColor(59, 17).hsl.l: 78.4}
2023-08-28 15:46:15.689 imag detail pixelColor(60, 17).hsl.l: 78.4}
2023-08-28 15:46:15.689 imag detail pixelColor(61, 17).hsl.l: 78.4}
2023-08-28 15:46:15.689 imag detail pixelColor(62, 17).hsl.l: 78.8}
2023-08-28 15:46:15.689 imag detail pixelColor(63, 17).hsl.l: 78.8}
2023-08-28 15:46:15.689 imag detail pixelColor(64, 17).hsl.l: 78.8}
2023-08-28 15:46:15.689 imag detail pixelColor(65, 17).hsl.l: 78.8}
2023-08-28 15:46:15.691 imag detail pixelColor(66, 17).hsl.l: 78.8}
2023-08-28 15:46:15.691 imag detail pixelColor(67, 17).hsl.l: 78.8}
2023-08-28 15:46:15.691 imag detail pixelColor(68, 17).hsl.l: 78.8}
2023-08-28 15:46:15.691 imag detail pixelColor(69, 17).hsl.l: 78.8}
2023-08-28 15:46:15.692 imag detail pixelColor(70, 17).hsl.l: 78.4}
2023-08-28 15:46:15.692 imag detail pixelColor(71, 17).hsl.l: 78.4}
2023-08-28 15:46:15.692 imag detail pixelColor(72, 17).hsl.l: 78.4}
2023-08-28 15:46:15.692 imag detail pixelColor(73, 17).hsl.l: 78.4}
2023-08-28 15:46:15.692 imag detail pixelColor(74, 17).hsl.l: 78.4}
2023-08-28 15:46:15.692 imag detail pixelColor(75, 17).hsl.l: 78.4}
2023-08-28 15:46:15.692 imag detail pixelColor(76, 17).hsl.l: 78.4}
2023-08-28 15:46:15.692 imag detail pixelColor(77, 17).hsl.l: 78.4}
2023-08-28 15:46:15.692 imag detail pixelColor(78, 17).hsl.l: 78.8}
2023-08-28 15:46:15.692 imag detail pixelColor(79, 17).hsl.l: 78.8}
2023-08-28 15:46:15.692 imag detail pixelColor(80, 17).hsl.l: 78.8}
2023-08-28 15:46:15.692 imag detail pixelColor(81, 17).hsl.l: 78.8}
2023-08-28 15:46:15.692 imag detail pixelColor(82, 17).hsl.l: 79.2}
2023-08-28 15:46:15.692 imag detail pixelColor(83, 17).hsl.l: 79.2}
2023-08-28 15:46:15.692 imag detail pixelColor(84, 17).hsl.l: 79.2}
2023-08-28 15:46:15.693 imag detail pixelColor(85, 17).hsl.l: 79.2}
2023-08-28 15:46:15.693 imag detail pixelColor(86, 17).hsl.l: 79.2}
2023-08-28 15:46:15.693 imag detail pixelColor(87, 17).hsl.l: 79.2}
2023-08-28 15:46:15.693 imag detail pixelColor(88, 17).hsl.l: 79.2}
2023-08-28 15:46:15.693 imag detail pixelColor(89, 17).hsl.l: 78.8}
2023-08-28 15:46:15.693 imag detail pixelColor(90, 17).hsl.l: 78.8}
2023-08-28 15:46:15.693 imag detail pixelColor(91, 17).hsl.l: 78.8}
2023-08-28 15:46:15.693 imag detail pixelColor(92, 17).hsl.l: 78.8}
2023-08-28 15:46:15.693 imag detail pixelColor(93, 17).hsl.l: 78.4}
2023-08-28 15:46:15.693 imag detail pixelColor(94, 17).hsl.l: 78.4}
2023-08-28 15:46:15.693 imag detail pixelColor(95, 17).hsl.l: 78.4}
2023-08-28 15:46:15.693 imag detail pixelColor(96, 17).hsl.l: 78.4}
2023-08-28 15:46:15.693 imag detail pixelColor(97, 17).hsl.l: 78.4}
2023-08-28 15:46:15.693 imag detail pixelColor(98, 17).hsl.l: 78.4}
2023-08-28 15:46:15.693 imag detail pixelColor(99, 17).hsl.l: 78.4}
2023-08-28 15:46:15.693 imag detail pixelColor(100, 17).hsl.l: 78.4}
2023-08-28 15:46:15.694 imag detail pixelColor(101, 17).hsl.l: 78.4}
2023-08-28 15:46:15.694 imag detail pixelColor(102, 17).hsl.l: 78.8}
2023-08-28 15:46:15.694 imag detail pixelColor(103, 17).hsl.l: 78.8}
2023-08-28 15:46:15.694 imag detail pixelColor(104, 17).hsl.l: 78.8}
2023-08-28 15:46:15.694 imag detail pixelColor(105, 17).hsl.l: 78.8}
2023-08-28 15:46:15.694 imag detail pixelColor(106, 17).hsl.l: 79.2}
2023-08-28 15:46:15.694 imag detail pixelColor(107, 17).hsl.l: 79.2}
2023-08-28 15:46:15.694 imag detail pixelColor(108, 17).hsl.l: 79.6}
2023-08-28 15:46:15.694 imag detail pixelColor(109, 17).hsl.l: 79.6}
2023-08-28 15:46:15.694 imag detail pixelColor(110, 17).hsl.l: 80.8}
2023-08-28 15:46:15.694 imag detail pixelColor(111, 17).hsl.l: 79.6}
2023-08-28 15:46:15.694 imag detail pixelColor(112, 17).hsl.l: 68.2}
2023-08-28 15:46:15.694 imag detail pixelColor(113, 17).hsl.l: 57.3}; set progBarEnd to 113
2023-08-28 15:46:15.694 imag detail pixelColor(114, 17).hsl.l: 47.1}
2023-08-28 15:46:15.694 imag detail pixelColor(115, 17).hsl.l: 38.8}
2023-08-28 15:46:15.694 imag detail pixelColor(116, 17).hsl.l: 30.2}
2023-08-28 15:46:15.695 imag detail pixelColor(117, 17).hsl.l: 29.4}
2023-08-28 15:46:15.695 imag detail pixelColor(118, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(119, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(120, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(121, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(122, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(123, 17).hsl.l: 31}
2023-08-28 15:46:15.695 imag detail pixelColor(124, 17).hsl.l: 31}
2023-08-28 15:46:15.695 imag detail pixelColor(125, 17).hsl.l: 31}
2023-08-28 15:46:15.695 imag detail pixelColor(126, 17).hsl.l: 31}
2023-08-28 15:46:15.695 imag detail pixelColor(127, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(128, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(129, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(130, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(131, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(132, 17).hsl.l: 31.4}
2023-08-28 15:46:15.696 imag detail pixelColor(133, 17).hsl.l: 31.4}
2023-08-28 15:46:15.696 imag detail pixelColor(134, 17).hsl.l: 31}
2023-08-28 15:46:15.696 imag detail pixelColor(135, 17).hsl.l: 31}
2023-08-28 15:46:15.696 imag detail pixelColor(136, 17).hsl.l: 31}
2023-08-28 15:46:15.696 imag detail pixelColor(137, 17).hsl.l: 31}
2023-08-28 15:46:15.696 imag detail pixelColor(138, 17).hsl.l: 31}
2023-08-28 15:46:15.696 imag detail pixelColor(139, 17).hsl.l: 31}
2023-08-28 15:46:15.696 imag detail pixelColor(140, 17).hsl.l: 31}
2023-08-28 15:46:15.696 imag detail pixelColor(141, 17).hsl.l: 31}
2023-08-28 15:46:15.696 imag detail pixelColor(142, 17).hsl.l: 30.2}
2023-08-28 15:46:15.696 imag detail pixelColor(143, 17).hsl.l: 28.6}
2023-08-28 15:46:15.696 imag detail pixelColor(144, 17).hsl.l: 22.4}
2023-08-28 15:46:15.696 imag detail Start: 12, End: 113
2023-08-28 15:46:15.696 imag detail pct: 76.00

I'm using the "L" value (lightness) from the pixel's HSL. I'm looking for the value to drop below 60, which is an arbitrary number that seemed to work the best, especially if the screenshot is 1920x1080. Also there's feathering to take into account, as the color doesn't go immediately from white to black (or whatever).

And remember that the progress bar image has a border that doesn't count towards the overall size of the bar itself.

Also, it's possible the image may not be 4k - it could be 1920x1080, as I mentioned earlier. So I have to take that into account. Resize a screenshot to 1920x1080, and look at the log to see what I mean.

So, spend some time looking at this and let me know if you think my logic is wrong anywhere. It's quite possible it may just come down to a matter of opinion as to which pixel to consider the end of the bar.

And in any case, as long as the number is consistent, it's actually irrelevant because we're just interpreting a progress bar that is interpreting a number by using pixels, so the chances of it being exact are pretty much null.

But still, it's totally worth talking about, especially for geeks like us. :)

Oh, and the maximum pct my code will ever return is "99.90", which obviously isn't rounded to the nearest .25. I don't know if that ever happens, though - it's just a "boundary condition" safeguard.
 
Since you weren't getting paid to be a tester, you're forgiven. :lol:

You may be right, so let me tell you what I'm doing, and see if you think I'm wrong, or there's a better way.

(FYI: The final percent is rounded to the nearest .25, because otherwise it just looked silly. I don't remember when I changed this, so earlier versions of the program won't have this rounding.)

The easiest way to find the log information I'm about to talk about is to open the Logs folder (there's a link to it under the Help menu), and delete the file "debuglog.txt". Then import a screenshot.

There'll be a file called "pctbar.png" which is what I'm using to scan for the percentage. Open the the file "debuglog.txt". Look around until you find where you imported the race (FYI, the log file gets rewritten each day). You should find something like this:

Code:
2023-08-28 15:46:15.685 imag detail start: 12, end: 145, y: 17
2023-08-28 15:46:15.686 imag detail pixelColor(12, 17).hsl.l: 67.5}; set progBarStart to 12
2023-08-28 15:46:15.686 imag detail pixelColor(13, 17).hsl.l: 73.3}
2023-08-28 15:46:15.686 imag detail pixelColor(14, 17).hsl.l: 76.9}
2023-08-28 15:46:15.686 imag detail pixelColor(15, 17).hsl.l: 78.8}
2023-08-28 15:46:15.686 imag detail pixelColor(16, 17).hsl.l: 79.6}
2023-08-28 15:46:15.686 imag detail pixelColor(17, 17).hsl.l: 79.2}
2023-08-28 15:46:15.686 imag detail pixelColor(18, 17).hsl.l: 79.2}
2023-08-28 15:46:15.686 imag detail pixelColor(19, 17).hsl.l: 79.2}
2023-08-28 15:46:15.686 imag detail pixelColor(20, 17).hsl.l: 78.8}
2023-08-28 15:46:15.686 imag detail pixelColor(21, 17).hsl.l: 79.6}
2023-08-28 15:46:15.686 imag detail pixelColor(22, 17).hsl.l: 79.2}
2023-08-28 15:46:15.686 imag detail pixelColor(23, 17).hsl.l: 79.2}
2023-08-28 15:46:15.686 imag detail pixelColor(24, 17).hsl.l: 79.2}
2023-08-28 15:46:15.687 imag detail pixelColor(25, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(26, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(27, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(28, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(29, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(30, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(31, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(32, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(33, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(34, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(35, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(36, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(37, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(38, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(39, 17).hsl.l: 79.2}
2023-08-28 15:46:15.688 imag detail pixelColor(40, 17).hsl.l: 79.2}
2023-08-28 15:46:15.688 imag detail pixelColor(41, 17).hsl.l: 79.2}
2023-08-28 15:46:15.688 imag detail pixelColor(42, 17).hsl.l: 79.2}
2023-08-28 15:46:15.688 imag detail pixelColor(43, 17).hsl.l: 79.2}
2023-08-28 15:46:15.688 imag detail pixelColor(44, 17).hsl.l: 79.2}
2023-08-28 15:46:15.688 imag detail pixelColor(45, 17).hsl.l: 78.8}
2023-08-28 15:46:15.688 imag detail pixelColor(46, 17).hsl.l: 78.8}
2023-08-28 15:46:15.688 imag detail pixelColor(47, 17).hsl.l: 78.4}
2023-08-28 15:46:15.688 imag detail pixelColor(48, 17).hsl.l: 78.4}
2023-08-28 15:46:15.688 imag detail pixelColor(49, 17).hsl.l: 78.4}
2023-08-28 15:46:15.688 imag detail pixelColor(50, 17).hsl.l: 78.4}
2023-08-28 15:46:15.688 imag detail pixelColor(51, 17).hsl.l: 78.4}
2023-08-28 15:46:15.688 imag detail pixelColor(52, 17).hsl.l: 78.4}
2023-08-28 15:46:15.689 imag detail pixelColor(53, 17).hsl.l: 78.4}
2023-08-28 15:46:15.689 imag detail pixelColor(54, 17).hsl.l: 78.8}
2023-08-28 15:46:15.689 imag detail pixelColor(55, 17).hsl.l: 78.8}
2023-08-28 15:46:15.689 imag detail pixelColor(56, 17).hsl.l: 78.8}
2023-08-28 15:46:15.689 imag detail pixelColor(57, 17).hsl.l: 78.4}
2023-08-28 15:46:15.689 imag detail pixelColor(58, 17).hsl.l: 78.4}
2023-08-28 15:46:15.689 imag detail pixelColor(59, 17).hsl.l: 78.4}
2023-08-28 15:46:15.689 imag detail pixelColor(60, 17).hsl.l: 78.4}
2023-08-28 15:46:15.689 imag detail pixelColor(61, 17).hsl.l: 78.4}
2023-08-28 15:46:15.689 imag detail pixelColor(62, 17).hsl.l: 78.8}
2023-08-28 15:46:15.689 imag detail pixelColor(63, 17).hsl.l: 78.8}
2023-08-28 15:46:15.689 imag detail pixelColor(64, 17).hsl.l: 78.8}
2023-08-28 15:46:15.689 imag detail pixelColor(65, 17).hsl.l: 78.8}
2023-08-28 15:46:15.691 imag detail pixelColor(66, 17).hsl.l: 78.8}
2023-08-28 15:46:15.691 imag detail pixelColor(67, 17).hsl.l: 78.8}
2023-08-28 15:46:15.691 imag detail pixelColor(68, 17).hsl.l: 78.8}
2023-08-28 15:46:15.691 imag detail pixelColor(69, 17).hsl.l: 78.8}
2023-08-28 15:46:15.692 imag detail pixelColor(70, 17).hsl.l: 78.4}
2023-08-28 15:46:15.692 imag detail pixelColor(71, 17).hsl.l: 78.4}
2023-08-28 15:46:15.692 imag detail pixelColor(72, 17).hsl.l: 78.4}
2023-08-28 15:46:15.692 imag detail pixelColor(73, 17).hsl.l: 78.4}
2023-08-28 15:46:15.692 imag detail pixelColor(74, 17).hsl.l: 78.4}
2023-08-28 15:46:15.692 imag detail pixelColor(75, 17).hsl.l: 78.4}
2023-08-28 15:46:15.692 imag detail pixelColor(76, 17).hsl.l: 78.4}
2023-08-28 15:46:15.692 imag detail pixelColor(77, 17).hsl.l: 78.4}
2023-08-28 15:46:15.692 imag detail pixelColor(78, 17).hsl.l: 78.8}
2023-08-28 15:46:15.692 imag detail pixelColor(79, 17).hsl.l: 78.8}
2023-08-28 15:46:15.692 imag detail pixelColor(80, 17).hsl.l: 78.8}
2023-08-28 15:46:15.692 imag detail pixelColor(81, 17).hsl.l: 78.8}
2023-08-28 15:46:15.692 imag detail pixelColor(82, 17).hsl.l: 79.2}
2023-08-28 15:46:15.692 imag detail pixelColor(83, 17).hsl.l: 79.2}
2023-08-28 15:46:15.692 imag detail pixelColor(84, 17).hsl.l: 79.2}
2023-08-28 15:46:15.693 imag detail pixelColor(85, 17).hsl.l: 79.2}
2023-08-28 15:46:15.693 imag detail pixelColor(86, 17).hsl.l: 79.2}
2023-08-28 15:46:15.693 imag detail pixelColor(87, 17).hsl.l: 79.2}
2023-08-28 15:46:15.693 imag detail pixelColor(88, 17).hsl.l: 79.2}
2023-08-28 15:46:15.693 imag detail pixelColor(89, 17).hsl.l: 78.8}
2023-08-28 15:46:15.693 imag detail pixelColor(90, 17).hsl.l: 78.8}
2023-08-28 15:46:15.693 imag detail pixelColor(91, 17).hsl.l: 78.8}
2023-08-28 15:46:15.693 imag detail pixelColor(92, 17).hsl.l: 78.8}
2023-08-28 15:46:15.693 imag detail pixelColor(93, 17).hsl.l: 78.4}
2023-08-28 15:46:15.693 imag detail pixelColor(94, 17).hsl.l: 78.4}
2023-08-28 15:46:15.693 imag detail pixelColor(95, 17).hsl.l: 78.4}
2023-08-28 15:46:15.693 imag detail pixelColor(96, 17).hsl.l: 78.4}
2023-08-28 15:46:15.693 imag detail pixelColor(97, 17).hsl.l: 78.4}
2023-08-28 15:46:15.693 imag detail pixelColor(98, 17).hsl.l: 78.4}
2023-08-28 15:46:15.693 imag detail pixelColor(99, 17).hsl.l: 78.4}
2023-08-28 15:46:15.693 imag detail pixelColor(100, 17).hsl.l: 78.4}
2023-08-28 15:46:15.694 imag detail pixelColor(101, 17).hsl.l: 78.4}
2023-08-28 15:46:15.694 imag detail pixelColor(102, 17).hsl.l: 78.8}
2023-08-28 15:46:15.694 imag detail pixelColor(103, 17).hsl.l: 78.8}
2023-08-28 15:46:15.694 imag detail pixelColor(104, 17).hsl.l: 78.8}
2023-08-28 15:46:15.694 imag detail pixelColor(105, 17).hsl.l: 78.8}
2023-08-28 15:46:15.694 imag detail pixelColor(106, 17).hsl.l: 79.2}
2023-08-28 15:46:15.694 imag detail pixelColor(107, 17).hsl.l: 79.2}
2023-08-28 15:46:15.694 imag detail pixelColor(108, 17).hsl.l: 79.6}
2023-08-28 15:46:15.694 imag detail pixelColor(109, 17).hsl.l: 79.6}
2023-08-28 15:46:15.694 imag detail pixelColor(110, 17).hsl.l: 80.8}
2023-08-28 15:46:15.694 imag detail pixelColor(111, 17).hsl.l: 79.6}
2023-08-28 15:46:15.694 imag detail pixelColor(112, 17).hsl.l: 68.2}
2023-08-28 15:46:15.694 imag detail pixelColor(113, 17).hsl.l: 57.3}; set progBarEnd to 113
2023-08-28 15:46:15.694 imag detail pixelColor(114, 17).hsl.l: 47.1}
2023-08-28 15:46:15.694 imag detail pixelColor(115, 17).hsl.l: 38.8}
2023-08-28 15:46:15.694 imag detail pixelColor(116, 17).hsl.l: 30.2}
2023-08-28 15:46:15.695 imag detail pixelColor(117, 17).hsl.l: 29.4}
2023-08-28 15:46:15.695 imag detail pixelColor(118, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(119, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(120, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(121, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(122, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(123, 17).hsl.l: 31}
2023-08-28 15:46:15.695 imag detail pixelColor(124, 17).hsl.l: 31}
2023-08-28 15:46:15.695 imag detail pixelColor(125, 17).hsl.l: 31}
2023-08-28 15:46:15.695 imag detail pixelColor(126, 17).hsl.l: 31}
2023-08-28 15:46:15.695 imag detail pixelColor(127, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(128, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(129, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(130, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(131, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(132, 17).hsl.l: 31.4}
2023-08-28 15:46:15.696 imag detail pixelColor(133, 17).hsl.l: 31.4}
2023-08-28 15:46:15.696 imag detail pixelColor(134, 17).hsl.l: 31}
2023-08-28 15:46:15.696 imag detail pixelColor(135, 17).hsl.l: 31}
2023-08-28 15:46:15.696 imag detail pixelColor(136, 17).hsl.l: 31}
2023-08-28 15:46:15.696 imag detail pixelColor(137, 17).hsl.l: 31}
2023-08-28 15:46:15.696 imag detail pixelColor(138, 17).hsl.l: 31}
2023-08-28 15:46:15.696 imag detail pixelColor(139, 17).hsl.l: 31}
2023-08-28 15:46:15.696 imag detail pixelColor(140, 17).hsl.l: 31}
2023-08-28 15:46:15.696 imag detail pixelColor(141, 17).hsl.l: 31}
2023-08-28 15:46:15.696 imag detail pixelColor(142, 17).hsl.l: 30.2}
2023-08-28 15:46:15.696 imag detail pixelColor(143, 17).hsl.l: 28.6}
2023-08-28 15:46:15.696 imag detail pixelColor(144, 17).hsl.l: 22.4}
2023-08-28 15:46:15.696 imag detail Start: 12, End: 113
2023-08-28 15:46:15.696 imag detail pct: 76.00

I'm using the "L" value (lightness) from the pixel's HSL. I'm looking for the value to drop below 60, which is an arbitrary number that seemed to work the best, especially if the screenshot is 1920x1080. Also there's feathering to take into account, as the color doesn't go immediately from white to black (or whatever).

And remember that the progress bar image has a border that doesn't count towards the overall size of the bar itself.

Also, it's possible the image may not be 4k - it could be 1920x1080, as I mentioned earlier. So I have to take that into account. Resize a screenshot to 1920x1080, and look at the log to see what I mean.

So, spend some time looking at this and let me know if you think my logic is wrong anywhere. It's quite possible it may just come down to a matter of opinion as to which pixel to consider the end of the bar.

And in any case, as long as the number is consistent, it's actually irrelevant because we're just interpreting a progress bar that is interpreting a number by using pixels, so the chances of it being exact are pretty much null.

But still, it's totally worth talking about, especially for geeks like us. :)

Oh, and the maximum pct my code will ever return is "99.90", which obviously isn't rounded to the nearest .25. I don't know if that ever happens, though - it's just a "boundary condition" safeguard.
I think 1% off is an acceptable margin of error, because I was always a lazy IT guy my solution would be to add 1 to the calculation if it's always off by 1, you could even just make it optional setting to mitigate any potential regression bug popping up and have it off by default.
 
Since you weren't getting paid to be a tester, you're forgiven. :lol:

You may be right, so let me tell you what I'm doing, and see if you think I'm wrong, or there's a better way.

(FYI: The final percent is rounded to the nearest .25, because otherwise it just looked silly. I don't remember when I changed this, so earlier versions of the program won't have this rounding.)

The easiest way to find the log information I'm about to talk about is to open the Logs folder (there's a link to it under the Help menu), and delete the file "debuglog.txt". Then import a screenshot.

There'll be a file called "pctbar.png" which is what I'm using to scan for the percentage. Open the the file "debuglog.txt". Look around until you find where you imported the race (FYI, the log file gets rewritten each day). You should find something like this:

Code:
2023-08-28 15:46:15.685 imag detail start: 12, end: 145, y: 17
2023-08-28 15:46:15.686 imag detail pixelColor(12, 17).hsl.l: 67.5}; set progBarStart to 12
2023-08-28 15:46:15.686 imag detail pixelColor(13, 17).hsl.l: 73.3}
2023-08-28 15:46:15.686 imag detail pixelColor(14, 17).hsl.l: 76.9}
2023-08-28 15:46:15.686 imag detail pixelColor(15, 17).hsl.l: 78.8}
2023-08-28 15:46:15.686 imag detail pixelColor(16, 17).hsl.l: 79.6}
2023-08-28 15:46:15.686 imag detail pixelColor(17, 17).hsl.l: 79.2}
2023-08-28 15:46:15.686 imag detail pixelColor(18, 17).hsl.l: 79.2}
2023-08-28 15:46:15.686 imag detail pixelColor(19, 17).hsl.l: 79.2}
2023-08-28 15:46:15.686 imag detail pixelColor(20, 17).hsl.l: 78.8}
2023-08-28 15:46:15.686 imag detail pixelColor(21, 17).hsl.l: 79.6}
2023-08-28 15:46:15.686 imag detail pixelColor(22, 17).hsl.l: 79.2}
2023-08-28 15:46:15.686 imag detail pixelColor(23, 17).hsl.l: 79.2}
2023-08-28 15:46:15.686 imag detail pixelColor(24, 17).hsl.l: 79.2}
2023-08-28 15:46:15.687 imag detail pixelColor(25, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(26, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(27, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(28, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(29, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(30, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(31, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(32, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(33, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(34, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(35, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(36, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(37, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(38, 17).hsl.l: 78.8}
2023-08-28 15:46:15.687 imag detail pixelColor(39, 17).hsl.l: 79.2}
2023-08-28 15:46:15.688 imag detail pixelColor(40, 17).hsl.l: 79.2}
2023-08-28 15:46:15.688 imag detail pixelColor(41, 17).hsl.l: 79.2}
2023-08-28 15:46:15.688 imag detail pixelColor(42, 17).hsl.l: 79.2}
2023-08-28 15:46:15.688 imag detail pixelColor(43, 17).hsl.l: 79.2}
2023-08-28 15:46:15.688 imag detail pixelColor(44, 17).hsl.l: 79.2}
2023-08-28 15:46:15.688 imag detail pixelColor(45, 17).hsl.l: 78.8}
2023-08-28 15:46:15.688 imag detail pixelColor(46, 17).hsl.l: 78.8}
2023-08-28 15:46:15.688 imag detail pixelColor(47, 17).hsl.l: 78.4}
2023-08-28 15:46:15.688 imag detail pixelColor(48, 17).hsl.l: 78.4}
2023-08-28 15:46:15.688 imag detail pixelColor(49, 17).hsl.l: 78.4}
2023-08-28 15:46:15.688 imag detail pixelColor(50, 17).hsl.l: 78.4}
2023-08-28 15:46:15.688 imag detail pixelColor(51, 17).hsl.l: 78.4}
2023-08-28 15:46:15.688 imag detail pixelColor(52, 17).hsl.l: 78.4}
2023-08-28 15:46:15.689 imag detail pixelColor(53, 17).hsl.l: 78.4}
2023-08-28 15:46:15.689 imag detail pixelColor(54, 17).hsl.l: 78.8}
2023-08-28 15:46:15.689 imag detail pixelColor(55, 17).hsl.l: 78.8}
2023-08-28 15:46:15.689 imag detail pixelColor(56, 17).hsl.l: 78.8}
2023-08-28 15:46:15.689 imag detail pixelColor(57, 17).hsl.l: 78.4}
2023-08-28 15:46:15.689 imag detail pixelColor(58, 17).hsl.l: 78.4}
2023-08-28 15:46:15.689 imag detail pixelColor(59, 17).hsl.l: 78.4}
2023-08-28 15:46:15.689 imag detail pixelColor(60, 17).hsl.l: 78.4}
2023-08-28 15:46:15.689 imag detail pixelColor(61, 17).hsl.l: 78.4}
2023-08-28 15:46:15.689 imag detail pixelColor(62, 17).hsl.l: 78.8}
2023-08-28 15:46:15.689 imag detail pixelColor(63, 17).hsl.l: 78.8}
2023-08-28 15:46:15.689 imag detail pixelColor(64, 17).hsl.l: 78.8}
2023-08-28 15:46:15.689 imag detail pixelColor(65, 17).hsl.l: 78.8}
2023-08-28 15:46:15.691 imag detail pixelColor(66, 17).hsl.l: 78.8}
2023-08-28 15:46:15.691 imag detail pixelColor(67, 17).hsl.l: 78.8}
2023-08-28 15:46:15.691 imag detail pixelColor(68, 17).hsl.l: 78.8}
2023-08-28 15:46:15.691 imag detail pixelColor(69, 17).hsl.l: 78.8}
2023-08-28 15:46:15.692 imag detail pixelColor(70, 17).hsl.l: 78.4}
2023-08-28 15:46:15.692 imag detail pixelColor(71, 17).hsl.l: 78.4}
2023-08-28 15:46:15.692 imag detail pixelColor(72, 17).hsl.l: 78.4}
2023-08-28 15:46:15.692 imag detail pixelColor(73, 17).hsl.l: 78.4}
2023-08-28 15:46:15.692 imag detail pixelColor(74, 17).hsl.l: 78.4}
2023-08-28 15:46:15.692 imag detail pixelColor(75, 17).hsl.l: 78.4}
2023-08-28 15:46:15.692 imag detail pixelColor(76, 17).hsl.l: 78.4}
2023-08-28 15:46:15.692 imag detail pixelColor(77, 17).hsl.l: 78.4}
2023-08-28 15:46:15.692 imag detail pixelColor(78, 17).hsl.l: 78.8}
2023-08-28 15:46:15.692 imag detail pixelColor(79, 17).hsl.l: 78.8}
2023-08-28 15:46:15.692 imag detail pixelColor(80, 17).hsl.l: 78.8}
2023-08-28 15:46:15.692 imag detail pixelColor(81, 17).hsl.l: 78.8}
2023-08-28 15:46:15.692 imag detail pixelColor(82, 17).hsl.l: 79.2}
2023-08-28 15:46:15.692 imag detail pixelColor(83, 17).hsl.l: 79.2}
2023-08-28 15:46:15.692 imag detail pixelColor(84, 17).hsl.l: 79.2}
2023-08-28 15:46:15.693 imag detail pixelColor(85, 17).hsl.l: 79.2}
2023-08-28 15:46:15.693 imag detail pixelColor(86, 17).hsl.l: 79.2}
2023-08-28 15:46:15.693 imag detail pixelColor(87, 17).hsl.l: 79.2}
2023-08-28 15:46:15.693 imag detail pixelColor(88, 17).hsl.l: 79.2}
2023-08-28 15:46:15.693 imag detail pixelColor(89, 17).hsl.l: 78.8}
2023-08-28 15:46:15.693 imag detail pixelColor(90, 17).hsl.l: 78.8}
2023-08-28 15:46:15.693 imag detail pixelColor(91, 17).hsl.l: 78.8}
2023-08-28 15:46:15.693 imag detail pixelColor(92, 17).hsl.l: 78.8}
2023-08-28 15:46:15.693 imag detail pixelColor(93, 17).hsl.l: 78.4}
2023-08-28 15:46:15.693 imag detail pixelColor(94, 17).hsl.l: 78.4}
2023-08-28 15:46:15.693 imag detail pixelColor(95, 17).hsl.l: 78.4}
2023-08-28 15:46:15.693 imag detail pixelColor(96, 17).hsl.l: 78.4}
2023-08-28 15:46:15.693 imag detail pixelColor(97, 17).hsl.l: 78.4}
2023-08-28 15:46:15.693 imag detail pixelColor(98, 17).hsl.l: 78.4}
2023-08-28 15:46:15.693 imag detail pixelColor(99, 17).hsl.l: 78.4}
2023-08-28 15:46:15.693 imag detail pixelColor(100, 17).hsl.l: 78.4}
2023-08-28 15:46:15.694 imag detail pixelColor(101, 17).hsl.l: 78.4}
2023-08-28 15:46:15.694 imag detail pixelColor(102, 17).hsl.l: 78.8}
2023-08-28 15:46:15.694 imag detail pixelColor(103, 17).hsl.l: 78.8}
2023-08-28 15:46:15.694 imag detail pixelColor(104, 17).hsl.l: 78.8}
2023-08-28 15:46:15.694 imag detail pixelColor(105, 17).hsl.l: 78.8}
2023-08-28 15:46:15.694 imag detail pixelColor(106, 17).hsl.l: 79.2}
2023-08-28 15:46:15.694 imag detail pixelColor(107, 17).hsl.l: 79.2}
2023-08-28 15:46:15.694 imag detail pixelColor(108, 17).hsl.l: 79.6}
2023-08-28 15:46:15.694 imag detail pixelColor(109, 17).hsl.l: 79.6}
2023-08-28 15:46:15.694 imag detail pixelColor(110, 17).hsl.l: 80.8}
2023-08-28 15:46:15.694 imag detail pixelColor(111, 17).hsl.l: 79.6}
2023-08-28 15:46:15.694 imag detail pixelColor(112, 17).hsl.l: 68.2}
2023-08-28 15:46:15.694 imag detail pixelColor(113, 17).hsl.l: 57.3}; set progBarEnd to 113
2023-08-28 15:46:15.694 imag detail pixelColor(114, 17).hsl.l: 47.1}
2023-08-28 15:46:15.694 imag detail pixelColor(115, 17).hsl.l: 38.8}
2023-08-28 15:46:15.694 imag detail pixelColor(116, 17).hsl.l: 30.2}
2023-08-28 15:46:15.695 imag detail pixelColor(117, 17).hsl.l: 29.4}
2023-08-28 15:46:15.695 imag detail pixelColor(118, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(119, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(120, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(121, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(122, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(123, 17).hsl.l: 31}
2023-08-28 15:46:15.695 imag detail pixelColor(124, 17).hsl.l: 31}
2023-08-28 15:46:15.695 imag detail pixelColor(125, 17).hsl.l: 31}
2023-08-28 15:46:15.695 imag detail pixelColor(126, 17).hsl.l: 31}
2023-08-28 15:46:15.695 imag detail pixelColor(127, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(128, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(129, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(130, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(131, 17).hsl.l: 31.4}
2023-08-28 15:46:15.695 imag detail pixelColor(132, 17).hsl.l: 31.4}
2023-08-28 15:46:15.696 imag detail pixelColor(133, 17).hsl.l: 31.4}
2023-08-28 15:46:15.696 imag detail pixelColor(134, 17).hsl.l: 31}
2023-08-28 15:46:15.696 imag detail pixelColor(135, 17).hsl.l: 31}
2023-08-28 15:46:15.696 imag detail pixelColor(136, 17).hsl.l: 31}
2023-08-28 15:46:15.696 imag detail pixelColor(137, 17).hsl.l: 31}
2023-08-28 15:46:15.696 imag detail pixelColor(138, 17).hsl.l: 31}
2023-08-28 15:46:15.696 imag detail pixelColor(139, 17).hsl.l: 31}
2023-08-28 15:46:15.696 imag detail pixelColor(140, 17).hsl.l: 31}
2023-08-28 15:46:15.696 imag detail pixelColor(141, 17).hsl.l: 31}
2023-08-28 15:46:15.696 imag detail pixelColor(142, 17).hsl.l: 30.2}
2023-08-28 15:46:15.696 imag detail pixelColor(143, 17).hsl.l: 28.6}
2023-08-28 15:46:15.696 imag detail pixelColor(144, 17).hsl.l: 22.4}
2023-08-28 15:46:15.696 imag detail Start: 12, End: 113
2023-08-28 15:46:15.696 imag detail pct: 76.00

I'm using the "L" value (lightness) from the pixel's HSL. I'm looking for the value to drop below 60, which is an arbitrary number that seemed to work the best, especially if the screenshot is 1920x1080. Also there's feathering to take into account, as the color doesn't go immediately from white to black (or whatever).

And remember that the progress bar image has a border that doesn't count towards the overall size of the bar itself.

Also, it's possible the image may not be 4k - it could be 1920x1080, as I mentioned earlier. So I have to take that into account. Resize a screenshot to 1920x1080, and look at the log to see what I mean.

So, spend some time looking at this and let me know if you think my logic is wrong anywhere. It's quite possible it may just come down to a matter of opinion as to which pixel to consider the end of the bar.

And in any case, as long as the number is consistent, it's actually irrelevant because we're just interpreting a progress bar that is interpreting a number by using pixels, so the chances of it being exact are pretty much null.

But still, it's totally worth talking about, especially for geeks like us. :)

Oh, and the maximum pct my code will ever return is "99.90", which obviously isn't rounded to the nearest .25. I don't know if that ever happens, though - it's just a "boundary condition" safeguard.
Okay I did that. I changed the timestamp and reimport my podium from yesterday. My 4K image of my rating is:
Screenshot 2023-08-29 at 9.09.32 AM.png


This has 100 pixels with 57 lit and 43 dark.

This is what pct bar.png captures.

Screenshot 2023-08-29 at 9.13.06 AM.png


It is the same, 57 lit, 43 dark.

In the log I have this:

Code:
2023-08-29 09:05:26.151 imag detail start: 9, end: 109, y: 12
2023-08-29 09:05:26.151 imag detail pixelColor(9, 12).hsl.l: 74.9}; set progBarStart to 9
2023-08-29 09:05:26.152 imag detail pixelColor(10, 12).hsl.l: 74.9}
2023-08-29 09:05:26.152 imag detail pixelColor(11, 12).hsl.l: 74.9}
2023-08-29 09:05:26.152 imag detail pixelColor(12, 12).hsl.l: 74.9}
2023-08-29 09:05:26.152 imag detail pixelColor(13, 12).hsl.l: 74.9}
2023-08-29 09:05:26.152 imag detail pixelColor(14, 12).hsl.l: 74.9}
2023-08-29 09:05:26.152 imag detail pixelColor(15, 12).hsl.l: 74.9}
2023-08-29 09:05:26.152 imag detail pixelColor(16, 12).hsl.l: 74.9}
2023-08-29 09:05:26.152 imag detail pixelColor(17, 12).hsl.l: 74.9}
2023-08-29 09:05:26.152 imag detail pixelColor(18, 12).hsl.l: 74.9}
2023-08-29 09:05:26.152 imag detail pixelColor(19, 12).hsl.l: 74.9}
2023-08-29 09:05:26.152 imag detail pixelColor(20, 12).hsl.l: 74.9}
2023-08-29 09:05:26.152 imag detail pixelColor(21, 12).hsl.l: 74.9}
2023-08-29 09:05:26.152 imag detail pixelColor(22, 12).hsl.l: 74.9}
2023-08-29 09:05:26.152 imag detail pixelColor(23, 12).hsl.l: 74.9}
2023-08-29 09:05:26.152 imag detail pixelColor(24, 12).hsl.l: 74.9}
2023-08-29 09:05:26.152 imag detail pixelColor(25, 12).hsl.l: 74.9}
2023-08-29 09:05:26.152 imag detail pixelColor(26, 12).hsl.l: 74.9}
2023-08-29 09:05:26.152 imag detail pixelColor(27, 12).hsl.l: 74.9}
2023-08-29 09:05:26.152 imag detail pixelColor(28, 12).hsl.l: 74.9}
2023-08-29 09:05:26.152 imag detail pixelColor(29, 12).hsl.l: 74.9}
2023-08-29 09:05:26.152 imag detail pixelColor(30, 12).hsl.l: 74.9}
2023-08-29 09:05:26.152 imag detail pixelColor(31, 12).hsl.l: 74.9}
2023-08-29 09:05:26.152 imag detail pixelColor(32, 12).hsl.l: 74.9}
2023-08-29 09:05:26.152 imag detail pixelColor(33, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(34, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(35, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(36, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(37, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(38, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(39, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(40, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(41, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(42, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(43, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(44, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(45, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(46, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(47, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(48, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(49, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(50, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(51, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(52, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(53, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(54, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(55, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(56, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(57, 12).hsl.l: 74.9}
2023-08-29 09:05:26.153 imag detail pixelColor(58, 12).hsl.l: 74.5}
2023-08-29 09:05:26.154 imag detail pixelColor(59, 12).hsl.l: 74.5}
2023-08-29 09:05:26.154 imag detail pixelColor(60, 12).hsl.l: 74.1}
2023-08-29 09:05:26.154 imag detail pixelColor(61, 12).hsl.l: 74.9}
2023-08-29 09:05:26.154 imag detail pixelColor(62, 12).hsl.l: 74.1}
2023-08-29 09:05:26.154 imag detail pixelColor(63, 12).hsl.l: 75.3}
2023-08-29 09:05:26.154 imag detail pixelColor(64, 12).hsl.l: 73.7}
2023-08-29 09:05:26.154 imag detail pixelColor(65, 12).hsl.l: 20.8}; set progBarEnd to 65
2023-08-29 09:05:26.154 imag detail pixelColor(66, 12).hsl.l: 19.2}
2023-08-29 09:05:26.154 imag detail pixelColor(67, 12).hsl.l: 19.2}
2023-08-29 09:05:26.154 imag detail pixelColor(68, 12).hsl.l: 19.2}
2023-08-29 09:05:26.154 imag detail pixelColor(69, 12).hsl.l: 19.2}
2023-08-29 09:05:26.154 imag detail pixelColor(70, 12).hsl.l: 19.2}
2023-08-29 09:05:26.154 imag detail pixelColor(71, 12).hsl.l: 19.2}
2023-08-29 09:05:26.154 imag detail pixelColor(72, 12).hsl.l: 19.2}
2023-08-29 09:05:26.154 imag detail pixelColor(73, 12).hsl.l: 19.2}
2023-08-29 09:05:26.154 imag detail pixelColor(74, 12).hsl.l: 19.6}
2023-08-29 09:05:26.154 imag detail pixelColor(75, 12).hsl.l: 19.6}
2023-08-29 09:05:26.154 imag detail pixelColor(76, 12).hsl.l: 19.6}
2023-08-29 09:05:26.154 imag detail pixelColor(77, 12).hsl.l: 19.6}
2023-08-29 09:05:26.154 imag detail pixelColor(78, 12).hsl.l: 19.6}
2023-08-29 09:05:26.154 imag detail pixelColor(79, 12).hsl.l: 19.6}
2023-08-29 09:05:26.154 imag detail pixelColor(80, 12).hsl.l: 19.6}
2023-08-29 09:05:26.155 imag detail pixelColor(81, 12).hsl.l: 19.6}
2023-08-29 09:05:26.155 imag detail pixelColor(82, 12).hsl.l: 19.2}
2023-08-29 09:05:26.155 imag detail pixelColor(83, 12).hsl.l: 19.2}
2023-08-29 09:05:26.155 imag detail pixelColor(84, 12).hsl.l: 19.2}
2023-08-29 09:05:26.155 imag detail pixelColor(85, 12).hsl.l: 19.2}
2023-08-29 09:05:26.155 imag detail pixelColor(86, 12).hsl.l: 19.2}
2023-08-29 09:05:26.155 imag detail pixelColor(87, 12).hsl.l: 19.2}
2023-08-29 09:05:26.155 imag detail pixelColor(88, 12).hsl.l: 19.2}
2023-08-29 09:05:26.156 imag detail pixelColor(89, 12).hsl.l: 19.2}
2023-08-29 09:05:26.156 imag detail pixelColor(90, 12).hsl.l: 19.6}
2023-08-29 09:05:26.156 imag detail pixelColor(91, 12).hsl.l: 19.6}
2023-08-29 09:05:26.156 imag detail pixelColor(92, 12).hsl.l: 19.6}
2023-08-29 09:05:26.156 imag detail pixelColor(93, 12).hsl.l: 19.6}
2023-08-29 09:05:26.156 imag detail pixelColor(94, 12).hsl.l: 19.6}
2023-08-29 09:05:26.156 imag detail pixelColor(95, 12).hsl.l: 19.6}
2023-08-29 09:05:26.156 imag detail pixelColor(96, 12).hsl.l: 19.6}
2023-08-29 09:05:26.156 imag detail pixelColor(97, 12).hsl.l: 19.6}
2023-08-29 09:05:26.156 imag detail pixelColor(98, 12).hsl.l: 19.2}
2023-08-29 09:05:26.156 imag detail pixelColor(99, 12).hsl.l: 19.2}
2023-08-29 09:05:26.156 imag detail pixelColor(100, 12).hsl.l: 19.2}
2023-08-29 09:05:26.156 imag detail pixelColor(101, 12).hsl.l: 19.2}
2023-08-29 09:05:26.156 imag detail pixelColor(102, 12).hsl.l: 19.2}
2023-08-29 09:05:26.156 imag detail pixelColor(103, 12).hsl.l: 19.2}
2023-08-29 09:05:26.156 imag detail pixelColor(104, 12).hsl.l: 19.2}
2023-08-29 09:05:26.157 imag detail pixelColor(105, 12).hsl.l: 19.2}
2023-08-29 09:05:26.157 imag detail pixelColor(106, 12).hsl.l: 19.2}
2023-08-29 09:05:26.157 imag detail pixelColor(107, 12).hsl.l: 18.8}
2023-08-29 09:05:26.157 imag detail pixelColor(108, 12).hsl.l: 11}
2023-08-29 09:05:26.158 imag detail Start: 9, End: 65
2023-08-29 09:05:26.158 imag detail pct: 56.00


in pctBar.pgn there is a border of 8 pixels to the left of the bar and 8 pixels to the right. So you start counting at pixel 9. You stop counting at 65. This is correct.

I think the issue is that you then do 65-9 = 56 based on:

Code:
2023-08-29 09:05:26.158 imag detail Start: 9, End: 65
2023-08-29 09:05:26.158 imag detail pct: 56.00

But that negates the fact that pixel 9, the start, is lit. If you had one pixel lit it would be 9-9=0 but it should be 9-9+1 = 1 = 1%. I don't know if it is possible to have no pixels lit for a 0% rating as you would have no progBarEnd so might need to consider that as well.

The above is with a 4K capture. Below I resized the image to HD. Not sure if that is what it is like in reality.
Screenshot 2023-08-29 at 9.29.01 AM.png


The box is 50 pixels. With the differing this is much more of a challenge. Perhaps a strategy is to median the lit pixels as 100% and then median the dim pixels as 0% (and anything below that, like the pure black as min value) and then calculate the DR as pixel brightness against the min/max HSL values calculated to get the overall value.

So say we determined the medium of the bright pixels is 74.6 Perhaps we put a threshold (-4) on it so that anything that is 70.6 or higher is counted 100%. For lowest medium the HSL is 19.2. We add a threshold of +4 so that any pixel below 23.2 is counted as 0%.
In a hypothetical chart of 10 pixels we might have:

Pixel 01: HSL 74.2: Value 1.00
Pixel 02: HSL 74.2: Value 1.00
Pixel 03: HSL 74.6: Value 1.00
Pixel 04: HSL 74.6: Value 1.00
Pixel 05: HSL 48.4: Value 0.53
Pixel 06: HSL 00.0: Value 0.00
Pixel 07: HSL 19.6: Value 0.00
Pixel 08: HSL 19.6: Value 0.00
Pixel 09: HSL 19.2: Value 0.00
Pixel 10: HSL 19.2: Value 0.00

For each pixel the value calculation would be

min(max(measuredHSL,minHSL), maxHSL) - minHSL / (maxHSL - minHSL)

so if maxHSL is 70.6 and minHSL is 23.2 then the calculation is:

pixel 1:
min(max(74.2,23.2),70.6) - 23.2 / (70.6-23.2)
min(74.2,70.6) - 23.2 / (70.6-23.2)
(70.6-23.2) / 47.4
47.4 / 47.4 = 1

pixel 5:
min(max(48.4,23.2),70.6) - 23.2 / (70.6-23.2)
min(48.4,70.6) - 23.2 / (70.6-23.2)
(48.4-23.2) / 47.4
25.2 / 47.4 = 0.53

pixel 6:
min(max(0,23.2),70.6) - 23.2 / (70.6-23.2)
min(23.2,70.6) - 23.2 / (70.6-23.2)
(23.2-23.2) / 47.4
0 / 47.4 = 0

pixel 10:
min(max(19.2,23.2),70.6) - 23.2 / (70.6-23.2)
min(23.2,70.6) - 23.2 / (70.6-23.2)
(23.2-23.2) / 47.4
0 / 47.4 = 0

Add up the respective values and divide by number of pixels (for HD 50, 4K 100 - not sure for 720p) for the DR %. So 4.53 / 10 (in this example) = 45.3%.

Does that help?

Does this give away that I am a Data Architect my trade? :D

EDIT: for the medium max and min calculations take the mediam of any pixels above 50 for max and the median for any pixel below 50 for min. That would be:

Max: median(74.2, 74.2, 74.6, 74.6) = 74.4

Min: median(48.4, 0, 19.6, 19.6, 19.2, 19.2) = 19.4

EDIT2:

I loaded the log into NUMBERS and performed my calculation above and it came out top 56, not 57 as I expected. So I looked again at the results. I now believe this is as simple as you counting from the wrong starting pixel. My bar clearly changes luminance at pixel 58 (66 in the crop) meaning that 57 at lit. Your log indicates this one pixel early. I think you said you have a buffer of 9 pixels but it is actually only 8 and I see that in the log so this is hard to explain. It looks like what you are doing is correct but for some reason it is recording the lightest for pixel 65 in the crop a lot lighter than it appears in the image.

What you record for pixel 65,12 appears to be 66,12 and 66,12 appears to be 67,12.
 
Last edited:
Does this give away that I am a Data Architect my trade? :D
You have no idea how much this pleases me. It's rare these days to have someone to talk about this stuff with. Not only do you totally understand, but you're very thorough. Please consider yourself my friend for life (seriously!).

I was all ready to refute your arguments and data. But for kicks and giggles, I tried an experiment:

I took a current screenshot and imported it, and got 76%. Then I modified my code to start several pixels early, so it could recognize the start of the bar by the pixel colors, rather than just assume my starting position was correct. Here's what I got:
Code:
2023-08-29 10:34:08.602 imag detail pixelColor(7, 12).hsl.l: 10.4}
2023-08-29 10:34:08.602 imag detail pixelColor(8, 12).hsl.l: 75.9}; set progBarStart to 8
2023-08-29 10:34:08.602 imag detail pixelColor(9, 12).hsl.l: 74.3}
2023-08-29 10:34:08.602 imag detail pixelColor(10, 12).hsl.l: 74.9}
2023-08-29 10:34:08.602 imag detail pixelColor(11, 12).hsl.l: 74.9}
2023-08-29 10:34:08.602 imag detail pixelColor(12, 12).hsl.l: 74.9}
2023-08-29 10:34:08.602 imag detail pixelColor(13, 12).hsl.l: 74.9}
2023-08-29 10:34:08.602 imag detail pixelColor(14, 12).hsl.l: 74.9}
2023-08-29 10:34:08.603 imag detail pixelColor(15, 12).hsl.l: 74.9}
2023-08-29 10:34:08.603 imag detail pixelColor(16, 12).hsl.l: 74.9}
2023-08-29 10:34:08.603 imag detail pixelColor(17, 12).hsl.l: 74.9}
2023-08-29 10:34:08.603 imag detail pixelColor(18, 12).hsl.l: 74.9}
2023-08-29 10:34:08.603 imag detail pixelColor(19, 12).hsl.l: 74.9}
2023-08-29 10:34:08.603 imag detail pixelColor(20, 12).hsl.l: 74.9}
2023-08-29 10:34:08.603 imag detail pixelColor(21, 12).hsl.l: 74.9}
2023-08-29 10:34:08.603 imag detail pixelColor(22, 12).hsl.l: 74.9}
2023-08-29 10:34:08.603 imag detail pixelColor(23, 12).hsl.l: 74.9}
2023-08-29 10:34:08.603 imag detail pixelColor(24, 12).hsl.l: 74.9}
2023-08-29 10:34:08.603 imag detail pixelColor(25, 12).hsl.l: 74.9}
2023-08-29 10:34:08.603 imag detail pixelColor(26, 12).hsl.l: 74.9}
2023-08-29 10:34:08.603 imag detail pixelColor(27, 12).hsl.l: 74.9}
2023-08-29 10:34:08.604 imag detail pixelColor(28, 12).hsl.l: 74.9}
2023-08-29 10:34:08.604 imag detail pixelColor(29, 12).hsl.l: 74.9}
2023-08-29 10:34:08.604 imag detail pixelColor(30, 12).hsl.l: 74.9}
2023-08-29 10:34:08.604 imag detail pixelColor(31, 12).hsl.l: 74.9}
2023-08-29 10:34:08.604 imag detail pixelColor(32, 12).hsl.l: 74.9}
2023-08-29 10:34:08.604 imag detail pixelColor(33, 12).hsl.l: 74.9}
2023-08-29 10:34:08.604 imag detail pixelColor(34, 12).hsl.l: 74.9}
2023-08-29 10:34:08.604 imag detail pixelColor(35, 12).hsl.l: 74.9}
2023-08-29 10:34:08.604 imag detail pixelColor(36, 12).hsl.l: 74.9}
2023-08-29 10:34:08.604 imag detail pixelColor(37, 12).hsl.l: 74.9}
2023-08-29 10:34:08.604 imag detail pixelColor(38, 12).hsl.l: 74.9}
2023-08-29 10:34:08.604 imag detail pixelColor(39, 12).hsl.l: 74.9}
2023-08-29 10:34:08.604 imag detail pixelColor(40, 12).hsl.l: 74.9}
2023-08-29 10:34:08.604 imag detail pixelColor(41, 12).hsl.l: 74.9}
2023-08-29 10:34:08.605 imag detail pixelColor(42, 12).hsl.l: 74.9}
2023-08-29 10:34:08.605 imag detail pixelColor(43, 12).hsl.l: 74.9}
2023-08-29 10:34:08.605 imag detail pixelColor(44, 12).hsl.l: 74.9}
2023-08-29 10:34:08.605 imag detail pixelColor(45, 12).hsl.l: 74.9}
2023-08-29 10:34:08.605 imag detail pixelColor(46, 12).hsl.l: 74.9}
2023-08-29 10:34:08.605 imag detail pixelColor(47, 12).hsl.l: 74.9}
2023-08-29 10:34:08.605 imag detail pixelColor(48, 12).hsl.l: 74.9}
2023-08-29 10:34:08.605 imag detail pixelColor(49, 12).hsl.l: 74.9}
2023-08-29 10:34:08.605 imag detail pixelColor(50, 12).hsl.l: 74.9}
2023-08-29 10:34:08.605 imag detail pixelColor(51, 12).hsl.l: 74.9}
2023-08-29 10:34:08.605 imag detail pixelColor(52, 12).hsl.l: 74.9}
2023-08-29 10:34:08.605 imag detail pixelColor(53, 12).hsl.l: 74.9}
2023-08-29 10:34:08.605 imag detail pixelColor(54, 12).hsl.l: 74.9}
2023-08-29 10:34:08.605 imag detail pixelColor(55, 12).hsl.l: 74.9}
2023-08-29 10:34:08.605 imag detail pixelColor(56, 12).hsl.l: 74.9}
2023-08-29 10:34:08.605 imag detail pixelColor(57, 12).hsl.l: 74.9}
2023-08-29 10:34:08.606 imag detail pixelColor(58, 12).hsl.l: 74.9}
2023-08-29 10:34:08.606 imag detail pixelColor(59, 12).hsl.l: 74.9}
2023-08-29 10:34:08.606 imag detail pixelColor(60, 12).hsl.l: 74.9}
2023-08-29 10:34:08.606 imag detail pixelColor(61, 12).hsl.l: 74.9}
2023-08-29 10:34:08.606 imag detail pixelColor(62, 12).hsl.l: 74.9}
2023-08-29 10:34:08.606 imag detail pixelColor(63, 12).hsl.l: 74.9}
2023-08-29 10:34:08.606 imag detail pixelColor(64, 12).hsl.l: 74.9}
2023-08-29 10:34:08.606 imag detail pixelColor(65, 12).hsl.l: 74.9}
2023-08-29 10:34:08.606 imag detail pixelColor(66, 12).hsl.l: 74.9}
2023-08-29 10:34:08.606 imag detail pixelColor(67, 12).hsl.l: 74.9}
2023-08-29 10:34:08.606 imag detail pixelColor(68, 12).hsl.l: 74.9}
2023-08-29 10:34:08.606 imag detail pixelColor(69, 12).hsl.l: 74.9}
2023-08-29 10:34:08.606 imag detail pixelColor(70, 12).hsl.l: 74.9}
2023-08-29 10:34:08.606 imag detail pixelColor(71, 12).hsl.l: 74.9}
2023-08-29 10:34:08.607 imag detail pixelColor(72, 12).hsl.l: 74.9}
2023-08-29 10:34:08.607 imag detail pixelColor(73, 12).hsl.l: 74.9}
2023-08-29 10:34:08.607 imag detail pixelColor(74, 12).hsl.l: 75.1}
2023-08-29 10:34:08.607 imag detail pixelColor(75, 12).hsl.l: 75.1}
2023-08-29 10:34:08.607 imag detail pixelColor(76, 12).hsl.l: 75.1}
2023-08-29 10:34:08.607 imag detail pixelColor(77, 12).hsl.l: 75.1}
2023-08-29 10:34:08.607 imag detail pixelColor(78, 12).hsl.l: 75.1}
2023-08-29 10:34:08.607 imag detail pixelColor(79, 12).hsl.l: 75.1}
2023-08-29 10:34:08.607 imag detail pixelColor(80, 12).hsl.l: 75.1}
2023-08-29 10:34:08.607 imag detail pixelColor(81, 12).hsl.l: 75.1}
2023-08-29 10:34:08.607 imag detail pixelColor(82, 12).hsl.l: 75.1}
2023-08-29 10:34:08.607 imag detail pixelColor(83, 12).hsl.l: 74.7}
2023-08-29 10:34:08.607 imag detail pixelColor(84, 12).hsl.l: 75.5}
2023-08-29 10:34:08.607 imag detail pixelColor(85, 12).hsl.l: 20.2}; set progBarEnd to 85
2023-08-29 10:34:08.607 imag detail pixelColor(86, 12).hsl.l: 19.4}
2023-08-29 10:34:08.608 imag detail pixelColor(87, 12).hsl.l: 19.4}
2023-08-29 10:34:08.608 imag detail pixelColor(88, 12).hsl.l: 19}
2023-08-29 10:34:08.608 imag detail pixelColor(89, 12).hsl.l: 18.6}
2023-08-29 10:34:08.608 imag detail pixelColor(90, 12).hsl.l: 18.2}
2023-08-29 10:34:08.608 imag detail pixelColor(91, 12).hsl.l: 18.6}
2023-08-29 10:34:08.608 imag detail pixelColor(92, 12).hsl.l: 18.6}
2023-08-29 10:34:08.608 imag detail pixelColor(93, 12).hsl.l: 19}
2023-08-29 10:34:08.608 imag detail pixelColor(94, 12).hsl.l: 19}
2023-08-29 10:34:08.608 imag detail pixelColor(95, 12).hsl.l: 19.4}
2023-08-29 10:34:08.608 imag detail pixelColor(96, 12).hsl.l: 19.4}
2023-08-29 10:34:08.608 imag detail pixelColor(97, 12).hsl.l: 19.8}
2023-08-29 10:34:08.608 imag detail pixelColor(98, 12).hsl.l: 19}
2023-08-29 10:34:08.608 imag detail pixelColor(99, 12).hsl.l: 19}
2023-08-29 10:34:08.608 imag detail pixelColor(100, 12).hsl.l: 19}
2023-08-29 10:34:08.608 imag detail pixelColor(101, 12).hsl.l: 19}
2023-08-29 10:34:08.608 imag detail pixelColor(102, 12).hsl.l: 19}
2023-08-29 10:34:08.609 imag detail pixelColor(103, 12).hsl.l: 19}
2023-08-29 10:34:08.609 imag detail pixelColor(104, 12).hsl.l: 19}
2023-08-29 10:34:08.609 imag detail pixelColor(105, 12).hsl.l: 19}
2023-08-29 10:34:08.609 imag detail pixelColor(106, 12).hsl.l: 18.6}
2023-08-29 10:34:08.609 imag detail pixelColor(107, 12).hsl.l: 19.8}
2023-08-29 10:34:08.609 imag detail pixelColor(108, 12).hsl.l: 10.8}
2023-08-29 10:34:08.609 imag detail Start: 8, End: 85
2023-08-29 10:34:08.609 imag detail pct: 77.00

And there's proof of your theory, right there. I am indeed starting my scan 1 pixel too early.

So I'm gonna do some more experiments with 4k, 2k, and HD, to make sure I get everything correct. I'll keep the code that starts scanning the pixels early, just to make sure. (I actually already had this code in place, but I wasn't using it.

The cool thing about this is that, in 4k images anyway, I no longer have to worry about fractions. 100 pixels makes it easy to get round percentages. The fact I wasn't getting round numbers should have tipped me off in the first place.

Many thanks for all the work. As always, keep it up! :cheers:
 
I don't even own GT7, but as a hobby programmer and data analyst by trade this thread fascinates me. Great work grumpy! But also Normsk with the excellent bug hunting.

I was wondering why your code counts the first dim pixel as the end of the bar rather than the beginning of the "not bar". In the above example I would have thought that the bar lasts until pixel 84 rather than 85. When including Normsk's fix to the beginning (bar starts at 8 therefore substract 7 rather than 8) we end up at an overall bar length of 84-7=77 again.

Sorry if this is more confusing than constructive but I thought I might just try and catch another potential bug while you are working to finalize this feature.
 
I don't even own GT7, but as a hobby programmer and data analyst by trade this thread fascinates me. Great work grumpy! But also Normsk with the excellent bug hunting.

I was wondering why your code counts the first dim pixel as the end of the bar rather than the beginning of the "not bar". In the above example I would have thought that the bar lasts until pixel 84 rather than 85. When including Normsk's fix to the beginning (bar starts at 8 therefore substract 7 rather than 8) we end up at an overall bar length of 84-7=77 again.

Sorry if this is more confusing than constructive but I thought I might just try and catch another potential bug while you are working to finalize this feature.
It's cool that you're interested! And no worries about commenting on this - anything that can help prevent a potential bug is awesome, especially since I've had the programmer's nightmare of having to release 3 updates in a short period of time due to bugs.

Let's imagine that there's only one pixel that qualifies, and we'll say it's at position 8. So the start would be 8. The next pixel doesn't qualify, so I record the end as 9. Which means when I subtract them, I get 9-8 = 1. Does that make sense, or am I missing something (quite possible)?
 
minor issue to report, if you show/hide columns and you import a screenshot or modify an existing row the view gets reset back to default

:cheers:
 
minor issue to report, if you show/hide columns and you import a screenshot or modify an existing row the view gets reset back to default

:cheers:
I seem to recall that may be by design as I managed to crash it in the past when importing if the display was modify so I think the quick fix was just to unfiltered/reset it. Still it's good that you raised this. We can't have Grumpy getting bored now. He needs something to be grumpy about! :lol:
 
minor issue to report, if you show/hide columns and you import a screenshot or modify an existing row the view gets reset back to default
Thanks for the bug report! I'll take a look at that. I ran into an issue that when you show the column filters, it resets the columns, so this doesn't surprise me.

We can't have Grumpy getting bored now. He needs something to be grumpy about! :lol:
Bored? Not a chance! I'm working on a feature to allow you to specify your own custom fields, so you can track whatever you want. Also, I'm enhancing the column filters so you can use comparison operators like >, <, <>, etc. It's already working and I've used it a bunch - you're gonna love it!

As for being grumpy, that only mostly happens when I'm tired. Or hungry. Or racing idiots. Or - you know what? Never mind. :lol:
 
Great product - first time I have had time to try it out.

I know you set this up to track DR & SR via daily race results, is there a way to track other races? League races, practice for league races, other general races, and\or time trials which do not affect our DR and\or SR.

Is copying our home page the only way to input data? No manual input?
 
Last edited:
Great product - first time I have had time to try it out.
Thanks!
I know you set this up to track DR & SR via daily race results, is there a way to track other races? League races, practice for league races, other general races, and\or time trials which do not affect our DR and\or SR.
Not currently, no. But if you don't want to track DR percentage, then an ordinary spreadsheet could do what you want.
Is copying our home page the only way to input data? No manual input?
It's on my list to allow manually adding a new race. I'm not sure how or when it will be implemented, though.
 
Here's a minor thing I noticed. The track layouts for Monza and Monza no chicane are the same. Well they are different, but the Monza (which should have the chicane) does not.

Monza
Monza.v1.0.jpg


Monza No Chicane
Monza No Chicane.v1.0.jpg
 
Last edited:
Here's a minor thing I noticed. The track layouts for Monza and Monza no chicane are the same. Well they are different, but the Monza (which should have the chicane) does not.
Dang, you're right. I still haven't figured out how to handle updates to maps, and adding new maps (automatically, that is - you can always add stuff by hand). I'll have to think about it.

Thanks for noticing, by the way!
 
This isn't a bug per say but are you aware you can import end of race pictures? I accidentally imported a few and was confused why my DR was reduced to 00.50%. I reviewed the JPEG and noticed it wasn't the home page JPEG but an end of race photo. Odd.

Thank you for the program - still love it. Added in my EU account so tracking both now and it works great.
 
This isn't a bug per say but are you aware you can import end of race pictures? I accidentally imported a few and was confused why my DR was reduced to 00.50%. I reviewed the JPEG and noticed it wasn't the home page JPEG but an end of race photo. Odd.
That doesn't surprise me. I had written some code to make sure the right kind of picture was being imported, but it caused more problems than it solved.

Thanks for letting me know. I might add a confirmation dialog at the start, showing the picture and asking if it's OK to import it - at least then you'd know if it was the wrong one. I'd make the dialog optional, of course.

Glad you're enjoying it, and I'm glad it works well for your EU account also!
 
Adding the new races this week I noticed something. In the tabs there is Tracks/Races and Edit Race Weeks. What is the purpose of Tracks/Races? Surely that is covered by the Edit Race Weeks as it provides the same, in fact more, info.

Also for the next release will that include the fix to the DR % calculation? I'm currently added 1% to all my race results as it still under measures currently and I know this was discussed - I just wasn't sure if this was planned for the next release or not..

Also is it possible to add the track to the DR results grid so that I could filter all races done (be A, B or C) for Suzuka, for example? We can filter by car but I see no track option.

Thank you!
 
Adding the new races this week I noticed something. In the tabs there is Tracks/Races and Edit Race Weeks. What is the purpose of Tracks/Races? Surely that is covered by the Edit Race Weeks as it provides the same, in fact more, info.
Tracks/Races includes all races on all tracks, regardless of whether you entered them or not. So it's more like the DR tab than the Edit Race Weeks tab. I had more plans for this tab, but I haven't come up with anything good. With that said, the new filter options will make this a more usable tab.
Also for the next release will that include the fix to the DR % calculation? I'm currently added 1% to all my race results as it still under measures currently and I know this was discussed - I just wasn't sure if this was planned for the next release or not..
Absolutely coming in the next release.
Also is it possible to add the track to the DR results grid so that I could filter all races done (be A, B or C) for Suzuka, for example? We can filter by car but I see no track option.
It's already there. I believe in the version you have, you can right-click on a row and select "Show/Hide Columns", and select it from there.
 
It's already there. I believe in the version you have, you can right-click on a row and select "Show/Hide Columns", and select it from there.
Thank you! I was right clicking on the header thinking it would be there and not the row. That made the difference.

However, if I then toggle header filters on, that resets the grid to a default state and hides the columns that I added.
 
Last edited:
Thank you! I was right clicking on the header thinking it would be there and not the row. That made the difference.
I need to add it to that menu too. I keep forgetting.
However, if I then toggle header filters on, that resets the grid to a default state and hides the columns that I added.
Yeah, I know. That's fixed in the next version. If I'm not mistaken, right now if you show the columns you want, then quit the program and restart it, they'll stay there when you turn on filters. Let me know if that works.
 
I got this, this morning.

Code:
App Version: 1.5.5

Cannot read properties of null (reading 'verticalFillMode')

Stack Trace:
at RowManager.adjustTableSize (file:///Applications/GranTracker.app/Contents/Resources/app/node_modules/tabulator-tables/dist/js/tabulator_esm.js:23428:20)
at RowManager._wipeElements (file:///Applications/GranTracker.app/Contents/Resources/app/node_modules/tabulator-tables/dist/js/tabulator_esm.js:22660:8)
at RowManager._setDataActual (file:///Applications/GranTracker.app/Contents/Resources/app/node_modules/tabulator-tables/dist/js/tabulator_esm.js:22632:8)
at file:///Applications/GranTracker.app/Contents/Resources/app/node_modules/tabulator-tables/dist/js/tabulator_esm.js:22622:10
at new Promise ()
at RowManager.setData (file:///Applications/GranTracker.app/Contents/Resources/app/node_modules/tabulator-tables/dist/js/tabulator_esm.js:22607:10)
at DataLoader.load (file:///Applications/GranTracker.app/Contents/Resources/app/node_modules/tabulator-tables/dist/js/tabulator_esm.js:24047:26)
at TabulatorFull.replaceData (file:///Applications/GranTracker.app/Contents/Resources/app/node_modules/tabulator-tables/dist/js/tabulator_esm.js:25567:26)
at UserRacesTableController.createOrUpdateTable (file:///Applications/GranTracker.app/Contents/Resources/app/src/renderer/ui/tabs/userRaces/userRacesTableController.js:643:16)
at UserRacesTabPage.refresh (file:///Applications/GranTracker.app/Contents/Resources/app/src/renderer/index.js:956:29)

Upon restart it opened fine.
 
Back