- Код: Выделить всё
// Перевод цветных пикселей в серые.
procedure TForm1.Grayscale(pBuf: pInteger; Count: integer);
var
MyColor: integer;
begin;
repeat
MyColor:=pBuf^;
pBuf^:=((29 * (MyColor and $FF) //Blue
+ 150 * ((MyColor shr 8) and $FF) //Green
+ 77 * ((MyColor shr 16) and $FF) //Red
) shr 8 ) * $00010101;
dec(Count);
inc(pBuf);
until Count<=0;
end;
// Замена цвета в битовой матрице на серый.
procedure TForm1.ShaBitmapToGrayscale1(Bitmap: TBitmap);
var
p, q: pInteger;
begin;
with Bitmap do begin
p:=ScanLine[Height-1];
q:=ScanLine[0];
if cardinal(p)>cardinal(q) then p:=q;
Grayscale(p, Height * Width);
end;
end;
При компиляции Lazarus выдаёт сообщения:
unit1.pas(94,16) Warning: Symbol "ScanLine" is not portable
unit1.pas(95,16) Warning: Symbol "ScanLine" is not portable
unit1.pas(96,8) Hint: Conversion between ordinals and pointers is not portable
unit1.pas(96,20) Hint: Conversion between ordinals and pointers is not portable
Ему (компилятору) явно не нравится функции Bitmap.ScanLine, хотя она определена в graphics.pp(1387,14) и я как понимаю она передаёт указатель на строку битовой матрицы. Чем можно её заменить, т.к. при отладке видно, что p и q не инициализируются. Назначение строки
- Код: Выделить всё
if cardinal(p)>cardinal(q) then p:=q;