Du wirfst da einiges durcheinander, verwechselst Zeilen und Spalten, berücksichtigst nicht das 3 Byte zusammen die Farbe eines Pixel bestimmen, vergleichst Byte mit TColor...
Natürlich nicht getestet:
Delphi-Quellcode:
type
TBGR = packed record
B, G, R: Byte;
end;
// Pixelsearch - Sucht im imgSudokuBW (Schwarz-Weiß Bild) die einzelnen Ziffern
function PixelSearchBW(x:integer; y:integer):string;
const
XCOUNT = 26;
YCOUNT = 26;
var
m, n, i, kleinste: integer;
AnzahlSchwarz : integer;
Pixel : ^TBGR;
RedValue: Integer;
Ziffer: array[1..9] of record
Bitmap: TBitmap;
Pixel: ^TBGR;
Abweichung: Real;
end;
begin
imgSudokuBW.Picture.Bitmap.PixelFormat:= pf24Bit;
AnzahlSchwarz := 0;
for i := Min(Ziffer) to Max(Ziffer) do
begin
with Ziffer[i] do
begin
case i of
1: Bitmap := img1.Picture.Bitmap;
2: Bitmap := img2.Picture.Bitmap;
3: Bitmap := img3.Picture.Bitmap;
4: Bitmap := img4.Picture.Bitmap;
5: Bitmap := img5.Picture.Bitmap;
6: Bitmap := img6.Picture.Bitmap;
7: Bitmap := img7.Picture.Bitmap;
8: Bitmap := img8.Picture.Bitmap;
9: Bitmap := img9.Picture.Bitmap;
else
Abort;
end;
Bitmap.PixelFormat:= pf24Bit;
Abweichung := 0;
end;
end;
for n := 0 to YCOUNT - 1 do
begin
{Pixel verweist auf erste Zeile und erste Spalte}
for i := Min(Ziffer) to Max(Ziffer) do
Ziffer[i].Pixel := Ziffer[i].ScanLine[n];
{Pixel verweist auf erste Zeile und erste Spalte im untersuchten Bereich}
Pixel := imgSudokuBW.Picture.Bitmap.ScanLine[n + y];
Inc(Pixel, x);
for m := 0 to XCOUNT - 1 do
begin
{nur den Rotanteil vergleichen (Warum nicht die Gesamthelligkeit?)}
RedValue := Pixel^.R;
for i := Min(Ziffer) to Max(Ziffer) do
begin
with Ziffer[i] do
begin
Abweichung := Abweichung + Abs(Pixel^.R - RedValue);
{Zeiger auf die nächste Spalte setzen}
Inc(Pixel);
end;
end;
if (Pixel^.B = 0) and (Pixel^.G = 0) and (Pixel^.R = 0) then
Inc(AnzahlSchwarz);
{Zeiger auf die nächste Spalte setzen}
Inc(Pixel);
end;
end;
if AnzahlSchwarz = 0 then
Result := '0'
else
begin
kleinste := Min(Ziffer);
for i := kleinste + 1 to Max(Ziffer) do
begin
if Ziffer[i].Abweichung < Ziffer[kleinste].Abweichung then
kleinste := i;
end;
Result := IntToStr(kleinste);
end;
end;