unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TMainForm = class(TForm)
    CalculateButton: TButton;
    Memo: TMemo;
    procedure CalculateButtonClick(Sender: TObject);

  private
    function FindScale(bitmap: TBitmap): Integer;

    procedure Calculate(year: Integer);
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

function TMainForm.FindScale(bitmap: TBitmap): Integer;
var
  y: Integer;
begin
  Result := 0;

  for y := 1 to bitmap.Height - 1 do
  begin
    Inc(Result);

    if bitmap.Canvas.Pixels[1, y] = clBlack then
      Break;
  end;
end;

procedure TMainForm.Calculate(year: Integer);
const
  absolut = 273.15;
  clRed = 255;
  clGreen = 49152;
var
  fileName: String;
  bitmap: TBitmap;
  red, green: Integer;
  redMin, redMax: Integer;
  greenMin, greenMax: Integer;
  x, y: Integer;
  count: Integer;
  scale: Integer;
  a, b: Single;
begin
  fileName := Format('D:\%d.bmp', [year]);

  if not FileExists(fileName) then
    Exit;

  bitmap := TBitmap.Create;

  try
    bitmap.LoadFromFile(fileName);

    scale := FindScale(bitmap);

    red := 0;
    green := 0;
    count := 0;

    for x := 0 to bitmap.Width - 1 do
    begin
      redMin := 0;
      redMax := 0;
      greenMin := 0;
      greenMax := 0;

      for y := 0 to bitmap.Height - 1 do
        case bitmap.Canvas.Pixels[x, y] of
          clRed:
          begin
            if redMin = 0 then
              redMin := y;

            redMax := y;
          end;

          clGreen:
          begin
            if greenMin = 0 then
              greenMin := y;

            greenMax := y;
          end;
        end;

      if (redMin > 0) and (greenMin > 0) then
      begin
        red := red + (redMin + redMax) div 2;
        green := green + (greenMin + greenMax) div 2;

        Inc(count);
      end;
    end;

    a := 280 - 5*red/count/scale - absolut;
    b := 280 - 5*green/count/scale - absolut;

    Memo.Lines.Add(Format('%d: +%f C (%.1f C, %.1f C, %d)', [year, a - b, a, b, scale]));
  finally
    bitmap.Free;
  end;
end;

procedure TMainForm.CalculateButtonClick(Sender: TObject);
var
  i: Integer;
begin
  Memo.Lines.Clear;

  for i := 1958 to 2012 do
    Calculate(i);
end;

end.